diff --git a/Movies_Relocate.groovy b/Movies_Relocate.groovy new file mode 100755 index 0000000..dac967a --- /dev/null +++ b/Movies_Relocate.groovy @@ -0,0 +1,8 @@ +{ +def only_relocate=true +@split/init_relocate.groovy +@split/root_folders.groovy +@split/folder_file.groovy +@split/catch.groovy +@split/functions.groovy +} \ No newline at end of file diff --git a/Movies_Relocate_Rename.groovy b/Movies_Relocate_Rename.groovy new file mode 100755 index 0000000..764eee6 --- /dev/null +++ b/Movies_Relocate_Rename.groovy @@ -0,0 +1,12 @@ +{ +def relocationFrom="Pelis/" +@split/init_relocate.groovy +@split/root_folders.groovy +@split/validations.groovy +@split/video.groovy +@split/audio.groovy +@split/subs.groovy +@split/folder_file.groovy +@split/catch.groovy +@split/functions.groovy +} \ No newline at end of file diff --git a/Movies_Rename.groovy b/Movies_Rename.groovy new file mode 100755 index 0000000..567a1ff --- /dev/null +++ b/Movies_Rename.groovy @@ -0,0 +1,11 @@ +{ +@split/init_newMovies.groovy +@split/root_folders.groovy +@split/validations.groovy +@split/video.groovy +@split/audio.groovy +@split/subs.groovy +@split/folder_file.groovy +@split/catch.groovy +@split/functions.groovy +} \ No newline at end of file diff --git a/filter/catala.groovy b/filter/catala.groovy new file mode 100755 index 0000000..e8b2e75 --- /dev/null +++ b/filter/catala.groovy @@ -0,0 +1,2 @@ +def llengu = {try {def langs=[]; for (lan in languages) langs.add(lan.toString()); return langs } catch(err) {[]}}() +return info.ProductionCountries.contains("ES") && llengu.contains('cat') \ No newline at end of file diff --git a/MaNGranA_Pelis_Organizer.groovy b/old/MaNGranA_Pelis_Organizer.groovy similarity index 56% rename from MaNGranA_Pelis_Organizer.groovy rename to old/MaNGranA_Pelis_Organizer.groovy index 1e3ac9e..a48cc20 100755 --- a/MaNGranA_Pelis_Organizer.groovy +++ b/old/MaNGranA_Pelis_Organizer.groovy @@ -1,16 +1,22 @@ //by @xeviff -/** RUTAS **/ -def ubuntu_desktop=false +/* HARDCODED */ +def skipAudioCheck = true +def show_error_line=true +def ubuntu_desktop=true -def root = ubuntu_desktop ? '/mnt/mangrana_pelis/' : '/pelis/' + +/** RUTAS **/ +def root = '/pelis/' def rutaOK = root+"Pelis/plain/" def ruta = rutaOK def ruta_docu = root+"Documentales/plain/" -def ruta_anime = root+"Pelis_anime/plain/" +def ruta_anime = root+"Pelis_anime/" def ruta_animacion = root+"Pelis_animacion/" def ruta_infantil = root+"Pelis_infantiles/" def ruta_familiar = root+"Pelis_familiar/" def ruta_esp = root+"Pelis_esp/plain/" +def ruta_latina = root+"Pelis_lat/" +def ruta_cat = root+"Pelis_cat/" def ruta_retro = root+"Pelis_retro/plain/" def ruta_estrenos = root+"Pelis_estrenos/plain/" def ruta_classic = root+"Pelis_classic/" @@ -19,28 +25,7 @@ def ruta_asiaticas = root+"Pelis_asiaticas/" def rutaKO = root+"error/" /**********/ -/* HARDCODED */ -def skipAudioCheck = true -def show_error_line=true -/* otras funciones */ -/**/ -def getInicial () { - def nomIngles = localize.English.n - if (nomIngles.startsWith("The ") || nomIngles.startsWith("A ")) - nomIngles = nomIngles.replaceFirst("The ",'').replaceFirst("A ",'') - def ini0 = nomIngles[0].toUpperCase() - def iniClear = nomIngles.size()>1 ? ini0.replaceAll(/[¡¿'#*\(]/,nomIngles[1].toUpperCase()) : ini0 - def inicial = iniClear.replaceAll(/[0-9]/,'#')+'/' - return inicial -} -def normalLang(langs) { - return !langs.isEmpty() ? {try { for (lan in languages) langs.add(lan.toString()) } catch(err) {langs}}() : langs -} -def sanityCheck(newId) { - def oldId = fn.find(/\{tmdb-\d+\}/)?.find(/\d+/) - oldId!=null ? oldId == newId.toString() : true -} //*****************************************************************************************/ //*****************************************************************************************/ //*****************************************************************************************/ @@ -55,52 +40,35 @@ try { //empieza el script else if (ext!="mkv" && ext!="avi" && ext!="mp4") { throw new Exception("[formato_fichero_noestarndar]") } - try { - video - } catch (e) { - throw new Exception("[video_roto]") - } - try { - genres - } catch (err) { - throw new Exception("[genero_no_especificado]") - } /********************************/ - /**************************************/ - /**** Carpeta / tipo contenido *******/ + /*************************************************************************************************************/ + /**** Carpeta / tipo contenido ******************************************************************************/ + /*************************************************************************************************************/ + + //inits def tipoYaSeteado=false - def llengu=[] + def prodCountries=info.ProductionCountries + def certifications=info.Certifications + def numPaises = info.ProductionCountries.size() + def llengu = {try {def langs=[]; for (lan in languages) langs.add(lan.toString()); return langs } catch(err) {[]}}() + def audioLlengu = {try {def langs=[]; for (lan in audioLanguages) langs.add(lan.toString()); return langs } catch(err) {[]}}() //animacion (no concluyente) def tieneAnimacion = genres.any{ it =~ /Anima.i.n/} //familiar (no conclud) def tieneFamiliar = genres.any{ it =~ /Familia|Family/} //docu - def esDocu = genres.any{ it =~ /Documental|Documentary|Reality/} && !localize.English.n.contains("Jackass") - //anime + def esDocu = genres.any{ it =~ /Documental|Documentary|Reality/} && !(localize.English.n =~ /Jackass/) + //Anime ---------- (Animacion encara no es pot perquè depen del infantil) def esAnime = false - def numPaises = info.ProductionCountries.size() - if (tieneAnimacion && info.ProductionCountries.contains("JP")) { - esAnime = numPaises==1 || anime /*|| country=="JP"*/ + if (tieneAnimacion && info.ProductionCountries.contains("JP") && (!llengu.isEmpty() ? llengu.contains('jpn') : true)) { + esAnime = (numPaises==1 || anime || country=="JP") + && ["nemo"].any{!localize.English.n.toLowerCase().contains(it)} } tipoYaSeteado = esDocu || esAnime - //*** española *** - def espanyola = false - if (!tipoYaSeteado && info.ProductionCountries.contains("ES")) { - espanyola= - (numPaises==1 || (numPaises==2 && info.ProductionCountries.any{ it=~/AR|PT/ })) - || { try { info.Network =~ /(?i)\bFLIXOL.\b|\b.?TVE\b/ } catch (e) { false } }() - || { try { info.ProductionCompanies.any{ it =~ /.?TVE|ESDIP|Canal Sur|Canal\+|Telecinco/ } } catch (e) { false } }() - || (info.Certifications.size()==1 && info.Certifications.ES!=null) - || { llengu=normalLang(llengu); llengu.size()==1 && llengu[0]=~/esp|spa/}() - || (movie.alternativeTitles.size()==1 && movie.alternativeTitles.ES!=null) - || (country=="ES" && (!llengu.isEmpty() ? llengu.size()==1 && llengu[0]!="eng" : true)) - tipoYaSeteado = espanyola - } - //***** familiar vs infantil **** def esFamiliar = tieneFamiliar def infantil = false @@ -109,20 +77,23 @@ try { //empieza el script def tieneCertificacion = info.Certifications!=null && info.Certifications.size()!=0 if (tieneFamiliar && tieneAnimacion) { - def noTanInfantil = info.Certifications.US ==~/PG-13/ + def noTanInfantil = info.Certifications.US ==~/PG-13/ && info.Certifications.ES!="7" if (!noTanInfantil) infantil = true } else if (tieneAnimacion) { if (tieneCertificacion) { infantil = info.Certifications.US=="G" || info.Certifications.ES==~/Ai|APTA/ - || info.Certifications.DE==~/0|6/ + || info.Certifications.DE==~/0/ || info.Certifications.IT=="T" + || info.Certifications.IE=="G" || info.Certifications.LT=="V" || info.Certifications.RU ==~ /6.+/ || info.Certifications.BR=="L" + || info.Certifications.NO=="A" + || info.Certifications.FR=="U" } else { - def titulosInfantiles = ['Bonnie bears', 'The Jungle Bunch'] - if (titulosInfantiles.any { localize.English.n.toLowerCase()contains(it.toLowerCase()) }) + def titulosInfantiles = ['boonie bears', 'the jungle bunch'] + if (titulosInfantiles.any { localize.English.n.toLowerCase().contains(it) }) infantil = true } } else if (!esFamiliar) { @@ -132,35 +103,66 @@ try { //empieza el script esFamiliar = true //posem a familiar pelis de nens que no son animacio } } - tipoYaSeteado = esFamiliar || infantil + tipoYaSeteado = tipoYaSeteado || infantil + } + + //animacion + def esAnimacion = tieneAnimacion && !infantil + tipoYaSeteado = tipoYaSeteado || esAnimacion + + //*** española *** + def espanyola = false + def catalana = false + if (!tipoYaSeteado && info.ProductionCountries.contains("ES")) { + espanyola= + (numPaises==1 || (numPaises==2 && prodCountries.any{ it=~/AR|PT/ })) + || { try { info.Network =~ /(?i)\bFLIXOL.\b|\b.?TVE\b/ } catch (e) { false } }() + || ({ try { info.ProductionCompanies.any{it =~ /.?TVE|ESDIP|Canal Sur|Canal\+|Telecinco/}}catch(e){false}}() && llengu.size()==1?llengu[0]=="spa":false) + || (info.Certifications.size()==1 && info.Certifications.ES!=null) + || llengu.size()==1 && llengu[0]=="spa" + || (movie.alternativeTitles.size()==1 && movie.alternativeTitles.ES!=null) + || (country=="ES" && (!llengu.isEmpty() ? llengu.size()==1 && llengu[0]!="eng" : true)) + if (espanyola) catalana = llengu.contains('cat') + tipoYaSeteado = tipoYaSeteado || espanyola } //asiaticas def asiatica = false if (!tipoYaSeteado) { - //asiaticas - if (numPaises>0) { - def paisesAsiaticos = ["CN", "HK", "JP", "KP", "KR", "TH", "NP", "TW", "PH", "MO"] - def languajAsia = ["zho", "kor", "thai", "vie", "jpn", "ind"] - def matchP = paisesAsiaticos.intersect(info.ProductionCountries) - asiatica = matchP.size() == numPaises - || { llengu=normalLang(llengu); languajAsia.intersect(llengu).size() == languajAsia.size() }() - || { llengu.size()==1 && llengu[0]=~/esp|spa/}() - - } + def paisesAsiaticos = ["CN", "HK", "JP", "KP", "KR", "TH", "NP", "TW", "PH", "MO", "IN", "AE", "VN"] + def paisesIntersec=0 + def languajAsia = ["zho", "kor", "tha", "vie", "jpn", "ind", "vie"] + def machingLanguages = languajAsia.intersect(llengu).size() + asiatica = machingLanguages == languajAsia.size() + || paisesAsiaticos.any{ country==it } + || (numPaises != 0 && {((paisesIntersec=paisesAsiaticos.intersect(prodCountries).size()) == numPaises || (/*en observacion*/paisesIntersec!=0 && !llengu.contains('eng')) ) }()) + || (languajAsia.any{audioLlengu.contains(it)} && prodCountries.any{paisesAsiaticos.contains(it)} && llengu.any{languajAsia.contains(it)} ) + || {try {director.contains("Takeshi Kitano")} catch (e) {false}}() + || (machingLanguages > 0 && primaryTitle!=null && localize.English.n!=primaryTitle) + + tipoYaSeteado = tipoYaSeteado || asiatica } - //es animacion - def esAnimacion = tieneAnimacion && !esFamiliar + //*** latina *** + def latina = false + if (!tipoYaSeteado) { + def paisesLatinos = ["MX", "AR"] + latina = {try {paisesLatinos.contains(country)} catch (e) {false}}() + || (numPaises != 0 && paisesLatinos.intersect(info.ProductionCountries).size() == numPaises) + || info.productionCompanies.any{it=~/Corazón Films/} + } + ////////////////////////////////////////////// //tria if (esDocu) ruta = ruta_docu else if (esAnime) ruta = ruta_anime else if (infantil) ruta = ruta_infantil else if (esAnimacion) ruta = ruta_animacion + else if (catalana) ruta = ruta_cat else if (espanyola) ruta = ruta_esp - else if (esFamiliar) ruta = ruta_familiar + else if (latina) ruta = ruta_latina else if (asiatica) ruta = ruta_asiaticas + else if (esFamiliar) ruta = ruta_familiar else if (y<1980) ruta = ruta_classic else if (y<2000) ruta = ruta_retro if (ruta==rutaOK && y>=2021) ruta = ruta_estrenos @@ -169,7 +171,7 @@ try { //empieza el script /*** RESULTADO FINAL ***/ def inicial = (ruta==rutaOK || ruta==ruta_retro) ? getInicial() : '' - def tmdb = ""//" {tmdb-"+tmdbid+"}" + def tmdb = " {tmdb-"+tmdbid+"}" def carpetaPeli = localize.Spanish.plex.name + tmdb + '/' return ruta + inicial + carpetaPeli + fn @@ -212,4 +214,26 @@ try { //empieza el script def resultado = rutaKO + rutaMotivoErr + msgErr + '/' + fn return resultado -} \ No newline at end of file +} + + + +/********************************************************/ +/********************************************************/ +/************** FUNCIONES *******************************/ +/********************************************************/ +/********************************************************/ +def getInicial () { + def nomIngles = localize.English.n + if (nomIngles.startsWith("The ") || nomIngles.startsWith("A ")) + nomIngles = nomIngles.replaceFirst("The ",'').replaceFirst("A ",'') + def ini0 = nomIngles[0].toUpperCase() + def iniClear = nomIngles.size()>1 ? ini0.replaceAll(/[¡¿'#*\(]/,nomIngles[1].toUpperCase()) : ini0 + def inicial = iniClear.replaceAll(/[0-9]/,'#')+'/' + return inicial +} +def sanityCheck(newId) { + def oldId = fn.find(/\{tmdb-\d+\}/)?.find(/\d+/) + return oldId!=null ? oldId == newId.toString() : true +} +/***********/ \ No newline at end of file diff --git a/MaNGranA_Pelis.groovy b/old/pelis.groovy similarity index 82% rename from MaNGranA_Pelis.groovy rename to old/pelis.groovy index 22ea527..94f928b 100755 --- a/MaNGranA_Pelis.groovy +++ b/old/pelis.groovy @@ -1,17 +1,16 @@ //by @xeviff /* HARDCODED */ -def ubuntu_desktop=true -def relocation = true +def relocation = false +def relocationFrom=null def skipAudioCheck = true /*************/ + /** RUTAS **/ - - def root = '/pelis/' -def rutaOK = root+"Pelis/plain/" -def ruta = rutaOK +def ruta2000 = root+"Pelis/plain/" +def ruta = ruta2000 def ruta_docu = root+"Documentales/plain/" -def ruta_anime = root+"Pelis_anime/plain/" +def ruta_anime = root+"Pelis_anime/" def ruta_animacion = root+"Pelis_animacion/" def ruta_infantil = root+"Pelis_infantiles/" def ruta_familiar = root+"Pelis_familiar/" @@ -22,12 +21,9 @@ def ruta_retro = root+"Pelis_retro/plain/" def ruta_estrenos = root+"Pelis_estrenos/plain/" def ruta_classic = root+"Pelis_classic/" def ruta_asiaticas = root+"Pelis_asiaticas/" - def rutaKO = root+"error/" /**********/ -/** Audio (definición) **/ -def hayEAC3=false try { //empieza el script @@ -38,15 +34,7 @@ try { //empieza el script else if (ext!="mkv" && ext!="avi" && ext!="mp4") { throw new Exception("[formato_fichero_noestarndar]") } - //*** Relocate Remux and UHD to Transcode input folder - def peso = bytes.toString().before(' ').toDouble() - def numericBps = (mbps.toString().before(' ').toDouble()*1000000).round() - def es1080 = vf ==~ '1080.' - def es1080Remux = peso > 15 && numericBps >= 18000000 - if (!relocation && (vf ==~ '2160.' || (es1080 && es1080Remux))) return root+"/to Transcode/"+fn - - /* otras validaciones */ - if (relocation && !sanityCheck(tmdbid)) return '@@@@@@ Names Sanity Check KO @@@@@@@ --> New name: '+localize.Spanish.n+' with tmdb='+tmdbid + try { video } catch (e) { @@ -57,6 +45,18 @@ try { //empieza el script } catch (err) { throw new Exception("[genero_no_especificado]") } + + //*** Relocate Remux and UHD to Transcode input folder + def peso = bytes.toString().before(' ').toDouble() + def numericBps = (mbps.toString().before(' ').toDouble()*1000000).round() + def es1080 = vf ==~ '1080.' + def es1080Remux = peso > 15 && numericBps >= 18000000 + if (!relocation && (vf ==~ '2160.' || (es1080 && es1080Remux))) return root+"/to Transcode/"+fn + + /* otras validaciones */ + if (relocation && !sanityCheck(tmdbid)) return '@@@@@@ Names Sanity Check KO @@@@@@@ --> New name: '+localize.Spanish.n+' with tmdb='+tmdbid + + return 'hi' /********************************/ /** Codec Vídeo: en nombre fichero **/ @@ -94,8 +94,7 @@ try { //empieza el script /(?i)\bAMZN?\b|\bNF\b|\bHBO\b|\bHBO.?MAX\b|\bHMAX\b|\bHULU\b|\bA3P\b|\bDPLY\b|\bSTARZ\b|\bFILMIN\b|\bFLMN\b|\bNETFLIX\b|\bDSN.?\b|\bDSP+?\b|\bRTVE\b|\bFLIXOL.\b|\bM\+\b/ ) if (plataforma!=null) plataforma = plataforma.replace("MVPLUS","MV+") formato_distribucion = formato_distribucion+(plataforma!=null?(' '+plataforma.toUpperCase()):'') - } else if (hayEAC3) //por el audio también se determina que es web-dl - formato_distribucion = '¿WEB-DL' + } if (formato_distribucion!='') formato_distribucion=' '+formato_distribucion /**********************************/ @@ -201,7 +200,13 @@ try { //empieza el script /**** Carpeta / tipo contenido ******************************************************************************/ /*************************************************************************************************************/ + //inits def tipoYaSeteado=false + def prodCountries=info.ProductionCountries + def certifications=info.Certifications + def numPaises = prodCountries.size() + def llengu = {try {def langs=[]; for (lan in languages) langs.add(lan.toString()); return langs } catch(err) {[]}}() + //def audioLlengu = {try {def langs=[]; for (lan in audioLanguages) langs.add(lan.toString()); return langs } catch(err) {[]}}() //animacion (no concluyente) def tieneAnimacion = genres.any{ it =~ /Anima.i.n/} @@ -211,9 +216,7 @@ try { //empieza el script def esDocu = genres.any{ it =~ /Documental|Documentary|Reality/} && !(localize.English.n =~ /Jackass/) //Anime ---------- (Animacion encara no es pot perquè depen del infantil) def esAnime = false - def numPaises = info.ProductionCountries.size() - def llengu = normalLang() - if (tieneAnimacion && info.ProductionCountries.contains("JP") && llengu.contains('jpn')) { + if (tieneAnimacion && prodCountries.contains("JP") && (!llengu.isEmpty() ? llengu.contains('jpn') : true)) { esAnime = (numPaises==1 || anime || country=="JP") && ["nemo"].any{!localize.English.n.toLowerCase().contains(it)} } @@ -224,23 +227,23 @@ try { //empieza el script def infantil = false if (!tipoYaSeteado) { - def tieneCertificacion = info.Certifications!=null && info.Certifications.size()!=0 + def tieneCertificacion = certifications!=null && certifications.size()!=0 if (tieneFamiliar && tieneAnimacion) { - def noTanInfantil = info.Certifications.US ==~/PG-13/ && info.Certifications.ES!="7" + def noTanInfantil = certifications.US ==~/PG-13/ && certifications.ES!="7" if (!noTanInfantil) infantil = true } else if (tieneAnimacion) { if (tieneCertificacion) { - infantil = info.Certifications.US=="G" - || info.Certifications.ES==~/Ai|APTA/ - || info.Certifications.DE==~/0/ - || info.Certifications.IT=="T" - || info.Certifications.IE=="G" - || info.Certifications.LT=="V" || info.Certifications.RU ==~ /6.+/ - || info.Certifications.BR=="L" - || info.Certifications.NO=="A" - || info.Certifications.FR=="U" + infantil = certifications.US=="G" + || certifications.ES==~/Ai|APTA/ + || certifications.DE==~/0/ + || certifications.IT=="T" + || certifications.IE=="G" + || certifications.LT=="V" || certifications.RU ==~ /6.+/ + || certifications.BR=="L" + || certifications.NO=="A" + || certifications.FR=="U" } else { def titulosInfantiles = ['boonie bears', 'the jungle bunch'] if (titulosInfantiles.any { localize.English.n.toLowerCase().contains(it) }) @@ -248,7 +251,7 @@ try { //empieza el script } } else if (!esFamiliar) { if (tieneCertificacion && ( - info.Certifications.US=="G" + certifications.US=="G" )) { esFamiliar = true //posem a familiar pelis de nens que no son animacio } @@ -263,13 +266,13 @@ try { //empieza el script //*** española *** def espanyola = false def catalana = false - if (!tipoYaSeteado && info.ProductionCountries.contains("ES")) { + if (!tipoYaSeteado && prodCountries.contains("ES")) { espanyola= - (numPaises==1 || (numPaises==2 && info.ProductionCountries.any{ it=~/AR|PT/ })) + (numPaises==1 || (numPaises==2 && prodCountries.any{ it=~/AR|PT/ })) || { try { info.Network =~ /(?i)\bFLIXOL.\b|\b.?TVE\b/ } catch (e) { false } }() - || { try { info.ProductionCompanies.any{ it =~ /.?TVE|ESDIP|Canal Sur|Canal\+|Telecinco/ } } catch (e) { false } }() + || ({ try { info.ProductionCompanies.any{it =~ /.?TVE|ESDIP|Canal Sur|Canal\+|Telecinco/}}catch(e){false}}() && llengu.size()==1?llengu[0]=="spa":false) || (info.Certifications.size()==1 && info.Certifications.ES!=null) - || llengu.size()==1 && llengu[0]=~/esp|spa/ + || llengu.size()==1 && llengu[0]=="spa" || (movie.alternativeTitles.size()==1 && movie.alternativeTitles.ES!=null) || (country=="ES" && (!llengu.isEmpty() ? llengu.size()==1 && llengu[0]!="eng" : true)) if (espanyola) catalana = llengu.contains('cat') @@ -282,10 +285,12 @@ try { //empieza el script def paisesAsiaticos = ["CN", "HK", "JP", "KP", "KR", "TH", "NP", "TW", "PH", "MO"] def paisesIntersec=0 def languajAsia = ["zho", "kor", "thai", "vie", "jpn", "ind"] - asiatica = (numPaises != 0 && {((paisesIntersec=paisesAsiaticos.intersect(info.ProductionCountries).size()) == numPaises || (/*en observacion*/paisesIntersec!=0 && !llengu.contains('eng')) ) }()) - || languajAsia.intersect(llengu).size() == languajAsia.size() - //|| {try { languages.any{ languajAsia.contains(it.toString()) } } catch (err) {false} }() - //|| matchP.size()>0 && englishAudios.isEmpty() && audio.size()>1 /*en obseracion*/ + asiatica = languajAsia.intersect(llengu).size() == languajAsia.size() + || paisesAsiaticos.any{ country==it } + || (numPaises != 0 && {((paisesIntersec=paisesAsiaticos.intersect(prodCountries).size()) == numPaises || (/*en observacion*/paisesIntersec!=0 && !llengu.contains('eng')) ) }()) + || (languajAsia.any{bloqueAudio.contains(it)} && prodCountries.any{paisesAsiaticos.contains(it)} && llengu.any{languajAsia.contains(it)} ) + || {try {director.contains("Takeshi Kitano")} catch (e) {false}}() + tipoYaSeteado = tipoYaSeteado || asiatica } @@ -294,7 +299,7 @@ try { //empieza el script if (!tipoYaSeteado) { def paisesLatinos = ["MX", "AR"] latina = {try {paisesLatinos.contains(country)} catch (e) {false}}() - || (numPaises != 0 && paisesLatinos.intersect(info.ProductionCountries).size() == numPaises) + || (numPaises != 0 && paisesLatinos.intersect(prodCountries).size() == numPaises) || info.productionCompanies.any{it=~/Corazón Films/} } @@ -307,16 +312,23 @@ try { //empieza el script else if (catalana) ruta = ruta_cat else if (espanyola) ruta = ruta_esp else if (latina) ruta = ruta_latina - else if (esFamiliar) ruta = ruta_familiar else if (asiatica) ruta = ruta_asiaticas + else if (esFamiliar) ruta = ruta_familiar else if (y<1980) ruta = ruta_classic else if (y<2000) ruta = ruta_retro - if (ruta==rutaOK && y>=2021) ruta = ruta_estrenos + if (ruta==ruta2000 && y>=2021) ruta = ruta_estrenos /********************************************/ + //Relocation possible failures + if (relocation && relocationFrom!=null) { + if (!ruta.contains(relocationFrom)) { + ruta = relocationFrom + "to_observe/" + } + } + //**// /*** RESULTADO FINAL ***/ def nombrePelicula_formatoPlex = {try { catalana ? localize.Catalan.n : localize.Spanish.plex.name } catch (err) {localize.Spanish.plex.name} }() - def inicial = (ruta==rutaOK || ruta==ruta_retro) ? getInicial() : '' + def inicial = (ruta==ruta2000 || ruta==ruta_retro) ? getInicial() : '' def tmdb = "{tmdb-"+tmdbid+"}" def carpetaPeli = localize.Spanish.plex.name + ' ' + tmdb + '/' def nomPrincipal = nombrePelicula_formatoPlex + bloqueVideo + bloqueAudio + bloqueSubs @@ -328,11 +340,9 @@ try { //empieza el script } catch (err) { def msgErr = err.getMessage() - if (ubuntu_desktop) { - String str= err.getStackTrace().toString() - def pattern = ( str =~ /groovy.(\d+)./ ) - return " Error at line number = " + pattern[0][1] + ". more: "+msgErr - } + String str= err.getStackTrace().toString() + def pattern = ( str =~ /groovy.(\d+)./ ) + return " Error at line number = " + pattern[0][1] + ". more: "+msgErr def rutaMotivoErr @@ -449,10 +459,6 @@ def getInicial () { def inicial = iniClear.replaceAll(/[0-9]/,'#')+'/' return inicial } -def normalLang() { - def langs=[] - return {try { for (lan in languages) langs.add(lan.toString()); return langs } catch(err) {langs}}() -} def sanityCheck(newId) { def oldId = fn.find(/\{tmdb-\d+\}/)?.find(/\d+/) return oldId!=null ? oldId == newId.toString() : true diff --git a/split/audio.groovy b/split/audio.groovy new file mode 100755 index 0000000..7344489 --- /dev/null +++ b/split/audio.groovy @@ -0,0 +1,39 @@ + /** AUDIO (ejecución) **/ + def bloqueAudio='' + def audiosMap = [:] + for (aud in audio) { + def shortDesc = aud.Language_String3 !=null ? aud.Language_String3 + : aud.Title!=null ? (aud.Title=~/(?i).+spa.+/?'spa': aud.Title.substring(0,3).toLowerCase()) : 'und' + if (aud.Title!=null && aud.Title=~/(?i).*latin.*/) shortDesc='lat' + audiosMap[shortDesc] = audiosMap[shortDesc] ?: [:] + audiosMap[shortDesc][aud.Format] = audiosMap[shortDesc][aud.Format] ?: [] + audiosMap[shortDesc][aud.Format] << aud + } + def groupedAudiosMap = [:] + for (audioElms in audiosMap) { + def k = audioElms.key + def v = audioElms.value + if (!k.contains('+') && countAudiosInMap(v)>1) k += '+' + def mQ = getMaxQuality(v) + def mQstr = (mQ==null || mQ.isEmpty()) ? 'und' : printAudio(mQ) + if (groupedAudiosMap.containsKey(mQstr)) groupedAudiosMap[mQstr].add(k) + else groupedAudiosMap[mQstr] = [k] + } + audiosMap=null + def temp='' + for (audioGroup in groupedAudiosMap) { + def k = audioGroup.key + def v = audioGroup.value + def gS = v.size() + def str='' + for (int i=0; i 0 && primaryTitle!=null && localize.English.n!=primaryTitle) + + tipoYaSeteado = tipoYaSeteado || asiatica +} + + +//*** latina *** +def latina = false +if (!tipoYaSeteado) { + def paisesLatinos = ["MX", "AR"] + latina = {try {paisesLatinos.contains(pais)} catch (e) {false}}() + || (numPaises != 0 && paisesLatinos.intersect(prodCountries).size() == numPaises) + || prodCountries.any{it=~/Corazón Films/} +} + +////////////////////////////////////////////// + //tria +if (esDocu) ruta = ruta_docu +else if (esAnime) ruta = ruta_anime +else if (infantil) ruta = ruta_infantil +else if (esAnimacion) ruta = ruta_animacion +else if (catalana) ruta = ruta_cat +else if (espanyola) ruta = ruta_esp +else if (latina) ruta = ruta_latina +else if (asiatica) ruta = ruta_asiaticas +else if (esFamiliar && y>1970) ruta = ruta_familiar +else if (y<1980) ruta = ruta_classic +else if (y<2000) ruta = ruta_retro +if (ruta==ruta2000) { + if (y>=2021) ruta = ruta_estrenos + else if (y>=2010) ruta += "2010-2020/" + else ruta += "2000-2010/" +} +/********************************************/ + +//---------------------------- +//Relocation possible failures +if (relocation && {try {relocationFrom!=null} catch (err) {false}}()) { + if (!ruta.contains(relocationFrom)) { + ruta = root + relocationFrom + "to_observe/" + } +} +//---------------------------- + +/*** RESULTADO FINAL ***/ +def inicial = (ruta==ruta_retro) ? getInicial() : '' +def tmdb = "{tmdb-"+tmdbid+"}" +def carpetaPeli = localize.Spanish.plex.name + ' ' + tmdb + '/' + +def file +if ({try {only_relocate} catch (err) {false}}()) { + file = fn +} else { + def nombrePelicula_formatoPlex = {try { catalana ? localize.Catalan.n : localize.Spanish.plex.name } catch (err) {localize.Spanish.plex.name} }() + def nomPrincipal = nombrePelicula_formatoPlex + bloqueVideo + bloqueAudio + bloqueSubs + def trackerCatch = fn.find(/(?i)\bHDO(limpo)?\b|\bRedBits\b/) + def tracker = trackerCatch != null ? '['+trackerCatch.replace("HDOlimpo", "HDO")+']' : '' + + file = nomPrincipal + tracker + tmdb +} + +return ruta + inicial + carpetaPeli + file +/////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/split/functions.groovy b/split/functions.groovy new file mode 100755 index 0000000..210faa6 --- /dev/null +++ b/split/functions.groovy @@ -0,0 +1,87 @@ + +/********************************************************/ +/********************************************************/ +/************** FUNCIONES *******************************/ +/********************************************************/ +/********************************************************/ + + +/********* AUDIO *****************/ +def removeLastComa(txt) { + return txt.substring(0, txt.size()-2) +} +def getMaxQuality (mapAudioIndexedByFormat) { + def formatSet = ["PCM", "MLP FBA" ,"DTS", "FLAC", "AC-3", "E-AC-3", "EAC3", "AAC", "MPEG Audio", "MP3"] + for (cFormat in formatSet) { + if (mapAudioIndexedByFormat.containsKey(cFormat)){ + def difChannelsList = mapAudioIndexedByFormat[cFormat] + return difChannelsList.size()==1 ? difChannelsList[0] : getBestChannelFromList(difChannelsList) + } + } + return null +} +def printAudio (audio2Print) { + def format = audio2Print.Format + def fCom = audio2Print.Format_Commercial + switch (format) { + case "AC-3" -> fCom = "DD" + case "E-AC-3" -> fCom = "DD+" + case "MPEG Audio" -> fCom = "MPEG" + case "DTS" -> { if (fCom.contains("Master Audio")) fCom="DTS_MA" + else if (fCom.contains("DTS-HD High Resolution Audio")) fCom="DTS_HRA" + else if (fCom.contains("DTS-ES")) fCom="DTS-ES" + } + case "MLP FBA" -> {def tmp = "D_HD"; if (fCom.contains("Atmos")) tmp+="_Atmos"; fCom = tmp} + } + def canales = audio2Print.Channels.replace(2:'2.0', 6:'5.1', 7:'6.1', 8:'7.1') + return fCom + ' ' + canales +} +def getBestChannelFromList (audiosFormatFound) { + def bestChanel + def currentValue=0 + for (myAudio2 in audiosFormatFound) { + if (myAudio2.Channels>currentValue) { + currentValue = myAudio2.Channels + bestChanel = myAudio2 + } + } + return bestChanel +} +def countAudiosInMap(audMap){ + int count=0 + for (aud in audMap) count += aud.value.size() + return count +} +/********* SUBS ***************/ +def handleSub(sub, capturedSubs) { + def lang = sub.Language_String3 !=null ? sub.Language_String3 + : (sub.Title=~/(?i).+spa.+/?'spa': sub.Title.substring(0,3).toLowerCase()) + if (sub.Title!=null && sub.Title=~/(?i).*latin.*/) lang='lat' + def forced = sub.title!=null ? sub.title.toLowerCase().contains("forzado") : false + if (!capturedSubs.containsKey(lang)) { + capturedSubs[lang] = lang+(forced?' F':'') + } else { + def existing=capturedSubs[lang] + def newTxt=''+existing + if (!existing.contains('+')) newTxt += '+' + if (forced && !existing.contains('F')) newTxt += ' F' + capturedSubs[lang]=newTxt + } +} + +/***********/ +/* otras funciones */ +def getInicial () { + def nomIngles = localize.English.n + if (nomIngles.startsWith("The ") || nomIngles.startsWith("A ")) + nomIngles = nomIngles.replaceFirst("The ",'').replaceFirst("A ",'') + def ini0 = nomIngles[0].toUpperCase() + def iniClear = nomIngles.size()>1 ? ini0.replaceAll(/[¡¿'#*\(]/,nomIngles[1].toUpperCase()) : ini0 + def inicial = iniClear.replaceAll(/[0-9]/,'#')+'/' + return inicial +} +def sanityCheck(newId) { + def oldId = fn.find(/\{tmdb-\d+\}/)?.find(/\d+/) + return oldId!=null ? oldId == newId.toString() : true +} +/***********/ diff --git a/split/init_newMovies.groovy b/split/init_newMovies.groovy new file mode 100755 index 0000000..9fe5d39 --- /dev/null +++ b/split/init_newMovies.groovy @@ -0,0 +1,5 @@ +/* variables */ +def relocation = false +def relocationFrom=null +def skipAudioCheck = false +/*************/ \ No newline at end of file diff --git a/split/init_relocate.groovy b/split/init_relocate.groovy new file mode 100755 index 0000000..5674401 --- /dev/null +++ b/split/init_relocate.groovy @@ -0,0 +1,4 @@ +/* variables */ +def relocation = true +def skipAudioCheck = true +/*************/ \ No newline at end of file diff --git a/split/root_folders.groovy b/split/root_folders.groovy new file mode 100755 index 0000000..13aeebb --- /dev/null +++ b/split/root_folders.groovy @@ -0,0 +1,21 @@ +/** RUTAS **/ +def root = '/pelis/' +def ruta2000 = root+"Pelis/" +def ruta = ruta2000 +def ruta_docu = root+"Documentales/plain/" +def ruta_anime = root+"Pelis_anime/" +def ruta_animacion = root+"Pelis_animacion/" +def ruta_infantil = root+"Pelis_infantiles/" +def ruta_familiar = root+"Pelis_familiar/" +def ruta_esp = root+"Pelis_esp/plain/" +def ruta_latina = root+"Pelis_lat/" +def ruta_cat = root+"Pelis_cat/" +def ruta_retro = root+"Pelis_retro/plain/" +def ruta_estrenos = root+"Pelis_estrenos/plain/" +def ruta_classic = root+"Pelis_classic/" +def ruta_asiaticas = root+"Pelis_asiaticas/" +def rutaKO = root+"error/" +/**********/ + +try { + \ No newline at end of file diff --git a/split/subs.groovy b/split/subs.groovy new file mode 100755 index 0000000..a84495e --- /dev/null +++ b/split/subs.groovy @@ -0,0 +1,17 @@ + /***** subtitulos *******/ + def bloqueSubs + try { + def capturedSubs = [:] + bloqueSubs = '[' + for (int s; s10) break; + handleSub(text[s], capturedSubs); + } + def keysList = capturedSubs.keySet().toList() + for (index in 0..< keysList.size()) { + if (index>3){ bloqueSubs+='etc '; break; } + bloqueSubs += capturedSubs.get(keysList[index]).replace('null','und').replace(" F+","+F").replace("+ F","+F") + ', ' + } + bloqueSubs = removeLastComa(bloqueSubs)+']' + }catch(err){bloqueSubs=''} + /************************/ \ No newline at end of file diff --git a/split/validations.groovy b/split/validations.groovy new file mode 100755 index 0000000..7210803 --- /dev/null +++ b/split/validations.groovy @@ -0,0 +1,32 @@ +/** Tipo de archivo incorrecto **/ +if (ext==~/jpg|nfo|png|url/) { + return fn +} +else if (ext!="mkv" && ext!="avi" && ext!="mp4") { + throw new Exception("[formato_fichero_noestarndar]") +} +//video problems +try { + video +} catch (e) { + throw new Exception("[video_roto]") +} +//no genere +try { + genres +} catch (err) { + throw new Exception("[genero_no_especificado]") +} + +//*** Relocate Remux and UHD to Transcode input folder +def peso = bytes.toString().before(' ').toDouble() +def numericBps = (mbps.toString().before(' ').toDouble()*1000000).round() +def es1080 = vf ==~ '1080.' +def es1080Remux = peso > 15 && numericBps >= 18000000 +if (vf ==~ '2160.' || (es1080 && es1080Remux)) return "/pelis/to_transcode/"+fn + +/* SANITY CHECK */ +if (relocation && !sanityCheck(tmdbid)) + return root + relocationFrom + "to_check_name/" + //return '@@@@@@ Names Sanity Check KO @@@@@@@ --> New name: '+localize.Spanish.n+' with tmdb='+tmdbid +/********************************/ diff --git a/split/video.groovy b/split/video.groovy new file mode 100755 index 0000000..a67d3ba --- /dev/null +++ b/split/video.groovy @@ -0,0 +1,76 @@ + /** Codec Vídeo: en nombre fichero **/ + def codecVideo = (any{vc}{0} =~ /HEVC|265|ATEME/ ) ? 'HEVC' : + (any{vc}{0} =~ /264/) ? 'AVC' : vc + /**************/ + + /******* Calidad ******/ + def calidad = + (vf =~ '2160.') ? //4K + (peso > 30 && numericBps >= 26000000) + ? "UHDRemux" + : (peso > 15) + ? "UHDRip" + : "microUHD" + : es1080 ? //1080 + es1080Remux + ? vf+" BDRemux" + : (numericBps > 8000000) + ? vf + : "microHD" + : vf + def fuente = {try{ source } catch(err){null}}() + if (fuente!=null) calidad = calidad.startsWith("micro") ? calidad : vf + + /***************************/ + /** Formato distribución **/ + formato_distribucion = fuente!=null ? fuente : relocation ? '' : + fn=~/(?i)\bblu.?ray\b|\bbdrip\b/ ? (calidad=~/(?i).+rip/ ? '' : 'BDRip') : + fn=~/(?i)remux/ ? (calidad=~/(?i).+remux/ ? '' : 'BDRemux') : + fn=~/(?i)\bWEB.??(DL|RIP)\b/ ? 'WEB-DL' : + '' + if (formato_distribucion=='WEB-DL') { + def plataforma = fn.find( //coge el contenido que encaja + /(?i)\bAMZN?\b|\bNF\b|\bHBO\b|\bHBO.?MAX\b|\bHMAX\b|\bHULU\b|\bA3P\b|\bDPLY\b|\bSTARZ\b|\bFILMIN\b|\bFLMN\b|\bNETFLIX\b|\bDSN.?\b|\bDSP+?\b|\bRTVE\b|\bFLIXOL.\b|\bM\+\b/ ) + if (plataforma!=null) plataforma = plataforma.replace("MVPLUS","MV+") + formato_distribucion = formato_distribucion+(plataforma!=null?(' '+plataforma.toUpperCase()):'') + } + if (formato_distribucion!='') formato_distribucion=' '+formato_distribucion + /**********************************/ + + /**** HDR ********/ + def hdr_info='' + try{ + def mHDRCol = ["BT.709" : "NO", "BT.2020" : "YES"] + def _HDRMap = ["HDR10": "HDR10", "SMPTE ST 2086": "HDR10", "SMPTE ST 2094 App 4": "HDR10+", "Dolby Vision / SMPTE ST 2086": "Dolby Vision", "Dolby Vision / HDR10": "Dolby Vision",] + def vid = video.first() + String _HDR + switch (bitdepth) { + case { it > 8 }: + _HDR = any + { vid["HDR_Format_Commercial"] } + { vid["HDR_Format"] } + { hdr } + { null } + break + default: + "$bitdepth-bit" + break + } + hdr_info = _HDRMap.find { k, v -> k =~ _HDR }?.value + if (hdr_info!=null) hdr_info=' '+hdr_info + else hdr_info='' + } catch (err) {} + /*****************/ + + /**** Profundidad vídeo ****/ + def myBitrate = 'noBRdef' + try{ myBitrate = mbps.replace(/.0/,'').replace(' Mbps','M') }catch(err){} + def myFps = ' FRvar' + try { myFps = ' '+fps.replace(/.0/,'').replace(' fps','f') }catch(err){} + /***************************/ + + /* BLOQUE VIDEO */ + def bloqueCalidadVideo = calidad + formato_distribucion + def bloqueDescVideo = myBitrate + myFps + hdr_info + def bloqueVideo = ' ['+codecVideo+' '+bloqueCalidadVideo+' '+bloqueDescVideo+']' + /**********************************************************************************************************/ \ No newline at end of file diff --git a/test/anime.groovy b/test/anime.groovy new file mode 100755 index 0000000..79b25aa --- /dev/null +++ b/test/anime.groovy @@ -0,0 +1,10 @@ +def numPaises = info.ProductionCountries.size() +def llengu = {try {def langs=[]; for (lan in languages) langs.add(lan.toString()); return langs } catch(err) {[]}}() +def tieneAnimacion = genres.any{ it =~ /Anima.i.n/} + +def esAnime = false +if (tieneAnimacion && info.ProductionCountries.contains("JP") && (!llengu.isEmpty() ? llengu.contains('jpn') : true)) { + esAnime = (numPaises==1 || anime || country=="JP") + && ["nemo"].any{!localize.English.n.toLowerCase().contains(it)} +} +esAnime \ No newline at end of file diff --git a/test/p1.groovy b/test/p1.groovy new file mode 100755 index 0000000..a00f068 --- /dev/null +++ b/test/p1.groovy @@ -0,0 +1 @@ +def var1 = "/path1/" + y + "/" \ No newline at end of file diff --git a/test/p2.groovy b/test/p2.groovy new file mode 100755 index 0000000..bb27b5b --- /dev/null +++ b/test/p2.groovy @@ -0,0 +1 @@ +return var1 + fn + " - again" \ No newline at end of file