@ -23,9 +23,11 @@
import datetime
import traceback
from sqlite3 import Row
from exceptions_helper import ex
import sickbeard
from . import db , logger
from . helpers import try_int
@ -39,14 +41,16 @@ if False:
from typing import Dict , Tuple
def get_scene_numbering ( tvid , prodid , season , episode , fallback_to_xem = True , show_sql = None , scene_sql = None ,
show_obj = None ) :
def get_scene_numbering ( tvid , prodid , season , episode , fallback_to_xem = True , show_obj = None , * * kwargs ) :
"""
Returns a tuple , ( season , episode ) , with the scene numbering ( if there is one ) ,
otherwise returns the xem numbering ( if fallback_to_xem is set ) , otherwise
returns the TVDB numbering .
( so the return values will always be set )
kwargs [ ' scene_result ' ] : type : Optional [ List [ Row ] ] passed thru
kwargs [ ' show_result ' ] : type : Optional [ List [ Row ] ] passed thru
: param tvid : tvid
: type tvid : int
: param prodid : prodid
@ -57,6 +61,8 @@ def get_scene_numbering(tvid, prodid, season, episode, fallback_to_xem=True, sho
: type episode : int
: param fallback_to_xem : If set ( the default ) , check xem for matches if there is no local scene numbering
: type fallback_to_xem : bool
: param show_obj :
: type show_obj :
: return : ( int , int ) a tuple with ( season , episode )
: rtype : Tuple [ int , int ]
"""
@ -69,18 +75,18 @@ def get_scene_numbering(tvid, prodid, season, episode, fallback_to_xem=True, sho
if show_obj and not show_obj . is_scene :
return season , episode
result = find_scene_numbering ( tvid , prodid , season , episode , scene_sql = scene_sql )
result = find_scene_numbering ( tvid , prodid , season , episode , scene_result = kwargs . get ( ' scene_result ' ) )
if result :
return result
else :
if fallback_to_xem :
xem_result = find_xem_numbering ( tvid , prodid , season , episode , show_sql = show_sql )
xem_result = find_xem_numbering ( tvid , prodid , season , episode , show_result = kwargs . get ( ' show_result ' ) )
if xem_result :
return xem_result
return season , episode
def find_scene_numbering ( tvid , prodid , season , episode , scene_sql = None ) :
def find_scene_numbering ( tvid , prodid , season , episode , scene_result = None ) :
"""
Same as get_scene_numbering ( ) , but returns None if scene numbering is not set
: param tvid : tvid
@ -91,6 +97,8 @@ def find_scene_numbering(tvid, prodid, season, episode, scene_sql=None):
: type season : int
: param episode : episode number
: type episode : int
: param scene_result :
: type scene_result :
: return :
: rtype : Tuple [ int , int ] or None
"""
@ -99,36 +107,39 @@ def find_scene_numbering(tvid, prodid, season, episode, scene_sql=None):
tvid , prodid = int ( tvid ) , int ( prodid )
rows = None
if None is not scene_sql :
for e in scene_sql :
if e [ ' season ' ] == season and e [ ' episode ' ] == episode :
if e [ ' scene_season ' ] or e [ ' scene_episode ' ] :
rows = [ e ]
sql_result = None
if None is not scene_result :
for cur_row in scene_result :
if cur_row [ ' season ' ] == season and cur_row [ ' episode ' ] == episode :
if cur_row [ ' scene_season ' ] or cur_row [ ' scene_episode ' ] :
sql_result = [ cur_row ]
break
else :
my_db = db . DBConnection ( )
rows = my_db . select (
' SELECT scene_season, scene_episode '
' FROM scene_numbering '
' WHERE indexer = ? AND indexer_id = ? '
' AND season = ? AND episode = ? AND (scene_season OR scene_episode) != 0 ' ,
[ tvid , prodid , season , episode ] )
if rows :
s_s , s_e = try_int ( rows [ 0 ] [ ' scene_season ' ] , None ) , try_int ( rows [ 0 ] [ ' scene_episode ' ] , None )
sql_result = my_db . select (
"""
SELECT scene_season , scene_episode
FROM scene_numbering
WHERE indexer = ? AND indexer_id = ? AND season = ? AND episode = ? AND ( scene_season OR scene_episode ) != 0
""" , [tvid, prodid, season, episode] )
if sql_result :
s_s , s_e = try_int ( sql_result [ 0 ] [ ' scene_season ' ] , None ) , try_int ( sql_result [ 0 ] [ ' scene_episode ' ] , None )
if None is not s_s and None is not s_e :
return s_s , s_e
def get_scene_absolute_numbering ( tvid , prodid , absolute_number , season , episode , fallback_to_xem = True , show_sql = None ,
scene_sql = None , show_obj = None ) :
def get_scene_absolute_numbering ( tvid , prodid , absolute_number , season , episode , fallback_to_xem = True ,
show_obj = None , * * kwargs ) :
"""
Returns a tuple , ( season , episode ) , with the scene numbering ( if there is one ) ,
otherwise returns the xem numbering ( if fallback_to_xem is set ) , otherwise
returns the TVDB numbering .
( so the return values will always be set )
kwargs [ ' scene_result ' ] : type : Optional [ List [ Row ] ] passed thru
kwargs [ ' show_result ' ] : type : Optional [ List [ Row ] ] passed thru
: param tvid : tvid
: type tvid : int
: param prodid : prodid
@ -142,6 +153,8 @@ def get_scene_absolute_numbering(tvid, prodid, absolute_number, season, episode,
: param fallback_to_xem : fallback_to_xem : bool If set ( the default ) , check xem for matches if there is no
local scene numbering
: type fallback_to_xem : bool
: param show_obj :
: type show_obj :
: return : ( int , int ) a tuple with ( season , episode )
: rtype : Tuple [ int , int ] or None
"""
@ -156,18 +169,20 @@ def get_scene_absolute_numbering(tvid, prodid, absolute_number, season, episode,
if show_obj and not show_obj . is_scene and not has_sxe :
return absolute_number
result = find_scene_absolute_numbering ( tvid , prodid , absolute_number , season , episode , scene_sql = scene_sql )
result = find_scene_absolute_numbering ( tvid , prodid , absolute_number , season , episode ,
scene_result = kwargs . get ( ' scene_result ' ) )
if result :
return result
else :
if fallback_to_xem :
xem_result = find_xem_absolute_numbering ( tvid , prodid , absolute_number , season , episode , show_sql = show_sql )
xem_result = find_xem_absolute_numbering ( tvid , prodid , absolute_number , season , episode ,
show_result = kwargs . get ( ' show_result ' ) )
if xem_result :
return xem_result
return absolute_number
def find_scene_absolute_numbering ( tvid , prodid , absolute_number , season = None , episode = None , scene_sql = None ) :
def find_scene_absolute_numbering ( tvid , prodid , absolute_number , season = None , episode = None , scene_result = None ) :
"""
Same as get_scene_numbering ( ) , but returns None if scene numbering is not set
@ -181,6 +196,8 @@ def find_scene_absolute_numbering(tvid, prodid, absolute_number, season=None, ep
: type season : int
: param episode :
: type episode : int
: param scene_result :
: type scene_result :
: return :
: rtype : None or int
"""
@ -190,26 +207,26 @@ def find_scene_absolute_numbering(tvid, prodid, absolute_number, season=None, ep
tvid , prodid = int ( tvid ) , int ( prodid )
rows = None
if None is not scene_sql :
for e in scene_sql :
if e [ ' season ' ] == season and e [ ' episode ' ] == episode :
if e [ ' scene_absolute_number ' ] :
rows = [ e ]
sql_result = None
if None is not scene_result :
for cur_row in scene_result :
if cur_row [ ' season ' ] == season and cur_row [ ' episode ' ] == episode :
if cur_row [ ' scene_absolute_number ' ] :
sql_result = [ cur_row ]
break
else :
my_db = db . DBConnection ( )
sql_vars , cond = ( ( [ absolute_number ] , ' AND absolute_number = ?' ) ,
( [ season , episode ] , ' AND season = ? AND episode = ?' ) ) [ has_sxe ]
rows = my_db . select (
' SELECT scene_absolute_number '
' FROM scene_numbering '
' WHERE indexer = ? AND indexer_id = ? '
' %s AND scene_absolute_number != 0 ' % cond ,
[ tvid , prodid ] + sql_vars )
sql_vars , cond = ( ( [ absolute_number ] , ' absolute_number = ? ' ) ,
( [ season , episode ] , ' season = ? AND episode = ? ' ) ) [ has_sxe ]
sql_result = my_db . select (
"""
SELECT scene_absolute_number
FROM scene_numbering
WHERE indexer = ? AND indexer_id = ? AND % s AND scene_absolute_number != 0
""" % c ond, [tvid, prodid] + sql_vars )
if rows :
return try_int ( rows [ 0 ] [ ' scene_absolute_number ' ] , None )
if sql_result :
return try_int ( sql_result [ 0 ] [ ' scene_absolute_number ' ] , None )
def get_indexer_numbering ( tvid , prodid , scene_season , scene_episode , fallback_to_xem = True ) :
@ -235,15 +252,15 @@ def get_indexer_numbering(tvid, prodid, scene_season, scene_episode, fallback_to
tvid , prodid = int ( tvid ) , int ( prodid )
my_db = db . DBConnection ( )
rows = my_db . select (
' SELECT season, episode '
' FROM scene_numbering '
' WHERE indexer = ? AND indexer_id = ? '
' AND scene_season = ? AND scene_episode = ? ' ,
[ tvid , prodid , scene_season , scene_episode ] )
if rows :
ss , se = try_int ( rows [ 0 ] [ ' season ' ] , None ) , try_int ( rows [ 0 ] [ ' episode ' ] , None )
sql_result = my_db . select (
"""
SELECT season , episode
FROM scene_numbering
WHERE indexer = ? AND indexer_id = ? AND scene_season = ? AND scene_episode = ?
""" , [tvid, prodid, scene_season, scene_episode] )
if sql_result :
ss , se = try_int ( sql_result [ 0 ] [ ' season ' ] , None ) , try_int ( sql_result [ 0 ] [ ' episode ' ] , None )
if None is not ss and None is not se :
return ss , se
if fallback_to_xem :
@ -274,23 +291,19 @@ def get_indexer_absolute_numbering(tvid, prodid, scene_absolute_number, fallback
tvid , prodid = int ( tvid ) , int ( prodid )
my_db = db . DBConnection ( )
if None is scene_season :
rows = my_db . select (
' SELECT absolute_number '
' FROM scene_numbering '
' WHERE indexer = ? AND indexer_id = ? '
' AND scene_absolute_number = ? ' ,
[ tvid , prodid , scene_absolute_number ] )
else :
rows = my_db . select (
' SELECT absolute_number '
' FROM scene_numbering '
' WHERE indexer = ? AND indexer_id = ? '
' AND scene_absolute_number = ? AND scene_season = ? ' ,
[ tvid , prodid , scene_absolute_number , scene_season ] )
if rows :
an = try_int ( rows [ 0 ] [ ' absolute_number ' ] , None )
sql = """
SELECT absolute_number
FROM scene_numbering
WHERE indexer = ? AND indexer_id = ? AND scene_absolute_number = ?
"""
params = [ tvid , prodid , scene_absolute_number ]
if None is not scene_season :
sql + = ' AND scene_season = ? '
params + = [ scene_season ]
for cur_row in ( my_db . select ( sql , params ) or [ ] ) :
an = try_int ( cur_row [ ' absolute_number ' ] , None )
if None is not an :
return an
if fallback_to_xem :
@ -329,60 +342,64 @@ def set_scene_numbering(tvid=None, prodid=None, season=None, episode=None, absol
my_db = db . DBConnection ( )
if None is not season and None is not episode :
my_db . action (
' INSERT OR IGNORE INTO scene_numbering '
' (indexer, indexer_id, season, episode) VALUES (?,?,?,?) ' ,
[ tvid , prodid , season , episode ] )
"""
INSERT OR IGNORE INTO scene_numbering
( indexer , indexer_id , season , episode ) VALUES ( ? , ? , ? , ? )
""" , [tvid, prodid, season, episode])
# sxe replaced abs_num as key, migrate data with only abs
_ , _ , ep_absolute_number = _get_sea ( tvid , prodid , season , episode )
rows = my_db . select (
' SELECT scene_season, scene_episode, scene_absolute_number '
' FROM scene_numbering '
' WHERE indexer = ? AND indexer_id = ? '
' AND season IS NULL AND episode IS NULL AND absolute_number = ? ' ,
[ tvid , prodid , ep_absolute_number ] )
if not len ( rows ) :
sql_result = my_db . select (
"""
SELECT scene_season , scene_episode , scene_absolute_number
FROM scene_numbering
WHERE indexer = ? AND indexer_id = ? AND season IS NULL AND episode IS NULL AND absolute_number = ?
""" , [tvid, prodid, ep_absolute_number] )
if not len ( sql_result ) :
update , values = ( ( ' scene_absolute_number = ? ' , [ scene_absolute ] ) ,
( ' scene_season = ?, scene_episode = ? ' , [ scene_season , scene_episode ] ) ) [ not anime ]
else :
for row in rows :
scene_season = scene_season or row [ ' scene_season ' ]
scene_episode = scene_episode or row [ ' scene_episode ' ]
scene_absolute = scene_absolute or row [ ' scene_absolute_number ' ]
for cur_ row in sql_result :
scene_season = scene_season or cur_ row[ ' scene_season ' ]
scene_episode = scene_episode or cur_ row[ ' scene_episode ' ]
scene_absolute = scene_absolute or cur_ row[ ' scene_absolute_number ' ]
update , values = ( ' scene_season = ?, scene_episode = ?, scene_absolute_number = ? ' ,
[ scene_season , scene_episode , scene_absolute ] )
my_db . action (
' UPDATE scene_numbering '
' SET %s ' % update +
' WHERE indexer = ? AND indexer_id = ? '
' AND season = ? AND episode = ? ' ,
values + [ tvid , prodid , season , episode ] )
"""
UPDATE scene_numbering
SET % s
WHERE indexer = ? AND indexer_id = ?
AND season = ? AND episode = ?
""" % u pdate, values + [tvid, prodid, season, episode])
my_db . action (
' DELETE '
' FROM scene_numbering '
' WHERE indexer = ? AND indexer_id = ? '
' AND ((absolute_number = ? OR (season = ? AND episode = ?)) '
' AND scene_season IS NULL AND scene_episode IS NULL AND scene_absolute_number IS NULL) ' ,
[ tvid , prodid , ep_absolute_number , season , episode ] )
"""
DELETE
FROM scene_numbering
WHERE indexer = ? AND indexer_id = ?
AND ( ( absolute_number = ? OR ( season = ? AND episode = ? ) )
AND scene_season IS NULL AND scene_episode IS NULL AND scene_absolute_number IS NULL )
""" , [tvid, prodid, ep_absolute_number, season, episode])
elif absolute_number :
my_db . action (
' INSERT OR IGNORE INTO scene_numbering '
' (indexer, indexer_id, absolute_number) VALUES (?,?,?) ' ,
[ tvid , prodid , absolute_number ] )
"""
INSERT OR IGNORE INTO scene_numbering
( indexer , indexer_id , absolute_number ) VALUES ( ? , ? , ? )
""" , [tvid, prodid, absolute_number])
my_db . action (
' UPDATE scene_numbering '
' SET scene_absolute_number = ? '
' WHERE indexer = ? AND indexer_id = ? '
' AND absolute_number = ? ' ,
[ scene_absolute , tvid , prodid , absolute_number ] )
"""
UPDATE scene_numbering
SET scene_absolute_number = ?
WHERE indexer = ? AND indexer_id = ? AND absolute_number = ?
""" , [scene_absolute, tvid, prodid, absolute_number] )
def find_xem_numbering ( tvid , prodid , season , episode , show_sql = None ) :
def find_xem_numbering ( tvid , prodid , season , episode , show_result = None ) :
"""
Returns the scene numbering , as retrieved from xem .
Refreshes / Loads as needed .
@ -395,6 +412,8 @@ def find_xem_numbering(tvid, prodid, season, episode, show_sql=None):
: type season : int
: param episode :
: type episode : int
: param show_result :
: type show_result :
: return :
: rtype : ( int , int ) a tuple of scene_season , scene_episode , or None if there is no special mapping .
"""
@ -405,29 +424,27 @@ def find_xem_numbering(tvid, prodid, season, episode, show_sql=None):
xem_refresh ( tvid , prodid )
rows = None
if None is not show_sql :
for e in show_sql :
if e [ ' season ' ] == season and e [ ' episode ' ] == episode :
if e [ ' scene_season ' ] or e [ ' scene_episode ' ] :
rows = [ e ]
break
sql_result = None
if None is not show_result :
if isinstance ( show_result , Row ) and ( season , episode ) == ( show_result [ ' season ' ] , show_result [ ' episode ' ] ) \
and ( show_result [ ' scene_season ' ] or show_result [ ' scene_episode ' ] ) :
sql_result = [ show_result ]
else :
my_db = db . DBConnection ( )
rows = my_db . select (
' SELECT scene_season, scene_episode '
' FROM tv_episodes '
' WHERE indexer = ? AND showid = ? '
' AND season = ? AND episode = ? AND (scene_season OR scene_episode) != 0 ' ,
[ tvid , prodid , season , episode ] )
if rows :
s_s , s_e = try_int ( rows [ 0 ] [ ' scene_season ' ] , None ) , try_int ( rows [ 0 ] [ ' scene_episode ' ] , None )
sql_result = my_db . select (
"""
SELECT scene_season , scene_episode
FROM tv_episodes
WHERE indexer = ? AND showid = ? AND season = ? AND episode = ? AND ( scene_season OR scene_episode ) != 0
""" , [tvid, prodid, season, episode] )
if sql_result :
s_s , s_e = try_int ( sql_result [ 0 ] [ ' scene_season ' ] , None ) , try_int ( sql_result [ 0 ] [ ' scene_episode ' ] , None )
if None is not s_s and None is not s_e :
return s_s , s_e
def find_xem_absolute_numbering ( tvid , prodid , absolute_number , season , episode , show_sql = None ) :
def find_xem_absolute_numbering ( tvid , prodid , absolute_number , season , episode , show_result = None ) :
"""
Returns the scene numbering , as retrieved from xem .
Refreshes / Loads as needed .
@ -442,6 +459,8 @@ def find_xem_absolute_numbering(tvid, prodid, absolute_number, season, episode,
: type season : int
: param episode :
: type episode : int
: param show_result :
: type show_result :
: return :
: rtype : int
"""
@ -452,24 +471,22 @@ def find_xem_absolute_numbering(tvid, prodid, absolute_number, season, episode,
xem_refresh ( tvid , prodid )
rows = None
if None is not show_sql :
for e in show_sql :
if e [ ' season ' ] == season and e [ ' episode ' ] == episode :
if e [ ' scene_absolute_number ' ] :
rows = [ e ]
break
sql_result = None
if None is not show_result :
if isinstance ( show_result , Row ) and ( season , episode ) == ( show_result [ ' season ' ] , show_result [ ' episode ' ] ) \
and show_result [ ' scene_absolute_number ' ] :
sql_result = [ show_result ]
else :
my_db = db . DBConnection ( )
rows = my_db . select (
' SELECT scene_absolute_number '
' FROM tv_episodes '
' WHERE indexer = ? AND showid = ? '
' AND season = ? AND episode = ? AND scene_absolute_number != 0 ' ,
[ tvid , prodid , season , episode ] )
sql_result = my_db . select (
"""
SELECT scene_absolute_number
FROM tv_episodes
WHERE indexer = ? AND showid = ? AND season = ? AND episode = ? AND scene_absolute_number != 0
""" , [tvid, prodid, season, episode] )
if rows :
return try_int ( rows [ 0 ] [ ' scene_absolute_number ' ] , None )
if sql_result :
return try_int ( sql_result [ 0 ] [ ' scene_absolute_number ' ] , None )
def get_indexer_numbering_for_xem ( tvid , prodid , scene_season , scene_episode ) :
@ -495,17 +512,18 @@ def get_indexer_numbering_for_xem(tvid, prodid, scene_season, scene_episode):
xem_refresh ( tvid , prodid )
my_db = db . DBConnection ( )
rows = my_db . select (
' SELECT season, episode '
' FROM tv_episodes '
' WHERE indexer = ? AND showid = ? '
' AND scene_season = ? AND scene_episode = ? ' ,
[ tvid , prodid , scene_season , scene_episode ] )
i f rows :
ss , se = try_int ( rows [ 0 ] [ ' season ' ] , None ) , try_int ( rows [ 0 ] [ ' episode ' ] , None )
sql_result = my_db . select (
"""
SELECT season , episode
FROM tv_episodes
WHERE indexer = ? AND showid = ? AND scene_season = ? AND scene_episode = ?
""" , [tvid, prodid, scene_season, scene_episode] )
for cur_ row in ( sql_result or [ ] ) :
ss , se = try_int ( cur_ row[ ' season ' ] , None ) , try_int ( cur_ row[ ' episode ' ] , None )
if None is not ss and None is not se :
return ss , se
break
return scene_season , scene_episode
@ -533,25 +551,21 @@ def get_indexer_absolute_numbering_for_xem(tvid, prodid, scene_absolute_number,
xem_refresh ( tvid , prodid )
my_db = db . DBConnection ( )
if None is scene_season :
rows = my_db . select (
' SELECT absolute_number '
' FROM tv_episodes '
' WHERE indexer = ? AND showid = ? '
' AND scene_absolute_number = ? ' ,
[ tvid , prodid , scene_absolute_number ] )
else :
rows = my_db . select (
' SELECT absolute_number '
' FROM tv_episodes '
' WHERE indexer = ? AND showid = ? '
' AND scene_absolute_number = ? AND scene_season = ? ' ,
[ tvid , prodid , scene_absolute_number , scene_season ] )
if rows :
an = try_int ( rows [ 0 ] [ ' absolute_number ' ] , None )
sql = """
SELECT absolute_number
FROM tv_episodes
WHERE indexer = ? AND showid = ? AND scene_absolute_number = ?
"""
params = [ tvid , prodid , scene_absolute_number ]
if None is not scene_season :
sql + = ' AND scene_season = ? '
params + = [ scene_season ]
for cur_row in ( my_db . select ( sql , params ) or [ ] ) :
an = try_int ( cur_row [ ' absolute_number ' ] , None )
if None is not an :
return an
break
return scene_absolute_number
@ -620,18 +634,19 @@ def _get_numbering_for_show(tbl, tvid, prodid):
my_db = db . DBConnection ( )
# noinspection SqlResolve
rows = my_db . select (
' SELECT season, episode, scene_season, scene_episode '
' FROM %s ' % tbl +
' WHERE indexer = ? AND %s = ? ' % ( ' indexer_id ' , ' showid ' ) [ ' tv_episodes ' == tbl ] +
' AND (scene_season OR scene_episode) != 0 '
' ORDER BY season, episode ' ,
[ int ( tvid ) , int ( prodid ) ] )
for row in rows :
season , episode = try_int ( row [ ' season ' ] , None ) , try_int ( row [ ' episode ' ] , None )
sql_result = my_db . select (
"""
SELECT season , episode , scene_season , scene_episode
FROM % s
WHERE indexer = ? AND % s = ? AND ( scene_season OR scene_episode ) != 0
ORDER BY season , episode
""" % (tbl, ( ' indexer_id ' , ' showid ' )[ ' tv_episodes ' == tbl]), [int(tvid), int(prodid)] )
for cur_ row in sql_result :
season , episode = try_int ( cur_ row[ ' season ' ] , None ) , try_int ( cur_ row[ ' episode ' ] , None )
if None is not season and None is not episode :
scene_season , scene_episode = try_int ( row [ ' scene_season ' ] , None ) , try_int ( row [ ' scene_episode ' ] , None )
scene_season , scene_episode = try_int ( cur_row [ ' scene_season ' ] , None ) , \
try_int ( cur_row [ ' scene_episode ' ] , None )
if None is not scene_season and None is not scene_episode :
result [ ( season , episode ) ] = ( scene_season , scene_episode )
@ -686,22 +701,22 @@ def _get_absolute_numbering_for_show(tbl, tvid, prodid):
my_db = db . DBConnection ( )
# noinspection SqlResolve
rows = my_db . select (
' SELECT season, episode, absolute_number, scene_absolute_number '
' FROM %s ' % tbl +
' WHERE indexer = ? AND %s = ? ' % ( ' indexer_id ' , ' showid ' ) [ ' tv_episodes ' == tbl ] +
' AND scene_absolute_number != 0 '
' ORDER BY season, episode ' ,
[ int ( tvid ) , int ( prodid ) ] )
for row in rows :
season , episode , abs_num = map_list ( lambda x : try_int ( row [ x ] , None ) ,
sql_result = my_db . select (
"""
SELECT season , episode , absolute_number , scene_absolute_number
FROM % s
WHERE indexer = ? AND % s = ? AND scene_absolute_number != 0
ORDER BY season , episode
""" % (tbl, ( ' indexer_id ' , ' showid ' )[ ' tv_episodes ' == tbl]), [int(tvid), int(prodid)] )
for cur_ row in sql_result :
season , episode , abs_num = map_list ( lambda x : try_int ( cur_ row[ x ] , None ) ,
( ' season ' , ' episode ' , ' absolute_number ' ) )
if None is season and None is episode and None is not abs_num :
season , episode , _ = _get_sea ( tvid , prodid , absolute_number = abs_num )
if None is not season and None is not episode :
scene_absolute_number = try_int ( row [ ' scene_absolute_number ' ] , None )
scene_absolute_number = try_int ( cur_ row[ ' scene_absolute_number ' ] , None )
if None is not scene_absolute_number :
result [ ( season , episode ) ] = scene_absolute_number
@ -759,18 +774,20 @@ def xem_refresh(tvid, prodid, force=False):
xem_origin = tvinfo . config [ ' xem_origin ' ]
# XEM API URL
# noinspection HttpUrlsUsage
url = ' http://thexem.de/map/all?id= %s &origin= %s &destination=scene ' % ( prodid , xem_origin )
max_refresh_age_secs = 86400 # 1 day
my_db = db . DBConnection ( )
rows = my_db . select (
' SELECT last_refreshed '
' FROM xem_refresh '
' WHERE indexer = ? AND indexer_id = ? ' ,
[ tvid , prodid ] )
if rows :
last_refresh = int ( rows [ 0 ] [ ' last_refreshed ' ] )
sql_result = my_db . select (
"""
SELECT last_refreshed
FROM xem_refresh
WHERE indexer = ? AND indexer_id = ?
""" , [tvid, prodid])
if sql_result :
last_refresh = int ( sql_result [ 0 ] [ ' last_refreshed ' ] )
refresh = int ( timestamp_near ( datetime . datetime . now ( ) ) ) > last_refresh + max_refresh_age_secs
else :
refresh = True
@ -791,17 +808,14 @@ def xem_refresh(tvid, prodid, force=False):
if ' success ' in parsed_json [ ' result ' ] :
cl = map_list ( lambda entry : [
' UPDATE tv_episodes '
' SET scene_season = ?, scene_episode = ?, scene_absolute_number = ? '
' WHERE indexer = ? AND showid = ? '
' AND season = ? AND episode = ? ' ,
[ entry
. get ( ' scene %s ' % ( ' ' , ' _2 ' ) [ ' scene_2 ' in entry ] )
. get ( v ) for v in ( ' season ' , ' episode ' , ' absolute ' ) ] +
[ tvid , prodid ] +
[ entry
. get ( xem_origin )
. get ( v ) for v in ( ' season ' , ' episode ' ) ]
"""
UPDATE tv_episodes
SET scene_season = ? , scene_episode = ? , scene_absolute_number = ?
WHERE indexer = ? AND showid = ? AND season = ? AND episode = ?
""" , [entry.get( ' scene %s ' % ( ' ' , ' _2 ' )[ ' scene_2 ' in entry]).get(v)
for v in ( ' season ' , ' episode ' , ' absolute ' ) ]
+ [ tvid , prodid ]
+ [ entry . get ( xem_origin ) . get ( v ) for v in ( ' season ' , ' episode ' ) ]
] , filter_iter ( lambda x : ' scene ' in x , parsed_json [ ' data ' ] ) )
if 0 < len ( cl ) :
@ -829,11 +843,12 @@ def fix_xem_numbering(tvid, prodid):
tvid , prodid = int ( tvid ) , int ( prodid )
my_db = db . DBConnection ( )
rows = my_db . select (
' SELECT season, episode, absolute_number, scene_season, scene_episode, scene_absolute_number '
' FROM tv_episodes '
' WHERE indexer = ? AND showid = ? ' ,
[ tvid , prodid ] )
sql_result = my_db . select (
"""
SELECT season , episode , absolute_number , scene_season , scene_episode , scene_absolute_number
FROM tv_episodes
WHERE indexer = ? AND showid = ?
""" , [tvid, prodid])
last_absolute_number = None
last_scene_season = None
@ -850,43 +865,43 @@ def fix_xem_numbering(tvid, prodid):
logger . DEBUG )
cl = [ ]
for row in rows :
season = int ( row [ ' season ' ] )
episode = int ( row [ ' episode ' ] )
for cur_ row in sql_result :
season = int ( cur_ row[ ' season ' ] )
episode = int ( cur_ row[ ' episode ' ] )
if not int ( row [ ' scene_season ' ] ) and last_scene_season :
if not int ( cur_ row[ ' scene_season ' ] ) and last_scene_season :
scene_season = last_scene_season + 1
update_scene_season = True
else :
scene_season = int ( row [ ' scene_season ' ] )
scene_season = int ( cur_ row[ ' scene_season ' ] )
if last_scene_season and scene_season < last_scene_season :
scene_season = last_scene_season + 1
update_scene_season = True
if not int ( row [ ' scene_episode ' ] ) and last_scene_episode :
if not int ( cur_ row[ ' scene_episode ' ] ) and last_scene_episode :
scene_episode = last_scene_episode + 1
update_scene_episode = True
else :
scene_episode = int ( row [ ' scene_episode ' ] )
scene_episode = int ( cur_ row[ ' scene_episode ' ] )
if last_scene_episode and scene_episode < last_scene_episode :
scene_episode = last_scene_episode + 1
update_scene_episode = True
# check for unset values and correct them
if not int ( row [ ' absolute_number ' ] ) and last_absolute_number :
if not int ( cur_ row[ ' absolute_number ' ] ) and last_absolute_number :
absolute_number = last_absolute_number + 1
update_absolute_number = True
else :
absolute_number = int ( row [ ' absolute_number ' ] )
absolute_number = int ( cur_ row[ ' absolute_number ' ] )
if last_absolute_number and absolute_number < last_absolute_number :
absolute_number = last_absolute_number + 1
update_absolute_number = True
if not int ( row [ ' scene_absolute_number ' ] ) and last_scene_absolute_number :
if not int ( cur_ row[ ' scene_absolute_number ' ] ) and last_scene_absolute_number :
scene_absolute_number = last_scene_absolute_number + 1
update_scene_absolute_number = True
else :
scene_absolute_number = int ( row [ ' scene_absolute_number ' ] )
scene_absolute_number = int ( cur_ row[ ' scene_absolute_number ' ] )
if last_scene_absolute_number and scene_absolute_number < last_scene_absolute_number :
scene_absolute_number = last_scene_absolute_number + 1
update_scene_absolute_number = True
@ -899,51 +914,42 @@ def fix_xem_numbering(tvid, prodid):
if update_absolute_number :
cl . append ( [
' UPDATE tv_episodes '
' SET absolute_number = ? '
' WHERE indexer = ? AND showid = ? '
' AND season = ? AND episode = ? ' ,
[ absolute_number ,
tvid , prodid ,
season , episode
] ] )
"""
UPDATE tv_episodes
SET absolute_number = ?
WHERE indexer = ? AND showid = ? AND season = ? AND episode = ?
""" , [absolute_number, tvid, prodid, season, episode]
] )
update_absolute_number = False
if update_scene_season :
cl . append ( [
' UPDATE tv_episodes '
' SET scene_season = ? '
' WHERE indexer = ? AND showid = ? '
' AND season = ? AND episode = ? ' ,
[ scene_season ,
tvid , prodid ,
season , episode
] ] )
"""
UPDATE tv_episodes
SET scene_season = ?
WHERE indexer = ? AND showid = ? AND season = ? AND episode = ?
""" , [scene_season, tvid, prodid, season, episode]
] )
update_scene_season = False
if update_scene_episode :
cl . append ( [
' UPDATE tv_episodes '
' SET scene_episode = ? '
' WHERE indexer = ? AND showid = ? '
' AND season = ? AND episode = ? ' ,
[ scene_episode ,
tvid , prodid ,
season ,
episode
] ] )
"""
UPDATE tv_episodes
SET scene_episode = ?
WHERE indexer = ? AND showid = ? AND season = ? AND episode = ?
""" , [scene_episode, tvid, prodid, season, episode]
] )
update_scene_episode = False
if update_scene_absolute_number :
cl . append ( [
' UPDATE tv_episodes '
' SET scene_absolute_number = ? '
' WHERE indexer = ? AND showid = ? '
' AND season = ? AND episode = ? ' ,
[ scene_absolute_number ,
tvid , prodid ,
season , episode
] ] )
"""
UPDATE tv_episodes
SET scene_absolute_number = ?
WHERE indexer = ? AND showid = ? AND season = ? AND episode = ?
""" , [scene_absolute_number, tvid, prodid, season, episode]
] )
update_scene_absolute_number = False
if 0 < len ( cl ) :