This may not be for everyone... But this is basically my Super Beast Script.
Code: Select all
{def sA={c,d->try{def v=c();v==null?d:v}catch(e){d}}
def nrm={s->s?.toString()?.toUpperCase()?.replaceAll(/[.\s]+/,' ')?.trim()?:''}
def title=sA({n?.toString()},''),year=sA({y},''),fnRaw=sA({fn},''),tagsList=sA({tags},[]),collectionRaw=sA({collection?.toString()},'')
def cT={s->s?.replaceFirst(/^(?i)(The|A|An)\s+(.+)/,'$2, $1')?.replaceAll('[:/\\\\\\?*"<>|]','-')?.replaceAll(/\s*-\s*/,' - ')?:''}
def collectionSort=cT(collectionRaw)
def cleanFn=fnRaw.replaceAll(/[-~\s]+$/,'')
def rg=(cleanFn=~/(?i)-([^-\s~]+(?:\s+[^-\s~]+)*)$/)?(cleanFn=~/(?i)-([^-\s~]+(?:\s+[^-\s~]+)*)$/)[0][1]:null
def g2=rg?.replaceAll(/[\[\]]/,'')?.with{it=='null'?null:it},grpTag=g2?"[${g2}]":""
def vH=sA({video?.height instanceof List?video?.height.find{it}:video?.height},null),vcRaw=sA({vc},'').toString().toUpperCase()
def isReal4K=(sA({vf},'')=='2160p')||sA({hd},'').toString().toUpperCase().contains('UHD')||((vH?.toString()?.isNumber())?(vH as int)>=2160:false)
def codecB=(vcRaw=~/AV1/)?'AV1':(vcRaw=~/HEVC|265/)?'x265':(vcRaw=~/AVC|264/)?'x264':(vcRaw=~/VP9/)?'VP9':(vcRaw=~/VC[\s\-]?1/)?'VC1':(vcRaw=~/XVID|DIVX/)?'XviD':(vcRaw=~/MPEG[\s\-]?2/)?'MPEG2':''
def dL='N',root="${dL}:/"+(codecB=='AV1'?"Movies (AV1)":(isReal4K?"Movies 4K":"Movies (${codecB?:'Other'})"))
def azF=sA({az?.toString()?.with{it=='null'?'':it}},''),colF=collectionSort&&collectionSort!='null'?collectionSort:'',ciT=sA({ci?"[$ci]":''},'')
def fnTagMatcher=(fnRaw=~/(?i)\b(EXTENDED|THEATRICAL|UNRATED|REMASTERED|SPECIAL\.?EDITION|COLLECTOR'?S\.?EDITION|DC|DIRECTORS?\s?CUT|CRITERION(?:\s+COLLECTION)?|KINO(?:\s+LORBER)?|ANNIVERSARY|DIAMOND|PLATINUM|SIGNATURE|STEELBOOK|DIGIBOOK|MEDIABOOK|LIMITED|ULTIMATE|COMPLETE|FULLSLIP|LENTICULAR|BOXSET)\b/)
def fnTags=[];fnTagMatcher.each{fnTags<<nrm(it[1]).replaceAll(/DIRECTORS? CUT/,'DC')}
def mTags=sA({tagsList},[]).collect{nrm(it)}.collect{it.replaceAll(/DIRECTORS? CUT/,'DC')}
def iR4K=(fnRaw=~/(?i)\b4K[\s._-]*Remaster(?:ed)?\b/)
def aTags=(fnTags+mTags).findAll{it&&!(iR4K&&it=='REMASTERED')}.unique()
def tagFld=aTags?aTags.collect{" [$it]"}.join(''):''
def dT=aTags.collect{t->t=='CRITERION'?'Criterion':t=='KINO'?'Kino':t=='KINO LORBER'?'Kino.Lorber':t}
def tagFil=dT?dT.collect{it.replaceAll(' ','.')}.join('.'):''
def titleYrBase=(title&&year)?"${title} (${year})${tagFld}":(title?title+tagFld:(year?"(${year})${tagFld}":''))
def titleYr=(ciT?ciT+' ':'')+titleYrBase
def tLS=sA({tagsList},[]).toString().toUpperCase()
def rep=(fnRaw.toUpperCase().contains('REPACK')||(g2&&g2.toUpperCase().contains('REPACK'))||tLS.contains('REPACK'))
def repTag=rep?' [REPACK]':'',repFilTag=rep?'REPACK':'',isRemux=fnRaw?.toLowerCase()?.contains('remux')||tLS.contains('REMUX')
def remuxTag=isRemux?'[REMUX]':'',remuxFilTag=isRemux?'REMUX':'',fN=fnRaw
def vfB=sA({vf},''),hdRaw=sA({hd?.toString()},''),is4K=(vfB=='2160p'||hdRaw.toUpperCase().contains('UHD'))
def src4kLbl=(fN=~/(?i)\b4K[\s._-]*RESTOR/)?'4K.RESTORATION':iR4K?'4K.REMASTER':(fN=~/(?i)\bHYBRID\b/)?'HYBRID':(fN=~/(?i)\bfrom[\s._-]*4K\b/)?'4K.SOURCE':''
def is4KSource=src4kLbl&&!is4K,src4kFldTag=is4KSource?"[${src4kLbl.replaceAll(/\./,' ')}]":'',src4kFilTag=is4KSource?src4kLbl:''
def genB=sA({"[$genre]"},''),aTit=sA({n?.toString()?.replaceAll(/,/,'')?.replace(':',' - ')?.replace('/',' - ')?.replaceAll(/[\\?*"<>|]/,'')},''),aTitPer=(aTit&&year?"${aTit} ${year}":(aTit?:year?:'')).replaceAll(/ - /,'.-.').replaceAll(/ /,'.')
def uhd4kFil=is4K?'4K.UHD':'',uhd4kFld=is4K?'[4K]':''
def hdrRaw=sA({hdr?.toString()},''),doviRaw=sA({dovi?.toString()},'')
def compatRaw=sA({video?.HDR_Format_Compatibility?.toString()?.toUpperCase()},'')
def hdrFallback=(hdrRaw=='HDR10+'||compatRaw.contains('HDR10+'))?'HDR10+':((hdrRaw=='HDR10'||(compatRaw.contains('HDR10')&&!compatRaw.contains('HDR10+')))?'HDR10':(hdrRaw=='HDR'?'HDR':''))
def hdrT=doviRaw?('DV'+(hdrFallback?'.'+hdrFallback:'')):(hdrFallback?hdrFallback:(codecB=='x264'?'':'SDR'))
def bitdRaw=sA({bitdepth?.toString()},''),bitdB=(bitdRaw.isNumber()&&bitdRaw.toInteger()==10&&(hdrT=='SDR'||hdrT=='HDR'))?'10bit':''
def aT=sA({audio instanceof List?audio.find{it}:audio},null)
def aCom=sA({aT?.Format_Commercial?.toString()?.toUpperCase()},''),aFP=sA({aT?.Format_Profile?.toString()?.toUpperCase()},'')
def aCodec=aCom.contains('DTS-HD MASTER')?'DTS-HD MA':aCom.contains('DTS:X')||aFP.contains('X / MA')?'DTS:X':aCom.contains('DTS-HD')?'DTS-HD':aCom.contains('DTS')?'DTS':aCom.contains('TRUEHD')?'TrueHD':(aCom.contains('EAC')||aCom.contains('DIGITAL PLUS'))?'EAC3':aCom.contains('DOLBY DIGITAL')?'AC3':sA({ac?.toString()?.toUpperCase()?.replaceAll(/\s+/,'.')},'')
def aChan=sA({channels?.toString()},'')
def aFmt='';if(!['DTS-HD MA','DTS-HD','DTS:X','TrueHD'].contains(aCodec)){def acV=sA({acf?.toString()},'').toUpperCase();['DDP':'DDP','DD+':'DDP','EAC3':'EAC3','AC3':'AC3','DTS':'DTS','DD':'DD','AAC':'AAC'].each{k,v->if(!aFmt&&acV.contains(k))aFmt=v};if(aFmt&&aCodec&&aCodec.toUpperCase().replaceAll(/[^A-Z0-9]/,'').contains(aFmt.toUpperCase().replaceAll(/[^A-Z0-9]/,'')))aFmt=''}
def aAtmos='';def atmosTag='';try{def aC=sA({audio?.findResults{it?.Format_Commercial}},[]);def aP=sA({audio?.findResults{it?.Format_Profile}},[]);if((aC+aP).find{it=~/(?i)Atmos/}){aAtmos='Atmos';atmosTag='[ATMOS]'}}catch(e){}
def grpHyp=g2?"-${g2}":'',fC=fnRaw.replaceAll(/\.[^.]*$/,'').replaceAll(/ /,'.')
def skip=['FHD','HD','UHD','4K','1080P','2160P','720P','480P','SDR','HDR','HDR10','HDR10+','DV','10BIT','REMUX','REPACK','HYBRID','RESTORATION','EXTENDED','THEATRICAL','UNRATED','REMASTERED','DC']
def mRx=(fC=~/(?i)\b(1080p|2160p|720p|480p)\b/),srcFldTag='',srcFilTag='',relFldTag='',relFilTag=''
if(mRx){def res=mRx[0][1];def idx=fC.indexOf(res);def aft=idx!=-1?fC.substring(idx+res.length()):'';def srcK=['WEB-DL','WEBDL','WEB','BluRay','WEBRip','HDTV','DVD','BDRip','BRRip','HD-DVD'];def bI=Integer.MAX_VALUE;def bS=null;for(sk in srcK){def p=aft.toUpperCase().indexOf(sk.toUpperCase());if(p!=-1&&p<bI){bI=p;bS=sk}};if(bS){srcFldTag="[${bS}]";srcFilTag=bS;def raw=aft.substring(0,bI).replaceAll(/[._-]+$/,'');def keep=raw.split(/[._-]+/).findAll{it&&!skip.contains(it.toUpperCase().replaceAll(/\+/,''))};def rG=keep?keep.join('.'):'';if(rG){relFldTag="[${rG.replaceAll(/\./,'-')}]";relFilTag=rG}}}
if(srcFldTag){def s=srcFldTag.replaceAll(/[\[\]]/,'');if(s==~/(?i)WEB-?DL|^WEB$/){srcFldTag='[WEB-DL]';srcFilTag='WEB-DL'};if(s==~/(?i)BLURAY/){srcFldTag='[BluRay]';srcFilTag='BluRay'};if(s==~/(?i)WEBRIP/){srcFldTag='[WEBRip]';srcFilTag='WEBRip'};if(s==~/(?i)BDRIP/){srcFldTag='[BDRip]';srcFilTag='BDRip'};if(s==~/(?i)BRRIP/){srcFldTag='[BRRip]';srcFilTag='BRRip'}}
def isShout=(collectionRaw=~/(?i)Shout\s*Factory/)||tLS.contains('SHOUT FACTORY')||(fnRaw=~/(?i)Shout\s*Factory/)
def shoutFolderTag=isShout?'[Shout Factory]':''
def fldExP=[];fldExP<<titleYr;if(repTag)fldExP<<repTag;if(remuxTag)fldExP<<remuxTag;if(relFldTag)fldExP<<relFldTag;if(src4kFldTag)fldExP<<src4kFldTag;if(srcFldTag)fldExP<<srcFldTag;if(vfB)fldExP<<"[${vfB}]";if(uhd4kFld)fldExP<<uhd4kFld;if(hdrT)fldExP<<"[${hdrT}]";if(aCodec)fldExP<<"[${aCodec}]";if(aChan)fldExP<<"[${aChan}]";if(atmosTag)fldExP<<atmosTag;if(grpTag)fldExP<<grpTag;if(genB)fldExP<<genB;if(shoutFolderTag)fldExP<<shoutFolderTag
def fldName=fldExP.findAll{it&&it!=''}.join(' ').replaceAll(/ +/,' ').trim()
def relExtras=relFilTag?relFilTag.split('\\.').flatten().findAll{it}*.replaceAll(/\.+/,''):[]
def fnParts=[aTitPer?:''];if(tagFil)fnParts<<tagFil;if(repFilTag)fnParts<<repFilTag;if(remuxFilTag)fnParts<<remuxFilTag;if(vfB)fnParts<<vfB;if(uhd4kFil)fnParts<<uhd4kFil;fnParts+=relExtras;if(src4kFilTag)fnParts<<src4kFilTag;if(srcFilTag)fnParts<<srcFilTag;if(hdrT)fnParts<<hdrT;if(codecB)fnParts<<codecB;if(bitdB)fnParts<<bitdB;if(aCodec)fnParts<<aCodec;if(aFmt)fnParts<<aFmt;if(aChan)fnParts<<(aChan+'CH');if(aAtmos)fnParts<<aAtmos
def nP={p->p?.toString()?.trim()?.replaceAll(/^\.+|\.+$/,'')?.replaceAll(/ +/,' ')?:''}
def fName=(fnParts.collect{nP(it)}.findAll{it}.join('.').replaceAll(/\.{2,}/,'.').replaceAll(/^\.+|\.+$/,'')?:'')+grpHyp
def sC={s->s?.replaceAll(/:/,' ')?.replaceAll(/[?!|]/,'')}
fldName=sC(fldName);fName=sC(fName);colF=sC(colF);azF=sC(azF)
return [root,azF,colF,fldName,fName].findAll{it&&it!=''}.join('/')}