Closed GoogleCodeExporter closed 9 years ago
Time permitting, I'll try to whip something up for this; low priority, no rush
on my part for this one.
The rename is pretty easy with access to the SageAPI. Just pull all the info
out of the media file object, figure out what you have and then construct the
desired file name based on the details available. In Groovy, to get the info,
do something like this:
def mf; // This is the media file object we're working with; we got it above
somehow
def title = ShowAPI.GetShowTitle(mf) // This will always exist
def season = ShowAPI.GetShowSeasonNumber(mf) // Will be 0 if not avaiable
def episode = ShowAPI.GetShowEpisodeNumber(mf) // 0 if not available
def subtitle = ShowAPI.GetShowEpisode(mf) // "" if not available
// This is a long winded approach to computing the file name, but
// should be easier to read this code and follow along
def targetFileName = title // Always start with the title
if(season > 0 && episode > 0) // We have episode data, use it
targetFileName += " - " + String.format("S%2dE%2d", season, episode)
else if(subtitle != "") // We have a subtitle, use it instead
targetFileName += " - " + episode
else // We have no info, not sure what you want to do here??
targetFileName += " - UNKNOWN"
targetFileName += ".ts" // Use commons FilenameUtils to actually figure out the
ext
// Finally, strip invalid chars from the file name
targetFileName = (targetFileName =~ /[\/\\\*\?<>\":|]+/).replaceAll("")
// Here, I'm just printing the final result, but this is your new file name
println targetFileName
This is a simplistic example, with some corners cut. I'll fill in the gaps
when I do the whole thing, but if you wanted to play around yourself, this code
shows the basic idea on how to compute the desired file name.
NOTE: Code example here may contain slight syntax errors, etc. Shouldn't be
much to correct once you get this example inside an IDE.
Original comment by de...@battams.ca
on 21 Mar 2011 at 3:56
Well, I started to 'play around' but I'm way out of my depth here.... what I
did was copy this to a test.groovy script, create a new task for the client
on the server that's got the executable listed as script:rename_test.groovy
and the exec args same as in the comskip example, assuming that's the file
location/name. The log shows the result as " - UNKNOWN.ts " which I see as
the 'no data available' name. When I look at the test file in bmt it shows
both season and episode #'s so something's not working in the logic and I've
no idea what I'm doing, much less what I'm doing wrong. Any suggestions?
Thanks in advance.
Original comment by bikesquid@gmail.com
on 27 Mar 2011 at 5:18
Let's see your example script... unfortunately, this ticket really isn't on my
radar - lots of other Sage things I'm working on when Sage dev time is
available. If you show me what you have I'll take a quick look and see if I
see something obvious.
Original comment by de...@battams.ca
on 27 Mar 2011 at 10:02
I understand it's priority is off the bottom of the list, no worries, any
suggestions to nudge me in the right direction appreciated. Recently bmt
stopped writing .properties files and that's what I was using to pull the info
via a batch file and a lot of stumbling. I've tried a few things with your
provided info as well as the sjq4Metadata info I found
here:http://code.google.com/p/sagetv-addons/wiki/Sjq4Metadata , but the result
is I'm unable to get the ShowAPI.GetShow___ to return anything. Using your
script example above, I simply cut and pasted into file_rename.groovy, exactly
as above. Under client in the UI I create a new task called filerename with the
attached screen prints showing the task details and the resulting log.
When I shorten the script to just:
def mf; // This is the media file object we're working with; we got it above
somehow
def title = ShowAPI.GetShowTitle(mf) // This will always exist
println title
I'd expect the log to show the last line being the title, but get nothing. I'm
sure I'm doing something wrong and it's blindingly obvious to to someone in the
know...
Original comment by bikesquid@gmail.com
on 28 Mar 2011 at 3:11
Attachments:
Ok, the problem is you're not actually getting the media file object to work
with.
Object mf; // We get it from somewhere above
This is my shorthand for "yeah, we need to actually fill in this object, but
for this code example I'm leaving out the details to simplify the example code."
Leaving everything you have setup exactly as is, replace this:
Object mf;
with this in your 3 line script from above:
def mf = MediaFileAPI.GetMediaFileForID(SJQ4_METADATA["SJQ4_ID"].toInteger())
Now mf actually holds the reference to the media file object and so getting the
title should now work. Once you verify that works then add back in the rest of
the metadata fetching as per my example above.
There is one _very_ important step that _must_ be followed... When you queue up
these tasks to run, you must do so by going to the media file details screen in
the UI and then selecting the "Add SJQ task" from that menu. Doing so means
the metadata for the task is properly filled in. If you just manually queue
the task from the SJQ setup menu then the task will have no metadata and the
media file lookup will fail.
Let me know if you have anymore questions.
Original comment by de...@battams.ca
on 28 Mar 2011 at 3:31
OK, that's got me in the right direction, now I'm getting "title - S 1 E 7.ts"
which is close. I'll try adding another test for >10 vs <10 so formatting of
numbers will be correct, but how do I actually rename the file? I've been
looking through all the script examples and docs I can find and nothing on any
only thing I can find is DeleteFile...but it couldn't be that easy....
Original comment by bikesquid@gmail.com
on 28 Mar 2011 at 2:56
Even better, change this to:
targetFileName += " - " + String.format("S%2dE%2d", season, episode)
this:
targetFileName += " - " + String.format("S%02dE%02d", season, episode)
That will zero pad the numbers, if necessary. Should do what you want without
the extra code. :)
Original comment by de...@battams.ca
on 28 Mar 2011 at 4:07
Sweet! Will that pad only to two decimal places, i.e. <10?
I don't want NOVA - S035E015
How do I tell it to do the rename once I've got the name right?
Original comment by bikesquid@gmail.com
on 28 Mar 2011 at 7:40
It will only pad to 2 digits.
S1E3 will become S01E03, but S10E22 will remain S10E22.
Renaming the file is a little tricky...
First you have to figure out how many segments you have (i.e. Show-0.mpg,
Show-1.mpg, etc.). If you assume there can only ever be one then that
simplifies things (but you may run into trouble if this doesn't always end up
being the case).
Then for each segment, you need to rename it. So if your file name ends up
being:
NOVA - S03E15.ts, but there is more than one segment, you actually want these
files:
NOVA - S0315-0.ts
NOVA - S0315-1.ts
And so on... I leave this case as an exercise for the reader. :) I just don't
have time to sit and think about this case right now.
If there's only one segment then it's really easy to rename the file:
import org.apache.commons.io.FileUtils // Put this line towards top of script
def parentDir = MediaFileAPI.GetParentDirectory(mf)
FileUtils.moveFile(MediaFileAPI.GetSegmentForFile(0), new File(parentDir,
newTitle))
// I'm assuming newTitle is the variable that holds the new title of the file,
sub
// as needed
// I'm also assuming you want to keep the file in the same dir; replace
parentDir
// as needed
Also, you need to determine the proper file extension (unless every recording
you do is actually .ts). I'm also cutting a lot of corners and error checking
with these code examples. If I handled the error conditions then I might just
as well write it all now, which I really don't have time for at the moment. :)
Good luck.
Original comment by de...@battams.ca
on 28 Mar 2011 at 7:57
Correction: Replace GetSegmentForFile with GetFileForSegment
Original comment by de...@battams.ca
on 28 Mar 2011 at 7:59
This is what I needed to explore some more. Thanks. Don't mean to hijack your
time, really appreciate the help you've made time to fit in. I'll think on the
multiple segments issue but that only happens when things go really pear shaped
and is way, way over my ability to resolve. My batch file that worked with
.properties was just shy of 200 lines so I know error checking is much harder
to noodle through than it seams. I was starting to get comfortable with sjq3
when it all changed on me, so I'll leave it stupid-simple and just get the
basics working till either I figure out what I'm doing or..., well I'll do my
best to figure it out without bothering further.
cheers.
Original comment by bikesquid@gmail.com
on 29 Mar 2011 at 4:07
I think I've got the majority sorted and have an idea of what I need to do, but
I'm running into an error that I can't sort without a nudge.
Original comment by bikesquid@gmail.com
on 30 Mar 2011 at 6:28
Attachments:
MediaFileAPI.GetFileForSegment(0) should be:
MediaFileAPI.GetFileForSegment(mf, 0)
Original comment by de...@battams.ca
on 30 Mar 2011 at 11:51
That did it!
Now that the base works I'll work to modify as suits my needs.
Thanks.
Original comment by bikesquid@gmail.com
on 30 Mar 2011 at 2:26
I think you've got through this on your own and don't need me to write this
anymore? Marking as WontFix.
Original comment by de...@battams.ca
on 3 May 2011 at 12:44
Original issue reported on code.google.com by
bikesquid@gmail.com
on 18 Mar 2011 at 3:56