diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 1c39344..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "tags"] - path = Contents/Code/tags - url = https://github.com/bigretromike/nakamori.tags.git diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index ae9ed5b..9e0c295 100644 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -6,9 +6,9 @@ import threading import urllib import copy +from urllib2 import HTTPError from datetime import datetime from lxml import etree -import tags as TagBlacklist API_KEY = '' PLEX_HOST = '' @@ -49,19 +49,28 @@ def HttpPost(url, postdata): data=postdata).content) -def HttpReq(url, authenticate=True): +def HttpReq(url, authenticate=True, retry=True): + global API_KEY Log("Requesting: %s" % url) api_string = '' if authenticate: api_string = '&apikey=%s' % GetApiKey() - return JSON.ObjectFromString( - HTTP.Request('http://%s:%s/%s%s' % (Prefs['Hostname'], Prefs['Port'], url, api_string)).content) + try: + return JSON.ObjectFromString( + HTTP.Request('http://%s:%s/%s%s' % (Prefs['Hostname'], Prefs['Port'], url, api_string)).content) + except Exception, e: + if not retry: + raise e + + API_KEY = '' + return HttpReq(url, authenticate, False) + class ShokoCommonAgent: def Search(self, results, media, lang, manual, movie): - name = media.show + name = ( media.title if movie else media.show ) # http://127.0.0.1:8111/api/serie/search?query=Clannad&level=1&apikey=d422dfd2-bdc3-4219-b3bb-08b85aa65579 @@ -82,16 +91,7 @@ def Update(self, metadata, media, lang, force, movie): # http://127.0.0.1:8111/api/ep/getbyfilename?apikey=d422dfd2-bdc3-4219-b3bb-08b85aa65579&filename=%5Bjoseole99%5D%20Clannad%20-%2001%20(1280x720%20Blu-ray%20H264)%20%5B8E128DF5%5D.mkv # episode_data = HttpReq("api/ep/getbyfilename?apikey=%s&filename=%s" % (GetApiKey(), urllib.quote(media.filename))) - series = HttpReq("api/serie?id=%s&level=3&allpics=1" % aid) - - # build metadata on the TV show. - metadata.summary = try_get(series, 'summary') - metadata.title = series['name'] - metadata.rating = float(series['rating']) - tags = [] - for tag in series['tags']: - tags.append(tag['tag']) flags = 0 flags = flags | Prefs['hideMiscTags'] << 0 #0b00001 : Hide AniDB Internal Tags @@ -100,7 +100,21 @@ def Update(self, metadata, media, lang, force, movie): flags = flags | Prefs['hideUsefulMiscTags'] << 3 #0b01000 : Hide Useful Miscellaneous Tags flags = flags | Prefs['hideSpoilerTags'] << 4 #0b10000 : Hide Plot Spoiler Tags - TagBlacklist.processTags(flags, tags) + + series = HttpReq("api/serie?id=%s&level=3&allpics=1&tagfilter=%d" % (aid, flags)) + + # build metadata on the TV show. + metadata.summary = try_get(series, 'summary') + metadata.title = series['name'] + metadata.rating = float(series['rating']) + year = try_get(series, "year", None) + + #if year: + # metadata.year = int(year) + + tags = [] + for tag in series['tags']: + tags.append(tag) metadata.genres = tags @@ -135,6 +149,17 @@ def Update(self, metadata, media, lang, force, movie): Log('Assumed tv rating to be: %s' % metadata.content_rating) + if series['air'] != '1/01/0001 12:00:00 AM' and series['air'] != '0001-01-01': + metadata.originally_available_at = datetime.strptime(series['air'], "%Y-%m-%d").date() + + metadata.roles.clear() + for role in series['roles']: + meta_role = metadata.roles.new() + Log(role['character']) + meta_role.name = role['staff'] + meta_role.role = role['character'] + meta_role.photo = "http://{host}:{port}{relativeURL}".format(host=Prefs['Hostname'], port=Prefs['Port'], relativeURL=role['staff_image']) + if not movie: for ep in series['eps']: @@ -152,10 +177,13 @@ def Update(self, metadata, media, lang, force, movie): episodeObj.summary = ep['summary'] if ep['air'] != '1/01/0001 12:00:00 AM' and ep['air'] != '0001-01-01': - episodeObj.originally_available_at = datetime.strptime(ep['air'], "%d/%m/%Y %H:%M:%S %p").date() + episodeObj.originally_available_at = datetime.strptime(ep['air'], "%Y-%m-%d").date() if len(series['art']['thumb']) and Prefs['customThumbs']: for art in series['art']['thumb']: + if ':' in art['url']: + urlparts = urllib.parse.urlparse(art['url']) + art['url'] = art['url'].replace("{scheme}://{host}:{port}/".format(scheme=urlparts.scheme, host=urlparts.hostname, port=urlparts.port), '') episodeObj.thumbs[art['url']] = Proxy.Media(HTTP.Request("http://{host}:{port}{relativeURL}".format(host=Prefs['Hostname'], port=Prefs['Port'], relativeURL=art['url'])).content, art['index']) links = HttpReq("api/links/serie?id=%s" % aid) @@ -174,6 +202,9 @@ def metadata_add(self, meta, images): valid = list() for art in images: + if ':' in art['url']: + urlparts = urllib.parse.urlparse(art['url']) + art['url'] = art['url'].replace("{scheme}://{host}:{port}/".format(scheme=urlparts.scheme, host=urlparts.hostname, port=urlparts.port), '') Log("[metadata_add] :: Adding metadata %s (index %d)" % (art['url'], art['index'])) meta[art['url']] = Proxy.Media(HTTP.Request("http://{host}:{port}{relativeURL}".format(host=Prefs['Hostname'], port=Prefs['Port'], relativeURL=art['url'])).content, art['index']) valid.append(art['url']) diff --git a/Contents/Code/tags b/Contents/Code/tags deleted file mode 160000 index fdac0c4..0000000 --- a/Contents/Code/tags +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fdac0c4ee1a7c8d0c1de9fcce62c9ef1983f6e70 diff --git a/Contents/Resources/Movies/Shoko Movie Scanner.py b/Contents/Resources/Movies/Shoko Movie Scanner.py new file mode 100644 index 0000000..70f683f --- /dev/null +++ b/Contents/Resources/Movies/Shoko Movie Scanner.py @@ -0,0 +1,104 @@ +import re, os, os.path, json +import Media, VideoFiles, Stack, Utils + +import urllib2, urllib + +Prefs = { + 'Hostname': '127.0.0.1', + 'Port': 8111, + 'Username': 'Default', + 'Password': '', + 'IncludeOther': True +} + +API_KEY = '' + +def log(methodName, message, *args): + ''' + Create a log message given the message and arguments + ''' + logMsg = message + # Replace the arguments in the string + if args: + logMsg = message % args + + logMsg = methodName + ' :: ' + logMsg + print logMsg + + +def HttpPost(url, postdata): + myheaders = {'Content-Type': 'application/json'} + + req = urllib2.Request('http://%s:%s/%s' % (Prefs['Hostname'], Prefs['Port'], url), headers=myheaders) + return json.load(urllib2.urlopen(req, postdata)) + + +def HttpReq(url, authenticate=True): + log('HttpReq' ,"Requesting: %s", url) + api_string = '' + if authenticate: + api_string = '&apikey=%s' % GetApiKey() + + myheaders = {'Accept': 'application/json'} + + req = urllib2.Request('http://%s:%s/%s%s' % (Prefs['Hostname'], Prefs['Port'], url, api_string), headers=myheaders) + return json.load(urllib2.urlopen(req)) + + +def GetApiKey(): + global API_KEY + + if not API_KEY: + data = '{"user":"%s", "pass":"%s", "device":"%s"}' % ( + Prefs['Username'], Prefs['Password'] if Prefs['Password'] != None else '', 'Shoko Series Scanner For Plex') + resp = HttpPost('api/auth', data)['apikey'] + log('GetApiKey', "Got API KEY: %s", resp) + API_KEY = resp + return resp + + return API_KEY + + +def Scan(path, files, mediaList, subdirs, language=None, root=None): + log('Scan', 'path: %s', path) + log('Scan', 'files: %s', files) + log('Scan', 'mediaList: %s', mediaList) + log('Scan', 'subdirs: %s', subdirs) + log('Scan', 'language: %s', language) + log('Scan', 'root: %s', root) + + # Scan for video files. + VideoFiles.Scan(path, files, mediaList, subdirs, root) + + for idx, file in enumerate(files): + log('Scan', 'file: %s', file) + # http://127.0.0.1:8111/api/ep/getbyfilename?apikey=d422dfd2-bdc3-4219-b3bb-08b85aa65579&filename=%5Bjoseole99%5D%20Clannad%20-%2001%20(1280x720%20Blu-ray%20H264)%20%5B8E128DF5%5D.mkv + + episode_data = HttpReq("api/ep/getbyfilename?filename=%s" % (urllib.quote(os.path.basename(file)))) + if len(episode_data) == 0: break + if (try_get(episode_data, "code", 200) == 404): break + + series_data = HttpReq("api/serie/fromep?id=%d&nocast=1¬ag=1" % episode_data['id']) + if (series_data["ismovie"] == 0): + continue + showTitle = series_data['name'].encode("utf-8") #no idea why I need to do this. + log('Scan', 'show title: %s', showTitle) + + seasonYear = episode_data['year'] + log('Scan', 'season year: %s', seasonYear) + + vid = Media.Movie(showTitle, int(seasonYear)) + log('Scan', 'vid: %s', vid) + vid.parts.append(file) + mediaList.append(vid) + + log('Scan', 'stack media') + Stack.Scan(path, files, mediaList, subdirs) + log('Scan', 'media list %s', mediaList) + + +def try_get(arr, idx, default=""): + try: + return arr[idx] + except: + return default \ No newline at end of file diff --git a/Contents/Resources/Series/Shoko Series Scanner.py b/Contents/Resources/Series/Shoko Series Scanner.py index e56bf95..076a376 100644 --- a/Contents/Resources/Series/Shoko Series Scanner.py +++ b/Contents/Resources/Series/Shoko Series Scanner.py @@ -58,7 +58,8 @@ def HttpPost(url, postdata): return json.load(urllib2.urlopen(req, postdata)) -def HttpReq(url, authenticate=True): +def HttpReq(url, authenticate=True, retry=True): + global API_KEY Log.info("Requesting: %s", url) api_string = '' if authenticate: @@ -66,8 +67,15 @@ def HttpReq(url, authenticate=True): myheaders = {'Accept': 'application/json'} - req = urllib2.Request('http://%s:%s/%s%s' % (Prefs['Hostname'], Prefs['Port'], url, api_string), headers=myheaders) - return json.load(urllib2.urlopen(req)) + try: + req = urllib2.Request('http://%s:%s/%s%s' % (Prefs['Hostname'], Prefs['Port'], url, api_string), headers=myheaders) + return json.load(urllib2.urlopen(req)) + except Exception, e: + if not retry: + raise e + + API_KEY = '' + return HttpReq(url, authenticate, False) def GetApiKey(): @@ -105,6 +113,7 @@ def Scan(path, files, mediaList, subdirs, language=None, root=None): if (try_get(episode_data, "code", 200) == 404): break series_data = HttpReq("api/serie/fromep?id=%d&nocast=1¬ag=1" % episode_data['id']) + if (series_data["ismovie"] == 1): break # Ignore movies in preference for Shoko Movie Scanner showTitle = series_data['name'].encode("utf-8") #no idea why I need to do this. Log.info('show title: %s', showTitle) @@ -120,11 +129,7 @@ def Scan(path, files, mediaList, subdirs, language=None, root=None): Log.info('season number: %s', seasonNumber) - episodeNumber = int(episode_data['epnumber']) - if episode_data['eptype'] != 'Episode': - episodeNumber = str("%s%d" % (episode_data['eptype'][0], episode_data['epnumber'])) - Log.info('episode number: %s', episodeNumber) vid = Media.Episode(showTitle, int(seasonNumber), episodeNumber)