diff --git a/website/scripts/lib/ws.groovy b/website/scripts/lib/ws.groovy new file mode 100644 index 00000000..6fc751ab --- /dev/null +++ b/website/scripts/lib/ws.groovy @@ -0,0 +1,75 @@ +@Grab(group='org.jsoup', module='jsoup', version='1.7.1') +import org.jsoup.Jsoup +import org.jsoup.Connection.Method +import net.sourceforge.filebot.Cache + +def MyEpisodes(username, password) { + return new MyEpisodesScraper(username:username, password:password) +} + +class MyEpisodesScraper { + def username + def password + + def cache = Cache.getCache('web-persistent-datasource') + def session = [:] + + def login = { + def response = Jsoup.connect('http://www.myepisodes.com/login.php').data('username', username, 'password', password, 'action', 'Login', 'u', '').method(Method.POST).execute() + session << response.cookies() + return response.parse() + } + + def get = { url -> + if (session.isEmpty()) { + login() + } + + def response = Jsoup.connect(url).cookies(session).method(Method.GET).execute() + session << response.cookies() + def html = response.parse() + + if (html.select('#frmLogin')) { + session.clear() + throw new Exception('Login failed') + } + + return html + } + + def getShows = { + def shows = cache.get("MyEpisodes.Shows") + if (shows == null) { + shows = ['other', 'A'..'Z'].flatten().findResults{ section -> + get("http://myepisodes.com/shows.php?list=${section}").select('a').findResults{ a -> + try { + return [id:a.absUrl('href').match(/showid=(\d+)/).toInteger(), name:a.text()] + } catch(e) { + return null + } + } + }.flatten() + cache.put('MyEpisodes.Shows', shows) + } + return shows + } + + def getShowList = { + get("http://www.myepisodes.com/shows.php?type=manage").select('option').findResults{ option -> + try { + return [id:option.attr('value').toInteger(), name:option.text()] + } catch(e) { + return null + } + } + } + + def addShow = { showid -> + get("http://myepisodes.com/views.php?type=manageshow&mode=add&showid=${showid}") + } + + def update = { showid, season, episode, tick = 'acquired', value = '0'-> + get("http://myepisodes.com/myshows.php?action=Update&showid=${showid}&season=${season}&episode=${episode}&${tick}=${value}") + } + +} diff --git a/website/scripts/update-mes.groovy b/website/scripts/update-mes.groovy new file mode 100644 index 00000000..d1828f91 --- /dev/null +++ b/website/scripts/update-mes.groovy @@ -0,0 +1,29 @@ +include('lib/ws') + +def mesacc = myepisodes.split(':') +def mescheck = tryQuietly { tick } ?: 'acquired' + +def mes = MyEpisodes(mesacc[0], mesacc[1]) +def myshows = mes.getShowList() + +def matches = { s1, s2 -> + def norm = { s -> s.replaceAll(/\W/, '').toLowerCase() } + return norm(s1) == norm(s2) +} + +args.getFiles{ it.isVideo() && parseEpisodeNumber(it) }.groupBy{ detectSeriesName(it) }.each{ series, files -> + def show = myshows.find{ matches(it.name, series) } ?: mes.getShows().find{ matches(it.name, series) } + if (show != null) { + if (!myshows.contains(show)) { + mes.addShow(show.id) + println "[added] $show.name" + } + files.each{ + def sxe = parseEpisodeNumber(it) + mes.update(show.id, sxe.season, sxe.episode, mescheck) + println "[$mescheck] $series $sxe [$it.name]" + } + } else { + println "[failure] '$series' not found" + } +}