Page 1 of 1

"The" lookup/rename bug

Posted: 03 Nov 2015, 17:19
by kim
Using amc -non-strict, if you change seriesFormat = {n}
to any of this, it will get the naming ok, BUT it will get wrong fanart and nfo file from different show

Code: Select all

tvs:   any{ seriesFormat }{ '''TV/{n.replaceFirst(/^(?i)(The|A|An)\\s(.+)/, /$2, $1/).replace(':', ' - ').trim()}/{n.replaceTrailingBrackets().trim().space('.')}{'.'+s00e00}{'.'+t.space('.').replaceAll(/[!?.]+$/).replacePart('(Part.$1)')}{'-'+group}{'.'+lang}''' },
The Avengers => Avengers, The

{n.sortName()}
{n.replaceFirst(/^(?i)(The|A|An)\s(.+)/, /$2, $1/)}

try it out with e.g. The.Librarians.S02E01


it makes a lookup only for:
http://thetvdb.com/api/GetSeries.php?se ... anguage=en

NOT
http://thetvdb.com/api/GetSeries.php?se ... anguage=en

Re: "The" lookup/rename bug

Posted: 03 Nov 2015, 17:32
by rednoah
That's why it says:
NOTE: If you mess up the filename like this, FileBot and HTPC software may have trouble making sense of the filename in the future.
You can either make sure that files are named properly, or that xattr metadata is supported and working on the relevant file system.

Re: "The" lookup/rename bug

Posted: 03 Nov 2015, 18:07
by kim
but its only part of it that it gets wrong

why does it lookup in 2 dif. ways ?

cant it just do the rename part last ?

or check to see if there is a ", The" ?

plus i only rename the folder NOT the file, so it still has every chance at a correct lookup

Re: "The" lookup/rename bug

Posted: 04 Nov 2015, 01:12
by rednoah
The artwork.tmdb script expects files to be organized a certain way:
Movies are expected to be organized into folders. The movie is determined using the name of the parent folder of each video file.
It also expects movies to be organized into folder, one movie per folder. FileBot has 2 different ways of doing almost everything, strict and non-strict mode that is, but once you mess with the filename things might get odd either way. I'd try removing the ", The" part at the end and see if that works better.

As I said, FileBot will *try* to store full metadata for each file in the filesystem, and it will *try* to use previously stored metadata to identify the files, so the question you should be asking is why "Why are Extended Attributes not working?".

Re: "The" lookup/rename bug

Posted: 05 Feb 2016, 00:13
by kim
Still using amc and xattr = OFF

In order to use:
The Avengers => Avengers, The
{n.sortName()}
{n.replaceFirst(/^(?i)(The|A|An)\s(.+)/, /$2, $1/)}

I'm trying to make a PreRename.groovy script
that looks for FOLDERS with "Avengers, The" and rename it to "The Avengers"
so I can use the amc script with e.g. {n.replaceFirst(/^(?i)(The|A|An)\s(.+)/, /$2, $1/)} again

1. Get FOLDERS ONLY (from args.getFolders() ?)
2. If e.g. "Avengers, The" rename to "The Avengers" using something like (?:(.+)(?:[,]\s)([Tt]he|[Aa]|[Aa]n)$)
3. Don't do anything to folders that have ", A" or ", An" or ", The"
4. Do this OFFLINE ONLY

Can you/anyone help pls ???



btw: i made a script that +1 the Season for American Dad! (so it match the TheTVDB season)

Code: Select all

args.getFiles{ it.isVideo() }
.each {
rename(file:it, format:"{n==~'American Dad!' ? n+' S'+(episode.season ? s+1 : 1).pad(2)+'E'+e.pad(2): fn}")
}

Re: "The" lookup/rename bug

Posted: 05 Feb 2016, 09:43
by rednoah
Rename Avengers, The to The Avengers:

Code: Select all

def e = /^(.+), (The|A|An)$/
def r = /$2 $1/

rename(
	map: args.getFolders().findAll{ it ==~ e }.collectEntries{ [it, it.name.replaceFirst(e, r)] }
)

Rename Alias 1x01 to Alias 2x01:

Code: Select all

def offset = [season: +1, episode: 0]

def p = /(\d{1,2})(\D)(\d{2})/
def r = { m, s, x, e -> ((s as int) + offset.season) + x + ((e as int) + offset.episode).pad(2) }

rename(
	map: args.getFiles().findAll{ parseEpisodeNumber(it) != null }.collectEntries{ [it, it.name.replaceFirst(p, r)] }
)

Re: "The" lookup/rename bug

Posted: 06 Feb 2016, 02:43
by kim
nice THX, that would have taken me weeks to do if ever :)

any chance to help with how to use a show filter (n==~'American Dad!') in the: ???

Code: Select all

def offset = [season: +1, episode: 0]

def p = /(\d{1,2})(\D)(\d{2})/
def r = { m, s, x, e -> ((s as int) + offset.season) + x + ((e as int) + offset.episode).pad(2) }

rename(
   map: args.getFiles().findAll{ parseEpisodeNumber(it) != null }.collectEntries{ [it, it.name.replaceFirst(p, r)] }
)

Re: "The" lookup/rename bug

Posted: 06 Feb 2016, 09:40
by rednoah
Something like this?

Code: Select all

args.getFiles().findAll{ it =~ /American.Dad/ }

Re: "The" lookup/rename bug

Posted: 06 Feb 2016, 14:10
by kim
thx, but I don't get where to put it in the code ?

can it take a list (if i need) ?
this the right way ?

