Skip to content

Commit

Permalink
1.3.0
Browse files Browse the repository at this point in the history
For ShokoServer 3.8.2 (minimum version supported)
  • Loading branch information
Cazzar authored Dec 26, 2017
2 parents 1c5a8c7 + 9382f16 commit 7bfb2c9
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 27 deletions.
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

63 changes: 47 additions & 16 deletions Contents/Code/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = ''
Expand Down Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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']:
Expand All @@ -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)
Expand All @@ -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'])
Expand Down
1 change: 0 additions & 1 deletion Contents/Code/tags
Submodule tags deleted from fdac0c
104 changes: 104 additions & 0 deletions Contents/Resources/Movies/Shoko Movie Scanner.py
Original file line number Diff line number Diff line change
@@ -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&notag=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
19 changes: 12 additions & 7 deletions Contents/Resources/Series/Shoko Series Scanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,16 +58,24 @@ 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:
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))
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():
Expand Down Expand Up @@ -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&notag=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)

Expand All @@ -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)
Expand Down

0 comments on commit 7bfb2c9

Please sign in to comment.