1
0
mirror of https://github.com/mitb-archive/filebot synced 2024-12-24 08:48:51 -05:00
filebot/website/scripts/artwork.tvdb.groovy

133 lines
4.3 KiB
Groovy
Raw Normal View History

// filebot -script "http://filebot.sf.net/scripts/artwork.tvdb.groovy" -trust-script /path/to/media/
/*
2011-12-28 09:15:39 -05:00
* Fetch series and season banners for all tv shows. Series name is auto-detected if possible or the folder name is used.
*/
2011-12-28 19:51:00 -05:00
def fetchBanner(outputFile, series, bannerType, bannerType2 = null, season = null) {
// select and fetch banner
2012-01-06 07:40:07 -05:00
def banner = [_args.locale.language, null].findResult { TheTVDB.getBanner(series, [BannerType:bannerType, BannerType2:bannerType2, Season:season, Language:it]) }
if (banner == null) {
2011-12-28 19:51:00 -05:00
println "Banner not found: $outputFile / $bannerType:$bannerType2"
2011-12-20 21:39:25 -05:00
return null
}
println "Fetching $outputFile => $banner"
return banner.url.saveAs(outputFile)
}
def fetchNfo(outputFile, series) {
2012-01-03 23:09:17 -05:00
def info = TheTVDB.getSeriesInfo(series, _args.locale)
println info
2011-12-28 19:51:00 -05:00
info.applyXmlTemplate('''<tvshow xmlns:gsp='http://groovy.codehaus.org/2005/gsp'>
<title>$name</title>
<year>$firstAired.year</year>
2012-03-27 22:13:11 -04:00
<top250></top250>
<seasons>-1</seasons>
<episode></episode>
<episodeguideurl></episodeguideurl>
<displayseason>-1</displayseason>
<displayepisode>-1</displayepisode>
<rating>$rating</rating>
<votes>$ratingCount</votes>
2012-03-27 22:13:11 -04:00
<outline></outline>
<plot>$overview</plot>
2012-03-27 22:13:11 -04:00
<tagline></tagline>
<runtime>$runtime</runtime>
<mpaa>$contentRating</mpaa>
2012-03-27 22:13:11 -04:00
<playcount></playcount>
<lastplayed></lastplayed>
<id>$id</id>
2012-03-27 22:13:11 -04:00
<episodeguide><url cache="${id}.xml">http://www.thetvdb.com/api/1D62F2F90030C444/series/${id}/all/''' + _args.locale.language + '''.zip</url></episodeguide>
<genre>${!genres.empty ? genres[0] : ''}</genre>
<set></set>
<credits></credits>
<director></director>
<thumb>$bannerUrl</thumb>
2011-12-24 23:28:09 -05:00
<premiered>$firstAired</premiered>
<status>$status</status>
<studio>$network</studio>
2012-03-27 22:13:11 -04:00
<trailer></trailer>
<gsp:scriptlet> actors.each { </gsp:scriptlet>
2011-12-28 23:05:10 -05:00
<actor>
<name>$it</name>
2012-03-27 22:13:11 -04:00
<role></role>
2011-12-28 23:05:10 -05:00
</actor>
<gsp:scriptlet> } </gsp:scriptlet>
2012-03-27 22:13:11 -04:00
<artist></artist>
</tvshow>
2012-03-27 22:13:11 -04:00
''')
.replaceAll(/\t|\r|\n/, '') // xbmc can't handle leading/trailing whitespace properly
.saveAs(outputFile)
}
def fetchSeriesBannersAndNfo(seriesDir, seasonDir, series, season) {
println "Fetch nfo and banners for $series / Season $season"
2011-12-28 20:31:11 -05:00
TheTVDB.getBannerList(series).each {
2011-12-28 19:51:00 -05:00
println "Available banner: $it.url => $it"
}
// fetch nfo
fetchNfo(seriesDir['tvshow.nfo'], series)
2011-12-28 19:51:00 -05:00
2011-12-20 21:39:25 -05:00
// fetch series banner, fanart, posters, etc
2011-12-28 19:51:00 -05:00
["680x1000", null].findResult{ fetchBanner(seriesDir['folder.jpg'], series, "poster", it) }
["graphical", null].findResult{ fetchBanner(seriesDir['banner.jpg'], series, "series", it) }
2011-12-20 21:39:25 -05:00
// fetch highest resolution fanart
2011-12-28 19:51:00 -05:00
["1920x1080", "1280x720", null].findResult{ fetchBanner(seriesDir["fanart.jpg"], series, "fanart", it) }
// fetch season banners
if (seasonDir != seriesDir) {
fetchBanner(seasonDir["folder.jpg"], series, "season", "season", season)
fetchBanner(seasonDir["banner.jpg"], series, "season", "seasonwide", season)
}
}
2011-12-28 23:05:10 -05:00
args.eachMediaFolder { dir ->
// fetch only missing artwork by default
if (_args.conflict == "skip" && dir.hasFile{it =~ /tvshow.nfo$/} && dir.hasFile{it =~ /folder.jpg$/} && dir.hasFile{it =~ /banner.jpg$/}) {
println "Skipping $dir"
return
}
def videos = dir.listFiles{ it.isVideo() }
2012-01-03 23:09:17 -05:00
def query = _args.query ?: detectSeriesName(videos, _args.locale)
def sxe = videos.findResult{ parseEpisodeNumber(it) }
if (query == null) {
query = dir.dir.hasFile{ it.name =~ /Season/ && it.isDirectory() } ? dir.dir.name : dir.name
2011-12-20 21:39:25 -05:00
}
2011-12-28 19:51:00 -05:00
println "$dir => Search by $query"
2012-01-03 23:09:17 -05:00
def options = TheTVDB.search(query, _args.locale)
if (options.isEmpty()) {
println "TV Series not found: $query"
return
}
2012-01-03 23:09:17 -05:00
// sort by relevance
options = options.sortBySimilarity(query, { it.name })
// auto-select series
2012-01-03 23:09:17 -05:00
def series = options[0]
// maybe require user input
if (options.size() != 1 && !_args.nonStrict && !java.awt.GraphicsEnvironment.headless) {
series = javax.swing.JOptionPane.showInputDialog(null, "Please select TV Show:", dir.path, 3, null, options.toArray(), series);
if (series == null) return
2012-01-03 23:09:17 -05:00
}
// auto-detect structure
def seriesDir = [dir.dir, dir].sortBySimilarity(series.name, { it.name })[0]
def season = sxe && sxe.season > 0 ? sxe.season : 1
2011-12-28 19:51:00 -05:00
println "$dir => $series"
fetchSeriesBannersAndNfo(seriesDir, dir, series, season)
}