Code: Select all

args.getFiles().findAll{(it =~ /(?i)American.Dad/||it =~ /(?i)Other.Show/)

EDIT: This looks like it works

Code: Select all

def offset = [season: +1, episode: 0]

def p = /(\d{1,2})(\D)(\d{2})/
def r = { m, s, x, e -> ((s as int) + offset.season) + x + ((e as int) + offset.episode).pad(2) }

rename(
map: args.getFiles().findAll{it =~ /American.Dad/ && parseEpisodeNumber(it) != null }.collectEntries{ [it, it.name.replaceFirst(p, r)] }
)

Re: "The" lookup/rename bug

Posted: 06 Feb 2016, 15:49
by rednoah
You can use any code that returns true/false as findAll{} so you can use || or but doing that in the regex right away is easier:

Code: Select all

args.getFiles().findAll{ it =~ /(?i:American.Dad|Other.Show)/ }.findAll{ parseEpisodeNumber(it) != null }

Re: "The" lookup/rename bug

Posted: 06 Feb 2016, 16:57
by kim
thx
btw i think i found an "error" in your script when trying to do the reverse "Rename Avengers, The to The Avengers:"

Code: Select all

.findAll{it ==~ e }
should be 
.findAll{it.name ==~ e }

Code: Select all

// Move The|A|An to the FRONT from the BACK
def e = /^(The|A|An)\s(.+)$/
def r = /$2, $1/

rename(
   map: args.getFolders().findAll{it.name ==~ e }.each{println "FOUND: $it.name"}.collectEntries{ [it, it.name.replaceFirst(e, r)] }
)

Re: "The" lookup/rename bug

Posted: 06 Feb 2016, 17:09
by rednoah
Good point. You'll want to do matches exactly ==~ the file.name, not the whole file path.

Re: "The" lookup/rename bug

Posted: 13 Jun 2016, 20:29
by kim
can you explain what makes it offline only ?

I'm trying do make this offline only:
args.getFiles{ it.isVideo() }
.each{println "FOUND: $it.name in $it.parentFile.parentFile --> $it.parentFile.parentFile.name.$it.extension"
rename(file:it, format:"{file.parentFile.parentFile}/{file.parentFile.parentFile.name}")
}

this almost works (move 1 dir up part missing):
def String input = ''
def String output = ''

rename(map: args.getFiles{ it.isVideo() }
.each{input=it.name; println "FOUND: $it.name in $it.parentFile.parentFile --> $it.parentFile.parentFile.name.$it.extension"
output = it.parentFile.parentFile.name+'.'+it.extension
}
.collectEntries{ [it, it.name.replaceFirst(input, output)] }
)

Re: "The" lookup/rename bug

Posted: 13 Jun 2016, 21:21
by rednoah
You can pass in a File->File map: rename(map: Map<File,File>)

But if you really just want to move/rename files then you can just do it directly File.renameTo(File) without any of the FileBot-specific APIs.

Re: "The" lookup/rename bug

Posted: 16 Jun 2016, 13:53
by kim
1. if this "You can pass in a File->File map: rename(map: Map<File,File>)"
answers "can you explain what makes it offline only"...

then I don't get it... can you dumb it down, pls ?

2. don't think I can use "File.renameTo(File)"
I need the ".isVideo()" part

3. Is there a way I can use the GUI to test script proper without F*ing it up like this:
"{def String input = ''; def String output = ''; file.getFiles{ it.isVideo() }.each{input=it.name; output = it.parentFile.parentFile.name+'.'+it.extension }.collectEntries{ [it, it.name.replaceFirst(input, output)] } }"

Re: "The" lookup/rename bug

Posted: 16 Jun 2016, 14:24
by rednoah
1.
If you pass in a map of files, then it will just rename files accordingly. There will be no online lookups of any kind.

2.
Does one have anything to do with the other?

3.
Press F5 to open the Groovy pad. Also, why would you not use newlines? It's quite unreadable. I'm not sure what it's supposed to do, but I'm sure there's a more elegant solution. :D


PS: I'm talking about Groovy scripting. I'm not talking about FileBot format expressions. In case there's a confusion here.


EDIT:

If this is a one-off problem, then I'd just do it with the GUI:
viewtopic.php?f=3&t=2072

Re: "The" lookup/rename bug

Posted: 16 Jun 2016, 19:30
by kim
I have seen "Groovy pad" before, but ever used, because I don't know how to ?

If I try to run e.g.
args.getFiles{ it.isVideo() }
.each{println "FOUND: $it.name in $it.parentFile.parentFile --> $it.parentFile.parentFile.name.$it.extension"
rename(file:it, format:"{file.parentFile.parentFile}/{file.parentFile.parentFile.name}")
}

I get only "Result: []"

how to pass args to it ?
file = No such property: file for class: Script57
and so on... ?
it's like it has nothing to do with filebot, only "vanilla" groovy/java code ?


I need a visual way to show instant results in order to make scripts via the "trial and error" way (my way)

Re: "The" lookup/rename bug

Posted: 17 Jun 2016, 05:06
by rednoah
Step 1:

Code: Select all

println args
Result: Oh, it's empty by default because I'm not using the command-line to pass in arguments.


Step 2:

Code: Select all

def args = ['/path/to/folder' as File]
println args
Result: Ok, not empty anymore!


Step 3:

Code: Select all

def args = ['/path/to/folder' as File]
args.getFiles{ it.isVideo() }.each{
	println it
}
Result: Ok, selecting video files works.



I'll leave the rest up to you. ;)