database and scheduling updates

Updated metadata filtering to use locally stored data
Updated database scans to download metadata to local database on update
Added rerun mode, random show sequential episode mode, range of ratings filtering and episode air date filtering
This commit is contained in:
Moe Fwacky
2021-06-15 23:19:16 -07:00
committed by GitHub
parent fbd86d2390
commit 1d33ff7d1b
5 changed files with 1111 additions and 364 deletions

View File

@@ -112,11 +112,27 @@ class PseudoChannel():
if correct_lib_name == "Movies":
sectionMedia = self.PLEX.library.section(section.title).all()
for i, media in enumerate(sectionMedia):
self.db.add_movies_to_db(1, media.title, media.duration, media.key, section.title)
fetchMedia = self.PLEX.fetchItem(media.key)
try:
genres = [genre.tag for genre in fetchMedia.genres]
except:
genres = ''
try:
actors = [actor.tag for actor in fetchMedia.actors]
except:
actors = ''
try:
collections = [collection.tag for collection in fetchMedia.collections]
except:
collections = ''
#actors = {}
#for actor in fetchMedia.actors:
# actors[actor.tag] = str(actor.id)
self.db.add_movies_to_db(media.ratingKey, media.title, media.duration, media.key, section.title, media.contentRating, media.summary, media.originallyAvailableAt, str(genres), str(actors), str(collections), media.studio)
self.print_progress(
i + 1,
len(sectionMedia),
prefix = 'Progress '+section.title+": ",
prefix = section.title+" "+str(i+1)+' of '+str(len(sectionMedia))+": ",
suffix = 'Complete ['+media.title+']',
bar_length = 40
)
@@ -124,48 +140,79 @@ class PseudoChannel():
elif correct_lib_name == "TV Shows":
sectionMedia = self.PLEX.library.section(section.title).all()
for i, media in enumerate(sectionMedia):
fetchMedia = self.PLEX.fetchItem(media.key)
try:
genres = [genre.tag for genre in fetchMedia.genres]
except:
genres = ''
try:
actors = [actor.tag for actor in fetchMedia.actors]
except:
actors = ''
try:
similars = [similar.tag for similar in fetchMedia.similar]
except:
similars = ''
self.db.add_shows_to_db(
2,
media.ratingKey,
media.title,
media.duration if media.duration else 1,
'',
'',
media.originallyAvailableAt,
media.key,
section.title
section.title,
media.contentRating,
str(genres),
str(actors),
str(similars),
media.studio
)
#add all episodes of each tv show to episodes table
self.print_progress(
i + 1,
len(sectionMedia),
prefix = 'TV Show '+str(i+1)+' of '+str(len(sectionMedia))+': ',
suffix = 'Complete ['+media.title[0:40]+']',
bar_length = 40
)
#add all episodes of each tv show to episodes table
for i, media in enumerate(sectionMedia):
episodes = self.PLEX.library.section(section.title).get(media.title).episodes()
for j, episode in enumerate(episodes):
duration = episode.duration
if duration:
self.db.add_episodes_to_db(
4,
media.ratingKey,
episode.title,
duration,
episode.index,
episode.parentIndex,
media.title,
episode.key,
section.title
section.title,
episode.contentRating,
episode.originallyAvailableAt,
episode.summary
)
else:
self.db.add_episodes_to_db(
4,
episode.ratingKey,
episode.title,
0,
episode.index,
episode.parentIndex,
media.title,
episode.key,
section.title
section.title,
episode.contentRating,
episode.originallyAvailableAt,
episode.summary
)
self.print_progress(
j + 1,
len(episodes),
prefix = 'Progress TV Show '+str(i+1)+' of '+str(len(sectionMedia))+': ',
suffix = 'Complete ['+media.title+']',
prefix = str(i+1)+' of '+str(len(sectionMedia))+" "+media.title+': ',
suffix = 'Complete ['+episode.title[0:40]+']',
bar_length = 40
)
#print('')
@@ -177,8 +224,8 @@ class PseudoChannel():
self.print_progress(
i + 1,
media_length,
prefix = 'Progress '+section.title+":",
suffix = 'Complete['+media.title[0:12]+']',
prefix = section.title+" "+str(i+1)+' of '+str(len(sectionMedia))+":",
suffix = 'Complete['+media.title[0:40]+']',
bar_length = 40
)
#print('')
@@ -187,14 +234,20 @@ class PseudoChannel():
playlists = self.PLEX.playlists()
for i, playlist in enumerate(playlists):
duration_average = playlist.duration / playlist.leafCount
playlist_added = playlist.addedAt.strftime("%Y-%m-%d %H:%M:%S")
self.db.add_shows_to_db(
2,
playlist.ratingKey,
playlist.title,
duration_average,
'',
'',
playlist_added,
playlist.key,
playlist.type
playlist.type,
'',
'',
'',
'',
''
)
# add all entries of playlist to episodes table
episodes = self.PLEX.playlist(playlist.title).items()
@@ -213,31 +266,37 @@ class PseudoChannel():
plTitle = episode.title + " ("+str(episode.year)+")"
if duration:
self.db.add_playlist_entries_to_db(
5,
episode.ratingKey,
plTitle,
duration,
eNo,
sNo,
playlist.title,
episode.key,
sectionTitle
sectionTitle,
episode.contentRating,
episode.originallyAvailableAt,
episode.summary
)
else:
self.db.add_playlist_entries_to_db(
5,
episode.ratingKey,
episode.title,
0,
eNo,
sNo,
playlist.title,
episode.key,
sectionTitle
sectionTitle,
episode.contentRating,
episode.originallyAvailableAt,
episode.summary
)
self.print_progress(
j + 1,
len(episodes),
prefix = 'Progress Playlist '+str(i+1)+' of '+str(len(playlists))+': ',
suffix = 'Complete ['+playlist.title+']',
prefix = 'Playlist '+str(i+1)+' of '+str(len(playlists))+': ',
suffix = 'Complete ['+playlist.title[0:40]+']',
bar_length = 40
)
print('', end='\r')
@@ -310,7 +369,7 @@ class PseudoChannel():
def update_db_movies(self):
print("NOTICE: Updating Local Database, MOVIES ONLY")
print("NOTICE: Updating Local Movies Database")
self.db.create_tables()
libs_dict = config.plexLibraries
sections = self.PLEX.library.sections()
@@ -320,7 +379,23 @@ class PseudoChannel():
if correct_lib_name == "Movies":
sectionMedia = self.PLEX.library.section(section.title).all()
for i, media in enumerate(sectionMedia):
self.db.add_movies_to_db(1, media.title, media.duration, media.key, section.title)
fetchMedia = self.PLEX.fetchItem(media.key)
try:
genres = [genre.tag for genre in fetchMedia.genres]
except:
genres = ''
try:
actors = [actor.tag for actor in fetchMedia.actors]
except:
actors = ''
try:
collections = [collection.tag for collection in fetchMedia.collections]
except:
collections = ''
#actors = {}
#for actor in fetchMedia.actors:
# actors[actor.tag] = str(actor.id)
self.db.add_movies_to_db(media.key.replace('/library/metadata/',''), media.title, media.duration, media.key, section.title, media.contentRating, media.summary, media.originallyAvailableAt, str(genres), str(actors), str(collections), media.studio)
self.print_progress(
i + 1,
len(sectionMedia),
@@ -328,10 +403,6 @@ class PseudoChannel():
suffix = 'Complete ['+media.title+']',
bar_length = 40
)
print('', end='\r')
sys.stdout.write("\033[K")
print('NOTICE: Movies Database Update Complete!')
print('')
def update_db_tv(self):
print("NOTICE: Updating Local Database, TV ONLY")
@@ -670,7 +741,9 @@ class PseudoChannel():
section = entry[9]
for key, val in weekday_dict.items():
if str(entry[7]) in str(val) and int(weekno) == int(key):
media_id = entry[2]
if section == "TV Shows":
next_episode = None
try:
minmax = entry[4].split(",")
min = int(minmax[0])
@@ -684,177 +757,94 @@ class PseudoChannel():
max = int(minmax)
max = max * 60000
if str(entry[3]).lower() == "random":
media_id = 999
advance_episode = "no"
sections = self.PLEX.library.sections()
shows_list = []
libs_dict = config.plexLibraries
for theSection in sections:
for correct_lib_name, user_lib_name in libs_dict.items():
if theSection.title.lower() in [x.lower() for x in user_lib_name]:
if correct_lib_name == "TV Shows" and entry[13] != "":
print("NOTICE: TV SHOW WITH XTRA ARGS FOUND")
shows = self.PLEX.library.section(theSection.title)
xtra = '[]'
d = {}
#thestr = entry[13]
if ";" in xtra:
xtra = entry[13].split(';')
else:
if xtra != None:
xtra = str(entry[13]) + ';'
xtra = xtra.split(';')
try:
for thestr in xtra:
print("INFO: ARGUMENT = "+thestr)
strsplit = thestr.split(':')
if strsplit[0] == "decade":
decade = strsplit[1]
lastdigit = 0
thestr = "year:"
while lastdigit <= 9:
thestr = thestr+decade[0]+decade[1]+decade[2]+str(lastdigit)
lastdigit = lastdigit + 1
if lastdigit < 10:
thestr = thestr+","
print("INFO: ARGUMENT = "+thestr)
#d.update(strsplit[0],strsplit[1])
elif strsplit[0] == "season":
xtraSeason = strsplit[1]
thestr = ""
elif strsplit[0] == "episode":
xtraEpisode = strsplit[1]
thestr = ""
if thestr != "":
regex = re.compile(r"\b(\w+)\s*:\s*([^:]*)(?=\s+\w+\s*:|$)")
d.update(regex.findall(thestr))
#d = dict(regex.findall(thestr))
print(d)
#turn values into a list
for key, val in d.items():
d[key] = val.split(',')
for show in shows.search(None, **d):
shows_list.append(show)
except:
pass
if (len(shows_list) > 0):
#print shows_list
print("ACTION: Using xtra args to choose a random show")
the_show = self.db.get_shows(random.choice(shows_list).title)
else:
print("ACTION: Getting random show")
the_show = self.db.get_random_show_duration(int(min), int(max))
try:
print("INFO: "+str(the_show[3]))
except:
print("NOTICE: FAILED TO GET RANDOM SHOW")
if (the_show is None):
print("ACTION: Getting random episode of random show")
next_episode = self.db.get_random_episode_duration(int(min), int(max))
attempt = 1
episode_duration = next_episode[4]
while episode_duration < min or episode_duration > max:
print("NOTICE: EPISODE LENGTH OUTSIDE PARAMETERS")
print("ACTION: Getting random episode of random show")
next_episode = self.db.get_random_episode_duration(int(min), int(max))
episode_duration = int(next_episode[4])
attempt = attempt + 1
if attempt > 1000:
episode_duration = max
else:
episode_duration = int(next_episode[4])
print("INFO: Random Selection: "+next_episode[7]+" - S"+str(next_episode[6])+"E"+str(next_episode[5])+" - "+next_episode[3])
else:
i = 0
while i < 1000:
i += 1
try:
if xtraSeason is None and xtraEpisode is None:
print("ACTION: Choosing random episode of "+the_show[3].upper())
next_episode = self.db.get_random_episode_of_show(the_show[3])
elif xtraEpisode is None:
print("ACTION: Choosing random episode of "+the_show[3].upper()+" Season "+xtraSeason)
next_episode = self.db.get_specific_episode(the_show[3], xtraSeason)
elif xtraSeason is None:
print("ACTION: Choosing random episode of "+the_show[3].upper()+" Episode "+xtraEpisode)
next_episode = self.db.get_specific_episode(the_show[3], None, xtraEpisode)
else:
print("ACTION: Choosing random episode of "+the_show[3].upper()+" Season "+xtraSeason+" Episode "+xtraEpisode)
next_episode = self.db.get_specific_episode(the_show[3], xtraSeason, xtraEpisode)
print("INFO: Episode Selected: S"+str(next_episode[6])+"E"+str(next_episode[5])+" "+next_episode[3].upper())
break
except TypeError as e:
print (e)
if (len(shows_list) > 0):
#print shows_list
print("ACTION: Using xtra args to choose a random show")
the_show = self.db.get_shows(random.choice(shows_list).title)
else:
print("ACTION: Getting random show")
the_show = self.db.get_random_show_duration(int(min), int(max))
print("INFO: "+str(the_show[3]))
if (the_show is None):
print("ACTION: Getting random episode of random show")
next_episode = self.db.get_random_episode_duration(int(min), int(max))
continue
episode_duration = int(next_episode[4])
attempt = 1
while episode_duration < min or episode_duration > max or next_episode == None:
i = 0
while i < 1000:
i += 1
try:
print("NOTICE: DURATION OUTSIDE PARAMETERS")
if (len(shows_list) > 0):
print("ACTION: Using xtra args to choose a random show")
the_show = self.db.get_shows(random.choice(shows_list).title)
else:
print("ACTION: Getting random show")
the_show = self.db.get_random_show_duration(int(min), int(max))
print("INFO: "+str(the_show))
if xtraSeason is None and xtraEpisode is None:
print("ACTION: Choosing random episode of "+the_show[3].upper())
next_episode = self.db.get_random_episode_of_show(the_show[3])
elif xtraEpisode is None:
print("ACTION: Choosing random episode of "+the_show[3].upper()+" Season "+xtraSeason)
next_episode = self.db.get_specific_episode(the_show[3], xtraSeason)
elif xtraSeason is None:
print("ACTION: Choosing random episode of "+the_show[3].upper()+" Episode "+xtraEpisode)
next_episode = self.db.get_specific_episode(the_show[3], None, xtraEpisode)
else:
print("ACTION: Choosing random episode of "+the_show[3].upper()+" Season "+xtraSeason+" Episode "+xtraEpisode)
next_episode = self.db.get_specific_episode(the_show[3], xtraSeason, xtraEpisode)
print("INFO: Episode Selected: S"+str(next_episode[6])+"E"+str(next_episode[5])+" "+next_episode[3].upper())
break
except TypeError as e:
print(e)
if (len(shows_list) > 0):
#print shows_list
print("ACTION: Using xtra args to choose a random show")
the_show = self.db.get_shows(random.choice(shows_list).title)
else:
print("ACTION: Getting random show")
the_show = self.db.get_random_show_duration(int(min), int(max))
print("INFO: "+the_show[3])
if (the_show is None):
next_episode = self.db.get_random_episode_duration(int(min), int(max))
continue
attempt = attempt + 1
episode_duration = int(next_episode[4])
if attempt > 1000:
episode_duration = max
else:
episode_duration = int(next_episode[4])
show_title = next_episode[7]
xtraSeason = None
xtraEpisode = None
if correct_lib_name == "TV Shows":
while next_episode is None:
print("----------------------------------")
shows = self.PLEX.library.section(theSection.title)
print("NOTICE: Getting Show That Matches Data Filters")
the_show = self.db.get_random_show_data("TV Shows",int(min),int(max),entry[15],entry[16],entry[17],entry[18],entry[19],entry[20])
if (the_show == None):
print("NOTICE: Failed to get shows with data filters, trying with less")
the_show = self.db.get_random_show_data("TV Shows",int(min),int(max),entry[15],None,None,None,entry[19],None)
#the_show = self.db.get_shows(random.choice(shows_list).title)
try:
print("INFO: "+str(the_show[3]))
except:
print("NOTICE: FAILED TO GET RANDOM SHOW")
if (the_show is None):
print("ACTION: Getting random episode of random show")
next_episode = self.db.get_random_episode_duration(int(min), int(max))
attempt = 1
episode_duration = next_episode[4]
while episode_duration < min or episode_duration > max:
print("NOTICE: EPISODE LENGTH OUTSIDE PARAMETERS")
print("ACTION: Getting random episode of random show")
next_episode = self.db.get_random_episode_duration(int(min), int(max))
episode_duration = int(next_episode[4])
attempt = attempt + 1
if attempt > 1000:
episode_duration = max
else:
episode_duration = int(next_episode[4])
print("INFO: Random Selection: "+next_episode[7]+" - S"+str(next_episode[6])+"E"+str(next_episode[5])+" - "+next_episode[3])
else:
if entry[2] == 999:
media_id = 999
print("ACTION: Choosing random episode of "+the_show[3].upper())
try:
next_episode = self.db.get_random_episode_of_show_by_data(the_show[2],int(min),int(max),entry[15],entry[21].split(',')[0],entry[21].split(',')[1])
except:
next_episode = self.db.get_random_episode_of_show_by_data(the_show[2],int(min),int(max),entry[15])
elif entry[2] == 998:
media_id = 998
if entry[14] == 1:
print("ACTION: Choosing last episode of " +the_show[3].upper())
advance_episode = "no"
next_episode = self.db.get_last_episode(the_show[2]) #get last episode
try:
print("INFO: Scheduled: "+next_episode[7]+" - (S"+str(next_episode[6])+"E"+str(next_episode[5])+") "+next_episode[3])
except:
pass
else:
print("ACTION: Choosing next episode of " +the_show[3].upper())
advance_episode = "yes"
next_episode = self.db.get_next_episode(the_show[3]) #get next episode
try:
print("INFO: Scheduled: "+next_episode[7]+" - (S"+str(next_episode[6])+"E"+str(next_episode[5])+") "+next_episode[3])
except:
pass
episode_duration = int(next_episode[4])
show_title = next_episode[7]
xtraSeason = None
xtraEpisode = None
print("INFO: " + next_episode[7] + " - " + next_episode[3] + " (S" + str(next_episode[6]) + "E" + str(next_episode[5]) + ")")
print("----------------------------------")
elif entry[2] == 9999:
media_id = 9999
advance_episode = "no"
print("ACTION: Getting random episode of "+entry[3])
if entry[15] != None:
if entry[15][3] == '*':
print("INFO: Decade = " + str(entry[15]))
airDate=entry[15][0:3]
else:
print("INFO: Air Date = " + str(entry[15]))
airDate=entry[15]
else:
airDate=None
try:
next_episode = self.db.get_random_episode_of_show_alt(entry[3])
except TypeError as e:
print(e)
next_episode = self.db.get_random_episode_of_show_alt(entry[3])
next_episode = self.db.get_random_episode_of_show_by_data_alt(entry[3], int(min), int(max), airDate, entry[21].split(',')[0], entry[21].split(',')[1])
except Exception as e:
print("ERROR: " + str(e))
next_episode = self.db.get_random_episode_of_show_by_data_alt(entry[3], int(min), int(max), airDate)
print("INFO: Episode Selected: S"+str(next_episode[6])+"E"+str(next_episode[5])+" "+next_episode[3].upper())
show_title = next_episode[7]
episode_duration = next_episode[4]
@@ -870,7 +860,34 @@ class PseudoChannel():
episode_duration = next_episode[4]
show_title = next_episode[7]
else:
next_episode = self.db.get_next_episode(entry[3]) #get next episode
print("----------------------------------")
if entry[14] == 1:
advance_episode = "no"
#check for same show in MEDIA list
for m in self.MEDIA:
try:
seriesTitle = m.show_series_title
except:
seriesTitle = None
if seriesTitle == entry[3]:
next_episode = self.db.get_episode_from_plexMediaID(m.plex_media_id)
if next_episode == None:
next_episode = self.db.get_last_episode_alt(entry[3]) #get last episode
else:
advance_episode = "yes"
#check for same show in MEDIA list
episodeID = None
for m in self.MEDIA:
try:
seriesTitle = m.show_series_title
except:
seriesTitle = None
if seriesTitle == entry[3] and m.media_id == 2:
episodeID = self.db.get_episode_id_alternate(m.plex_media_id,seriesTitle)[0]
if episodeID != None:
next_episode = self.db.get_next_episode_alt(seriesTitle, episodeID)
if next_episode == None:
next_episode = self.db.get_next_episode(entry[3]) #get next episode
try:
print("INFO: Scheduled: "+next_episode[7]+" - (S"+str(next_episode[6])+"E"+str(next_episode[5])+") "+next_episode[3])
except:
@@ -889,12 +906,13 @@ class PseudoChannel():
entry[11], # time_shift
entry[12], # overlap_max
#next_episode[8] if len(next_episode) >= 9 else '', # plex id
next_episode[8], #plex id
next_episode[8], # plex_media_id
customSectionName, # custom lib name
2, #media_id
media_id, #media_id
show_title, # show_series_title
next_episode[5], # episode_number
next_episode[6], # season_number
advance_episode, # advance_episode
)
self.MEDIA.append(episode)
else:
@@ -932,14 +950,18 @@ class PseudoChannel():
xtra = xtra.split(';')
print(xtra)
try:
for thestr in xtra:
"""for thestr in xtra:
print ("INFO: "+thestr)
regex = re.compile(r"\b(\w+)\s*:\s*([^:]*)(?=\s+\w+\s*:|$)")
d.update(regex.findall(thestr))
# turn values into list
for key, val in d.items():
d[key] = val.split(',')
for movie in movies.search(None, **d):
d[key] = val.split(',')"""
if entry[13] != "" and entry[13] != None:
movie_search = self.db.get_movies_xtra(correct_lib_name,int(min),int(max),xtra)
else:
movie_search = self.db.get_movies_data("Movies",int(min),int(max),entry[15],entry[16],entry[17],entry[18],entry[19],entry[20])
for movie in movie_search:
movies_list.append(movie)
except:
pass
@@ -947,26 +969,26 @@ class PseudoChannel():
movie_get = random.choice(movies_list)
movies_list.remove(movie_get)
try:
print("INFO: Movie Title - " + movie_get.title)
the_movie = self.db.get_movie_by_id(movie_get.key)
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get.title)
the_movie = self.db.get_movie(movie_get.title)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[3])
movie_duration = the_movie[4]
attempt = 1
while int(movie_duration) < min or movie_duration > max:
movie_get = random.choice(movies_list)
movies_list.remove(movie_get)
try:
print("INFO: Movie Title - " + movie_get.title)
the_movie = self.db.get_movie_by_id(movie_get.key)
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get.title)
the_movie = self.db.get_movie(movie_get.title)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[6])
attempt = attempt + 1
if attempt > 500:
movie_duration = max
@@ -976,7 +998,20 @@ class PseudoChannel():
self.db.update_movies_table_with_last_played_date(the_movie[3])
else:
print("ERROR: xtra args not found, getting random movie")
the_movie = self.db.get_random_movie_duration(int(min), int(max))
movie_search = self.db.get_movies_data("Movies",int(min),int(max),None,None,None,None,entry[19],None)
for movie in movie_search:
if movie not in movies_list and movie[3] not in last_movie:
movies_list.append(movie)
movie_get = random.choice(movies_list)
movies_list.remove(movie_get)
try:
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[6])
print("INFO: Movie Title - " + str(the_movie[3]))
movie_duration = the_movie[4]
attempt = 1
@@ -1032,89 +1067,71 @@ class PseudoChannel():
if theSection.title.lower() in [x.lower() for x in user_lib_name]:
if correct_lib_name == "Movies":
movies = self.PLEX.library.section(theSection.title)
if(entry[13] != '' or len(actors_list) > 0): # xtra params
'''if(entry[13] != None or len(actors_list) > 0): # xtra params
xtra = []
try:
print("INFO: Movie Xtra Arguments: ", entry[13])
except:
print("INFO: Xtra Arguments Not Found")
d = {}
if len(actors_list) > 0:
for actorName in actors_list:
xtra = []
if ";" in entry[13]:
xtra = entry[13].split(';')
elif entry[13] != '':
xtra.append(str(entry[13]))
#xtra = xtra.split(';')
else:
xtra = []
actorID = actors_list[actorName]
print("----------------------------------")
print("INFO: Actor from " + last_movie + " selected - " + actorName)
try:
#print("NOTICE: Appending " + actorName + " to xtra args")
xtra.append("actor:"+str(actorID))
except:
#print("ERROR: Appending failed, creating new list with actor name")
xtra = ["actor:"+str(actorID)]
print("INFO: xtra args: " + str(xtra))
try:
for thestr in xtra:
#print ("INFO: "+thestr)
regex = re.compile(r"\b(\w+)\s*:\s*([^:]*)(?=\s+\w+\s*:|$)")
d.update(regex.findall(thestr))
except Exception as e:
print("ERROR: " + str(e))
pass
#print("NOTICE: turning xtra values into a dict")
try:
for key, val in d.items():
d[key] = val.split(',')
except Exception as e:
print("ERROR: " + str(e))
pass
print("NOTICE: Executing movies search for matches")
try:
movie_search = movies.search(None, **d)
print("INFO: " + str(len(movie_search)) + " results found")
except Exception as e:
print(e)
for movie in movie_search:
if movie not in movies_list and movie.title not in last_movie:
print(str(movie.title))
movies_list.append(movie)
#print("INFO: Match Found - " + str(movie))
#for movie in movies.search(None, **d):
# movies_list.append(movie)
# print("INFO: Match Found - " + str(movie))
#except Exception as e:
# print("ERROR: " + str(e))
# pass
#print("INFO: Movies List: " + str(movies_list))
else:
print("NOTICE: No previous actor data, skipping...")
if ";" in entry[13]:
xtra = entry[13].split(';')
else:
if entry[13] != None:
xtra = str(entry[13]) + ';'
xtra = xtra.split(';')
print(xtra)
try:
for thestr in xtra:
print ("INFO: "+thestr)
regex = re.compile(r"\b(\w+)\s*:\s*([^:]*)(?=\s+\w+\s*:|$)")
d.update(regex.findall(thestr))
# turn values into list
for key, val in d.items():
d[key] = val.split(',')
for movie in movies.search(None, **d):
d = {}'''
if len(actors_list) > 0:
xtra_actors = []
if entry[17] != None and ',' in entry[17]:
xtra_actors = entry[17].split(',')
elif entry[17] != None and ',' not in entry[17]:
xtra_actors.append(entry[17])
for actorName in actors_list:
the_actors = []
for xActor in xtra_actors:
print("INFO: xtra actor = " + xActor)
the_actors.append(xActor)
the_actors.append(actorName)
aLoop = 1
actor_data = ''
print("----------------------------------")
print("INFO: Actor from " + last_movie + " selected - " + actorName)
print("NOTICE: Executing movies search for matches")
print("INFO: " + str(entry[15]) + ', ' + str(entry[16]) + ', ' + str(the_actors) + ', ' + str(entry[18]) + ', ' + str(entry[19]) + ', ' + str(entry[20]))
movie_search = self.db.get_movies_data("Movies",int(min),int(max),entry[15],entry[16],the_actors,entry[18],entry[19],entry[20])
print("INFO: " + str(len(movie_search)) + " results found")
#except Exception as e:
#print(e)
for movie in movie_search:
if movie not in movies_list and movie[3] not in last_movie:
print(str(movie[3]))
movies_list.append(movie)
#print("INFO: Match Found - " + movie)
except Exception as e:
print("ERROR: " + str(e))
pass
#print("INFO: Match Found - " + str(movie))
#for movie in movies.search(None, **d):
# movies_list.append(movie)
# print("INFO: Match Found - " + str(movie))
#except Exception as e:
# print("ERROR: " + str(e))
# pass
#print("INFO: Movies List: " + str(movies_list))
else:
print("NOTICE: No previous actor data, skipping...")
'''if ";" in entry[13]:
xtra = entry[13].split(';')
else:
if entry[13] != None:
xtra = str(entry[13]) + ';'
xtra = xtra.split(';')
print(xtra)'''
try:
"""for thestr in xtra:
print ("INFO: "+thestr)
regex = re.compile(r"\b(\w+)\s*:\s*([^:]*)(?=\s+\w+\s*:|$)")
d.update(regex.findall(thestr))
# turn values into list
for key, val in d.items():
d[key] = val.split(',')"""
movie_search = self.db.get_movies_data("Movies",int(min),int(max),entry[15],entry[16],entry[17],entry[18],entry[19],entry[20])
for movie in movie_search:
movies_list.append(movie)
#print("INFO: Match Found - " + movie)
except Exception as e:
print("ERROR: " + str(e))
pass
#print(xtra)
if (len(movies_list) > 0):
@@ -1123,24 +1140,24 @@ class PseudoChannel():
movie_get = random.choice(movies_list)
movies_list.remove(movie_get)
try:
print("INFO: Movie Title - " + movie_get.title)
the_movie = self.db.get_movie_by_id(movie_get.key)
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get.title)
the_movie = self.db.get_movie(movie_get.title)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[3])
attempt = 1
while the_movie[6] in prev_movies and last_movie in the_movie[3] and attempt < 500:
movie_get = random.choice(movies_list)
try:
print("INFO: Movie Title - " + movie_get.title)
the_movie = self.db.get_movie_by_id(movie_get.key)
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get.title)
the_movie = self.db.get_movie(movie_get.title)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[3])
attempt = attempt + 1
movie_duration = the_movie[4]
attempt = 1
@@ -1149,13 +1166,13 @@ class PseudoChannel():
movie_get = random.choice(movies_list)
movies_list.remove(movie_get)
try:
print("INFO: Movie Title - " + movie_get.title)
the_movie = self.db.get_movie_by_id(movie_get.key)
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get.title)
the_movie = self.db.get_movie(movie_get.title)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[3])
else:
the_movie = self.db.get_random_movie_duration(int(min), int(max))
print("ERROR: Falling back to random movie that fits in the duration window")
@@ -1168,29 +1185,29 @@ class PseudoChannel():
"""Updating movies table in the db with lastPlayedDate entry"""
self.db.update_movies_table_with_last_played_date(the_movie[3])
else:
print("----------------------------------")
print("ERROR: No movies found, re-rolling without xtra args")
d = {}
if len(actors_list) > 0:
for actorName in actors_list:
actorID = actors_list[actorName]
actorID = actorName
print("INFO: Actor from " + last_movie + " selected - " + actorName)
try:
xtra = xtra.append("actor:"+str(actorID))
except:
xtra = ["actor:"+str(actorID)]
try:
for thestr in xtra:
"""for thestr in xtra:
print ("INFO: "+thestr)
regex = re.compile(r"\b(\w+)\s*:\s*([^:]*)(?=\s+\w+\s*:|$)")
d.update(regex.findall(thestr))
# turn values into list
for key, val in d.items():
d[key] = val.split(',')
movie_search = movies.search(None, **d)
d[key] = val.split(',')"""
movie_search = self.db.get_movies_data("Movies",int(min),int(max),None,None,actor_data,None,entry[19],None)
#movie_search = movies.search(None, **d)
for movie in movie_search:
print(str(movie.title))
if movie not in movies_list and movie.title not in last_movie:
print(str(movie.title))
if movie not in movies_list and movie[3] not in last_movie:
movies_list.append(movie)
#print("INFO: Match Found - " + movie)
except Exception as e:
@@ -1204,25 +1221,25 @@ class PseudoChannel():
movie_get = random.choice(movies_list)
movies_list.remove(movie_get)
try:
print("INFO: Movie Title - " + movie_get.title)
the_movie = self.db.get_movie_by_id(movie_get.key)
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get.title)
the_movie = self.db.get_movie(movie_get.title)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[3])
attempt = 1
while the_movie[6] in prev_movies and last_movie in the_movie[3]and attempt < 500:
while the_movie[6] in prev_movies and last_movie in the_movie[3] and attempt < 500:
movie_get = random.choice(movies_list)
movies_list.remove(movie_get)
try:
print("INFO: Movie Title - " + movie_get.title)
the_movie = self.db.get_movie_by_id(movie_get.key)
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get.title)
the_movie = self.db.get_movie(movie_get.title)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[6])
attempt = attempt + 1
attempt = 1
movie_duration = the_movie[4]
@@ -1235,13 +1252,13 @@ class PseudoChannel():
print(e)
movie_get = random.choice(movies_list)
try:
print("INFO: Movie Title - " + movie_get.title)
the_movie = self.db.get_movie_by_id(movie_get.key)
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get.title)
the_movie = self.db.get_movie(movie_get.title)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[3])
else:
the_movie = self.db.get_random_movie_duration(int(min), int(max))
print("ERROR: Falling back to random movie that fits in the duration window")
@@ -1253,8 +1270,32 @@ class PseudoChannel():
movie_duration = the_movie[4]
else:
print("ERROR: Kevin Bacon Mode failed to find a match, selecting random movie")
the_movie = self.db.get_random_movie_duration(int(min), int(max))
movies_list = []
movie_search = self.db.get_movies_data("Movies",int(min),int(max),entry[14],entry[15],entry[16],entry[17],entry[18],entry[19])
for movie in movie_search:
if movie not in movies_list and movie[3] not in last_movie:
movies_list.append(movie)
if len(movies_list) < 1:
print("ERROR: xtra args not found, getting random movie")
movie_search = self.db.get_movies_data("Movies",int(min),int(max),None,None,None,None,entry[19],None)
try:
for movie in movie_search:
if movie not in movies_list and movie[3] not in last_movie:
movies_list.append(movie)
except:
movies_list.append(movie)
movie_get = random.choice(movies_list)
movies_list.remove(movie_get)
try:
print("INFO: Movie Title - " + movie_get[3])
the_movie = self.db.get_movie_by_id(movie_get[6])
except Exception as e:
print("ERROR: Key not found")
print(e)
print("INFO: " + movie_get[3])
the_movie = self.db.get_movie(movie_get[6])
print("INFO: Movie Title - " + str(the_movie[3]))
print("----------------------------------")
movie_duration = the_movie[4]
attempt = 1
while int(movie_duration) < min or movie_duration > max:
@@ -1285,6 +1326,7 @@ class PseudoChannel():
print("NOTICE: Movie Selected - " + the_movie[3])
#get plex metadata
plex_movie = self.PLEX.fetchItem(the_movie[6])
last_data = ""
if str(entry[3]).lower() == "kevinbacon":
actors_list_old = actors_list
actors_list = {}
@@ -1315,7 +1357,7 @@ class PseudoChannel():
the_movie[6], # plex id
the_movie[7], # custom lib name
media_id, # media_id
last_data # show_series_title (for storing kevin bacon data)
last_data # notes (for storing kevin bacon data)
)
self.MEDIA.append(movie)
else:
@@ -1388,6 +1430,8 @@ class PseudoChannel():
self.db.add_media_to_daily_schedule(commercial)
self.db.add_media_to_daily_schedule(entry)
previous_episode = entry
if entry.custom_section_name == "TV Shows" and entry.advance_episode != "no":
self.db.update_shows_table_with_last_episode(entry.show_series_title, entry.plex_media_id)
elif entry.is_strict_time.lower() == "secondary": #This mode starts a show "already in progress" if the previous episode or movie runs past the start time of this one
print("INFO Pre-empt Allowed: {}".format(str(entry.title)))
try:
@@ -1429,6 +1473,8 @@ class PseudoChannel():
self.db.add_media_to_daily_schedule(commercial)
self.db.add_media_to_daily_schedule(entry)
previous_episode = entry
if entry.custom_section_name == "TV Shows" and entry.advance_episode != "no":
self.db.update_shows_table_with_last_episode(entry.show_series_title, entry.plex_media_id)
else:
try:
print("INFO: Variable Time: {}".format(str(entry.title).encode(sys.stdout.encoding, errors='replace')))
@@ -1458,10 +1504,13 @@ class PseudoChannel():
self.db.add_media_to_daily_schedule(commercial)
self.db.add_media_to_daily_schedule(entry)
previous_episode = entry
if entry.custom_section_name == "TV Shows" and entry.advance_episode != "no":
self.db.update_shows_table_with_last_episode(entry.show_series_title, entry.plex_media_id)
else:
self.db.add_media_to_daily_schedule(entry)
previous_episode = entry
if entry.custom_section_name == "TV Shows" and entry.advance_episode != "no":
self.db.update_shows_table_with_last_episode(entry.show_series_title, entry.plex_media_id)
if self.USING_COMMERCIAL_INJECTION:
list_of_commercials = self.commercials.get_commercials_to_place_between_media(
previous_episode,

View File

@@ -36,6 +36,7 @@ class Episode(Media):
show_series_title,
episode_number,
season_number,
advance_episode
):
super(Episode, self).__init__(
@@ -56,3 +57,4 @@ class Episode(Media):
self.show_series_title = show_series_title
self.episode_number = episode_number
self.season_number = season_number
self.advance_episode = advance_episode

View File

@@ -30,7 +30,7 @@ class Movie(Media):
plex_media_id,
custom_section_name,
media_id,
show_series_title
notes,
):
super(Movie, self).__init__(
@@ -48,4 +48,4 @@ class Movie(Media):
media_id
)
self.show_series_title = show_series_title
self.notes = notes

View File

@@ -3,6 +3,7 @@
import sqlite3
import datetime
import time
import random
class PseudoChannelDatabase():
@@ -20,7 +21,7 @@ class PseudoChannelDatabase():
self.cursor.execute('CREATE TABLE IF NOT EXISTS '
'movies(id INTEGER PRIMARY KEY AUTOINCREMENT, '
'unix INTEGER, mediaID INTEGER, title TEXT, duration INTEGER, '
'lastPlayedDate TEXT, plexMediaID TEXT, customSectionName Text)')
'lastPlayedDate TEXT, plexMediaID TEXT, customSectionName Text, rating TEXT, summary TEXT, releaseYear TEXT, genres TEXT, actors TEXT, collections TEXT, studio TEXT)')
self.cursor.execute('CREATE TABLE IF NOT EXISTS '
'videos(id INTEGER PRIMARY KEY AUTOINCREMENT, '
'unix INTEGER, mediaID INTEGER, title TEXT, duration INTEGER, plexMediaID TEXT, customSectionName Text)')
@@ -30,11 +31,11 @@ class PseudoChannelDatabase():
self.cursor.execute('CREATE TABLE IF NOT EXISTS '
'shows(id INTEGER PRIMARY KEY AUTOINCREMENT, '
'unix INTEGER, mediaID INTEGER, title TEXT, duration INTEGER, '
'lastEpisodeTitle TEXT, fullImageURL TEXT, plexMediaID TEXT, customSectionName Text)')
'lastEpisodeTitle TEXT, premierDate TEXT, plexMediaID TEXT, customSectionName Text, rating TEXT, genres TEXT, actors TEXT, similar TEXT, studio TEXT)')
self.cursor.execute('CREATE TABLE IF NOT EXISTS '
'episodes(id INTEGER PRIMARY KEY AUTOINCREMENT, '
'unix INTEGER, mediaID INTEGER, title TEXT, duration INTEGER, '
'episodeNumber INTEGER, seasonNumber INTEGER, showTitle TEXT, plexMediaID TEXT, customSectionName Text)')
'episodeNumber INTEGER, seasonNumber INTEGER, showTitle TEXT, plexMediaID TEXT, customSectionName Text, rating TEXT, airDate TEXT, summary TEXT)')
self.cursor.execute('CREATE TABLE IF NOT EXISTS '
'commercials(id INTEGER PRIMARY KEY AUTOINCREMENT, unix INTEGER, '
'mediaID INTEGER, title TEXT, duration INTEGER, plexMediaID TEXT, customSectionName Text)')
@@ -42,12 +43,12 @@ class PseudoChannelDatabase():
'schedule(id INTEGER PRIMARY KEY AUTOINCREMENT, unix INTEGER, '
'mediaID INTEGER, title TEXT, duration INTEGER, startTime TEXT, '
'endTime TEXT, dayOfWeek TEXT, startTimeUnix INTEGER, section TEXT, '
'strictTime TEXT, timeShift TEXT, overlapMax TEXT, xtra TEXT)')
'strictTime TEXT, timeShift TEXT, overlapMax TEXT, xtra TEXT, rerun INTEGER, year INTEGER, genres TEXT, actors TEXT, collections TEXT, rating TEXT, studio TEXT, seasonEpisode TEXT)')
self.cursor.execute('CREATE TABLE IF NOT EXISTS '
'daily_schedule(id INTEGER PRIMARY KEY AUTOINCREMENT, unix INTEGER, '
'mediaID INTEGER, title TEXT, episodeNumber INTEGER, seasonNumber INTEGER, '
'showTitle TEXT, duration INTEGER, startTime TEXT, endTime TEXT, '
'dayOfWeek TEXT, sectionType TEXT, plexMediaID TEXT, customSectionName TEXT)')
'dayOfWeek TEXT, sectionType TEXT, plexMediaID TEXT, customSectionName TEXT, notes TEXT)')
self.cursor.execute('CREATE TABLE IF NOT EXISTS '
'app_settings(id INTEGER PRIMARY KEY AUTOINCREMENT, version TEXT)')
#index
@@ -91,7 +92,7 @@ class PseudoChannelDatabase():
'daily_schedule(id INTEGER PRIMARY KEY AUTOINCREMENT, unix INTEGER, '
'mediaID INTEGER, title TEXT, episodeNumber INTEGER, seasonNumber INTEGER, '
'showTitle TEXT, duration INTEGER, startTime TEXT, endTime TEXT, '
'dayOfWeek TEXT, sectionType TEXT, plexMediaID TEXT, customSectionName TEXT)')
'dayOfWeek TEXT, sectionType TEXT, plexMediaID TEXT, customSectionName TEXT, notes TEXT)')
self.conn.commit()
def remove_all_scheduled_items(self):
@@ -125,13 +126,20 @@ class PseudoChannelDatabase():
title,
duration,
plexMediaID,
customSectionName):
customSectionName,
rating,
summary,
releaseYear,
genres,
actors,
collections,
studio):
unix = int(time.time())
try:
self.cursor.execute("REPLACE INTO movies "
"(unix, mediaID, title, duration, plexMediaID, customSectionName) VALUES (?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, plexMediaID, customSectionName))
"(unix, mediaID, title, duration, plexMediaID, customSectionName, rating, summary, releaseYear, genres, actors, collections, studio) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, plexMediaID, customSectionName, rating, summary, releaseYear, genres, actors, collections, studio))
self.conn.commit()
# Catch the exception
except Exception as e:
@@ -166,15 +174,20 @@ class PseudoChannelDatabase():
title,
duration,
lastEpisodeTitle,
fullImageURL,
premierDate,
plexMediaID,
customSectionName):
customSectionName,
rating,
genres,
actors,
similar,
studio):
unix = int(time.time())
try:
self.cursor.execute("INSERT OR IGNORE INTO shows "
"(unix, mediaID, title, duration, lastEpisodeTitle, fullImageURL, plexMediaID, customSectionName) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, lastEpisodeTitle, fullImageURL, plexMediaID, customSectionName))
"(unix, mediaID, title, duration, lastEpisodeTitle, premierDate, plexMediaID, customSectionName, rating, genres, actors, similar, studio) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, lastEpisodeTitle, premierDate, plexMediaID, customSectionName, rating, genres, actors, similar, studio))
self.conn.commit()
# Catch the exception
except Exception as e:
@@ -191,13 +204,16 @@ class PseudoChannelDatabase():
seasonNumber,
showTitle,
plexMediaID,
customSectionName):
customSectionName,
rating,
airDate,
summary):
unix = int(time.time())
try:
self.cursor.execute("INSERT INTO episodes "
"(unix, mediaID, title, duration, episodeNumber, seasonNumber, showTitle, plexMediaID, customSectionName) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, episodeNumber, seasonNumber, showTitle, plexMediaID, customSectionName))
"(unix, mediaID, title, duration, episodeNumber, seasonNumber, showTitle, plexMediaID, customSectionName, rating, airDate, summary) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, episodeNumber, seasonNumber, showTitle, plexMediaID, customSectionName, rating, airDate, summary))
self.conn.commit()
# Catch the exception
except Exception as e:
@@ -214,13 +230,16 @@ class PseudoChannelDatabase():
seasonNumber,
showTitle,
plexMediaID,
customSectionName):
customSectionName,
rating,
airDate,
summary):
unix = int(time.time())
try:
self.cursor.execute("REPLACE INTO episodes "
"(unix, mediaID, title, duration, episodeNumber, seasonNumber, showTitle, plexMediaID, customSectionName) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, episodeNumber, seasonNumber, showTitle, plexMediaID, customSectionName))
"(unix, mediaID, title, duration, episodeNumber, seasonNumber, showTitle, plexMediaID, customSectionName, rating, airDate, summary) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, episodeNumber, seasonNumber, showTitle, plexMediaID, customSectionName, rating, airDate, summary))
self.conn.commit()
# Catch the exception
except Exception as e:
@@ -262,13 +281,21 @@ class PseudoChannelDatabase():
strictTime,
timeShift,
overlapMax,
xtra):
xtra,
rerun,
year,
genres,
actors,
collections,
rating,
studio,
seasonEpisode):
unix = int(time.time())
try:
self.cursor.execute("REPLACE INTO schedule "
"(unix, mediaID, title, duration, startTime, endTime, dayOfWeek, startTimeUnix, section, strictTime, timeShift, overlapMax, xtra) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, startTime, endTime, dayOfWeek, startTimeUnix, section, strictTime, timeShift, overlapMax, xtra))
"(unix, mediaID, title, duration, startTime, endTime, dayOfWeek, startTimeUnix, section, strictTime, timeShift, overlapMax, xtra, rerun, year, genres, actors, collections, rating, studio, seasonEpisode) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(unix, mediaID, title, duration, startTime, endTime, dayOfWeek, startTimeUnix, section, strictTime, timeShift, overlapMax, xtra, rerun, year, genres, actors, collections, rating, studio, seasonEpisode))
self.conn.commit()
# Catch the exception
except Exception as e:
@@ -289,15 +316,16 @@ class PseudoChannelDatabase():
dayOfWeek,
sectionType,
plexMediaID,
customSectionName
customSectionName,
notes
):
unix = int(time.time())
try:
self.cursor.execute("INSERT OR REPLACE INTO daily_schedule "
"(unix, mediaID, title, episodeNumber, seasonNumber, "
"showTitle, duration, startTime, endTime, dayOfWeek, sectionType, plexMediaID, customSectionName) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
"showTitle, duration, startTime, endTime, dayOfWeek, sectionType, plexMediaID, customSectionName, notes) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(
unix,
mediaID,
@@ -311,7 +339,8 @@ class PseudoChannelDatabase():
dayOfWeek,
sectionType,
plexMediaID,
customSectionName
customSectionName,
notes
))
self.conn.commit()
# Catch the exception
@@ -330,10 +359,12 @@ class PseudoChannelDatabase():
#print(str("{}: {} - {}".format(media.start_time, media.title, media.custom_section_name)).encode('UTF-8'))
except:
print("ERROR: Not outputting media info due to ascii code issues.")
if media.media_id == 112:
notes = media.notes
else:
notes = ""
if media.__class__.__name__ == "Episode":
seriesTitle = media.show_series_title
elif media.media_id == 112:
seriesTitle = media.show_series_title
else:
seriesTitle = ''
self.add_daily_schedule_to_db(
@@ -348,7 +379,8 @@ class PseudoChannelDatabase():
media.day_of_week,
media.section_type,
media.plex_media_id,
media.custom_section_name
media.custom_section_name,
notes
)
def import_shows_table_by_row(
@@ -435,6 +467,11 @@ class PseudoChannelDatabase():
self.cursor.execute(sql1, (lastEpisodeTitle, '%'+showTitle+'%', ))
self.conn.commit()
def update_shows_table_with_last_episode_by_id(self, showKey, lastEpisodeKey):
sql1 = "UPDATE shows SET lastEpisodeTitle = ? WHERE plexMediaID LIKE ? COLLATE NOCASE"
self.cursor.execute(sql1, (lastEpisodeKey, showKey, ))
self.conn.commit()
def update_movies_table_with_last_played_date(self, movieTitle):
now = datetime.datetime.now()
@@ -558,6 +595,207 @@ class PseudoChannelDatabase():
datalist = list(self.cursor.fetchall())
return datalist
def get_movies_xtra(self,min,max,xtra=None):
xtraArgs = ['rating','releaseYear','decade','genre','actor','collection','studio']
xtraDict = {}
xtraDict['rating']=None
xtraDict['release']=None
xtraDict['decade']=None
xtraDict['genre']=None
xtraDict['actor']=None
xtraDict['collection']=None
xtraDict['studio']=None
print("INFO: xtra = " + str(xtra))
if xtra != None:
for x in xtra:
x = x.replace("'",r"''")
x = x.replace('"',r'""')
x = x.split(':')
if x[0] in xtraArgs and x[1] != None:
xtraDict[x[0]] = []
if ',' in x[1]:
data = x[1].split(',')
for eachArg in data:
xtraDict[x[0]].append(eachArg)
else:
xtraDict[x[0]].append(x[1])
cursor_execute = "SELECT * FROM movies WHERE (duration BETWEEN "+str(min)+" and "+str(max)+")"
if xtraDict['rating'] != None:
cursor_execute = cursor_execute + "and rating LIKE \""+xtraDict['rating'][0]+"\""
if xtraDict['release'] != None:
cursor_execute = cursor_execute + " and releaseYear LIKE "+str(xtraDict['release'][0])+"\""
elif xtraDict['decade'] != None:
dec = str(xtraDict['decade'][0][0:3])
cursor_execute = cursor_execute + "and releaseYear LIKE \""+dec+"%\""
if xtraDict['genre'] != None:
for g in xtraDict['genre']:
if g != '':
cursor_execute = cursor_execute + " and genres LIKE \"%" + g + "%\""
if xtraDict['actor'] != None:
for a in xtraDict['actor']:
if a != '':
cursor_execute = cursor_execute + " and (actors LIKE \"%"+a+"%\")"
if xtraDict['collection'] != None:
for a in xtraDict['collection']:
if a != '':
cursor_execute = cursor_execute + " and (collections LIKE \"%"+a+"%\")"
if xtraDict['studio'] != None:
cursor_execute = cursor_execute + "and studio LIKE \"%"+xtraDict['studio'][0]+"%\""
cursor_execute = cursor_execute + " ORDER BY date(lastPlayedDate) ASC"
print("ACTION: " + cursor_execute)
self.cursor.execute(cursor_execute)
datalist = self.cursor.fetchall()
return datalist
def get_movies_data(self,section,min,max,year,genres,actors,collections,rating,studios):
print("INFO: " + str(min) + ', ' + str(max) + ', ' + str(year) + ', ' + str(genres) + ', ' + str(actors) + ', ' + str(collections) + ', ' + str(rating) + ', ' + str(studios))
genresList = []
actorsList = []
collectionsList = []
studiosList = []
movieRatingsUS = ['G','PG','PG-13','R','NC-17','NR']
movieRatingsAUS = ['AUS-G','AUS-PG','AUS-M','MA15+','R18+','X18+']
movieRatingsCA = ['G','PG','14A','18A','R','A']
movieRatingsUK = ['U','12A','15','18','R18']
tvRatingsUS = ['TV-Y','TV-Y7','TV-G','TV-PG','TV-14','TV-MA','NR']
tvRatingsAUS = ['C','P','G','PG','M','MA15+','AV15+','R18+','E']
tvRatingsCA = ['C','C8','G','PG','14+','18+','Exempt']
tvRatingsUK = ['U','12A','15','18','R18']
print("INFO: "+section)
if rating != None:
ratingsAllowed = []
rating=rating.split(',')
if rating[0] == 'US' and section == 'Movies':
ratingsList = movieRatingsUS
elif rating[0] == 'US' and section == 'TV Shows':
ratingsList = tvRatingsUS
elif rating[0] == 'AUS' and section == 'Movies':
ratingsList = movieRatingsAUS
elif rating[0] == 'AUS' and section == 'TV Shows':
ratingsList = tvRatingsAUS
elif rating[0] == 'CA' and section == 'Movies':
ratingsList = movieRatingsCA
elif rating[0] == 'CA' and section == 'TV Shows':
ratingsList = tvRatingsCA
elif rating[0] == 'UK' and section == 'Movies':
ratingsList = movieRatingsUK
elif rating[0] == 'UK' and section == 'TV Shows':
ratingsList = tvRatingsUK
else:
if section == 'Movies':
ratingsList = movieRatingsUS
elif section == 'TV Shows':
ratingsList = tvRatingsUS
if rating[2] == '=':
print("INFO: Rating = " + rating[0] +', ' + rating[1])
ratingsAllowed.append(rating[1])
elif rating[2] == '<':
ratingPos = ratingsList.index(rating[1])
ratings = ''
while ratingPos >= 0:
ratings = ratings + ', ' + ratingsList[ratingPos]
ratingsAllowed.append(ratingsList[ratingPos])
ratingPos = ratingPos - 1
elif rating[2] == '>':
ratingPos = ratingsList.index(rating[1])
ratings = ''
ratingsListLength = len(ratingsList)
print("INFO: Rating = " + rating[0] +', ')
while ratingPos < ratingsListLength:
ratings = ratings + ', ' + ratingsList[ratingPos]
ratingsAllowed.append(ratingsList[ratingPos])
ratingPos = ratingPos + 1
if year != None:
if year[3] == '*':
print("INFO: Decade = " + str(year))
decade=year
release=None
else:
print("INFO: Year = " + str(year))
release=year
decade=None
else:
release=None
decade=None
if genres != None and ',' in genres:
genres=genres.replace("'",r"''").replace('"',r'""').split(',')
for genre in genres:
print("INFO: Genre = " + genre)
genresList.append(genre)
elif genres != None:
genres=genres.replace("'",r"''").replace('"',r'""')
print("INFO: Genre = " + genres)
genresList.append(genres)
if actors != None:
if type(actors) == list:
for actor in actors:
print("INFO: Actor = " + actor)
actor=actor.replace("'",r"''").replace('"',r'""')
actorsList.append(actor)
else:
print("INFO: Actor = " + actors)
actors=actors.replace("'",r"''").replace('"',r'""')
actorsList.append(actors)
if collections != None and ',' in collections:
collections=collections.replace("'",r"''")
collections=collections.replace('"',r'""')
collections=collections.split(',')
for collection in collections:
print("INFO: Collection = " + collection)
collectionsList.append(collection)
elif collections != None:
collections=collections.replace("'",r"''").replace('"',r'""')
print("INFO: Collection = " + collections)
collectionsList.append(collections)
if studios != None and ',' in studios:
studios=studios.replace("'",r"''").replace('"',r'""').split(',')
for studio in studios:
print("INFO: Studio = " + studio)
studiosList.append(studio)
elif studios != None:
studios=studio.replace("'",r"''").replace('"',r'""')
print("INFO: Studio = " + studios)
studiosList.append(studios)
cursor_execute = "SELECT * FROM movies WHERE (duration BETWEEN "+str(min)+" and "+str(max)+")"
if rating != None:
if len(ratingsAllowed) == 1:
cursor_execute = cursor_execute + " and rating LIKE \""+rating[1]+"\""
elif len(ratingsAllowed) > 0:
c = 0
for r in ratingsAllowed:
if c == 0:
cursor_execute = cursor_execute + " and (rating IN (\""+r+"\""
else:
cursor_execute = cursor_execute + ", \""+r+"\""
c = c + 1
cursor_execute = cursor_execute + "))"
if release != None:
cursor_execute = cursor_execute + " and releaseYear LIKE "+str(release)+"%\""
elif decade != None:
dec = str(decade[0:3])
cursor_execute = cursor_execute + " and releaseYear LIKE \""+dec+"%\""
if genresList != None:
for g in genresList:
if g != '':
cursor_execute = cursor_execute + " and genres LIKE \"%" + g + "%\""
if actorsList != None:
for a in actorsList:
if a != '':
cursor_execute = cursor_execute + " and (actors LIKE \"%"+a+"%\")"
if collectionsList != None:
for c in collectionsList:
if c != '':
cursor_execute = cursor_execute + " and (collections LIKE \"%"+c+"%\")"
if studiosList != None:
for s in studiosList:
if s != '':
cursor_execute = cursor_execute + "and studio LIKE \"%"+s+"%\""
cursor_execute = cursor_execute + " ORDER BY date(lastPlayedDate) ASC"
print("ACTION: " + cursor_execute)
self.cursor.execute(cursor_execute)
datalist = self.cursor.fetchall()
return datalist
def get_specific_episode(self, tvshow, season=None, episode=None):
if season is None and episode is None:
print("ERROR: Season and Episode Numbers Not Found")
@@ -586,6 +824,14 @@ class PseudoChannelDatabase():
first_episode = self.cursor.fetchone()
return first_episode
def get_first_episode_by_id(self, tvshow):
sql = ("SELECT id, unix, mediaID, title, duration, MIN(episodeNumber), MIN(seasonNumber), "
"showTitle, plexMediaID, customSectionName FROM episodes WHERE ( mediaID LIKE ?) COLLATE NOCASE")
self.cursor.execute(sql, (tvshow, ))
first_episode = self.cursor.fetchone()
return first_episode
'''
*
* When incrementing episodes in a series I am advancing by "id"
@@ -596,7 +842,13 @@ class PseudoChannelDatabase():
self.cursor.execute(sql, (episodeTitle, ))
episode_id = self.cursor.fetchone()
return episode_id
def get_episode_from_plexMediaID(self,plexMediaID):
sql = "SELECT * FROM episodes WHERE (plexMediaID LIKE ?) COLLATE NOCASE"
self.cursor.execute(sql, (plexMediaID, ))
episode = self.cursor.fetchone()
return episode
####mutto233 made this one#### UPDATED 5/2/2020
def get_episode_id_alternate(self,plexMediaID,series):
sql = "SELECT id FROM episodes WHERE (showTitle LIKE ? AND plexMediaID LIKE ?) COLLATE NOCASE"
@@ -605,6 +857,18 @@ class PseudoChannelDatabase():
return episode_id
####mutto233 made this one####
def get_episode_from_id(self,ID):
print("NOTICE: Getting episode of by matching ID")
sql = ("SELECT * FROM episodes WHERE ( id = "+str(ID)+") ORDER BY id LIMIT 1 COLLATE NOCASE")
self.cursor.execute(sql)
return self.cursor.fetchone()
def get_episode_id_by_show_id(self,plexMediaID,series):
sql = "SELECT id FROM episodes WHERE (mediaID LIKE ? AND plexMediaID LIKE ?) COLLATE NOCASE"
self.cursor.execute(sql, (series,plexMediaID, ))
episode_id = self.cursor.fetchone()
return episode_id
def get_random_episode(self):
sql = "SELECT * FROM episodes WHERE id IN (SELECT id FROM episodes ORDER BY RANDOM() LIMIT 1)"
@@ -663,6 +927,225 @@ class PseudoChannelDatabase():
self.cursor.execute(sql, (min, max, ))
return self.cursor.fetchone()
def get_random_show_data(self,section,min,max,airDate,genres,actors,similar,rating,studios):
print("INFO: " + str(min) + ', ' + str(max) + ', ' + str(airDate) + ', ' + str(genres) + ', ' + str(actors) + ', ' + str(similar) + ', ' + str(rating) + ', ' + str(studios))
if airDate != None:
if str(airDate)[3] == '*':
print("INFO: Decade = " + str(airDate)[0:3])
datestring=str(airDate)[0:3]
else:
print("INFO: Air Date = " + str(airDate))
datestring=airDate
else:
datestring = None
genresList = []
actorsList = []
similarList = []
studiosList = []
tvRatingsUS = ['TV-Y','TV-Y7','TV-G','TV-PG','TV-14','TV-MA','NR']
tvRatingsAUS = ['C','P','G','PG','M','MA15+','AV15+','R18+','E']
tvRatingsCA = ['C','C8','G','PG','14+','18+','Exempt']
tvRatingsUK = ['U','12A','15','18','R18']
print("INFO: "+section)
if rating != None:
ratingsAllowed = []
rating=rating.split(',')
if rating[0] == 'US':
ratingsList = tvRatingsUS
elif rating[0] == 'AUS':
ratingsList = tvRatingsAUS
elif rating[0] == 'CA':
ratingsList = tvRatingsCA
elif rating[0] == 'UK':
ratingsList = tvRatingsUK
else:
ratingsList = tvRatingsUS
if rating[2] == '=':
print("INFO: Rating = " + rating[0] +', ' + rating[1])
ratingsAllowed.append(rating[1])
elif rating[2] == '<':
ratingPos = ratingsList.index(rating[1])
ratings = ''
while ratingPos >= 0:
ratings = ratings + ', ' + ratingsList[ratingPos]
ratingsAllowed.append(ratingsList[ratingPos])
ratingPos = ratingPos - 1
elif rating[2] == '>':
ratingPos = ratingsList.index(rating[1])
ratings = ''
ratingsListLength = len(ratingsList)
print("INFO: Rating = " + rating[0] +', '+rating[1])
while ratingPos < ratingsListLength:
ratings = ratings + ', ' + ratingsList[ratingPos]
ratingsAllowed.append(ratingsList[ratingPos])
ratingPos = ratingPos + 1
if genres != None and ',' in genres:
genres=genres.replace("'",r"''").replace('"',r'""').split(',')
for genre in genres:
print("INFO: Genre = " + genre)
genresList.append(genre)
elif genres != None:
genres=genres.replace("'",r"''").replace('"',r'""')
print("INFO: Genre = " + genres)
genresList.append(genres)
if actors != None:
if type(actors) == list:
for actor in actors:
print("INFO: Actor = " + actor)
actor=actor.replace("'",r"''").replace('"',r'""')
actorsList.append(actor)
else:
print("INFO: Actor = " + actors)
actors=actors.replace("'",r"''").replace('"',r'""')
actorsList.append(actors)
if similar != None and ',' in similar:
similar=similar.replace("'",r"''")
similar=similar.replace('"',r'""')
similar=similar.split(',')
for s in similar:
print("INFO: Similar = " + s)
similarList.append(s)
elif similar != None:
similar=similar.replace("'",r"''").replace('"',r'""')
print("INFO: Similar = " + similar)
similarList.append(similar)
if studios != None and ',' in studios:
studios=studios.replace("'",r"''").replace('"',r'""').split(',')
for studio in studios:
print("INFO: Studio = " + studio)
studiosList.append(studio)
elif studios != None:
studios=studio.replace("'",r"''").replace('"',r'""')
print("INFO: Studio = " + studios)
studiosList.append(studios)
cursor_execute = "SELECT * FROM shows WHERE (customSectionName LIKE \"TV Shows\")"
leading_and = True
if rating != None:
if len(ratingsAllowed) == 1:
cursor_execute = cursor_execute + " and rating LIKE \""+rating[1]+"\""
leading_and = True
elif len(ratingsAllowed) > 0:
c = 0
for r in ratingsAllowed:
if c == 0:
cursor_execute = cursor_execute + " and (rating IN (\""+r+"\""
else:
cursor_execute = cursor_execute + ", \""+r+"\""
c = c + 1
cursor_execute = cursor_execute + "))"
if genresList != None:
for g in genresList:
if g != '':
cursor_execute = cursor_execute + " and genres LIKE \"%" + g + "%\""
leading_and = True
if actorsList != None:
for a in actorsList:
if a != '':
cursor_execute = cursor_execute + " and (actors LIKE \"%"+a+"%\")"
leading_and = True
if similarList != None:
for sim in similarList:
if sim != '':
cursor_execute = cursor_execute + " and (similar LIKE \"%"+sim+"%\")"
leading_and = True
if studiosList != None:
for s in studiosList:
if s != '':
cursor_execute = cursor_execute + " and studio LIKE \"%"+s+"%\""
leading_and = True
cursor_execute = cursor_execute + " ORDER BY mediaID ASC"
print("ACTION: " + cursor_execute)
self.cursor.execute(cursor_execute)
showslist = self.cursor.fetchall()
if datestring != None:
episode_execute = "SELECT * FROM episodes WHERE (duration BETWEEN "+str(min)+" and "+str(max)+") and airDate LIKE \""+str(datestring)+"%\" ORDER BY mediaID ASC"
print("INFO: " + episode_execute)
self.cursor.execute(episode_execute)
episodelist = self.cursor.fetchall()
datalist = []
else:
episode_execute = "SELECT * FROM episodes WHERE (duration BETWEEN "+str(min)+" and "+str(max)+") ORDER BY mediaID ASC"
print("INFO: " + episode_execute)
self.cursor.execute(episode_execute)
episodelist = self.cursor.fetchall()
datalist = []
for one_episode in episodelist:
for one_show in showslist:
if one_episode[2] == one_show[2] and one_show not in datalist:
datalist.append(one_show)
print("INFO: " + str(len(showslist)) + " shows found.")
if datalist != []:
print("INFO: " + str(len(datalist)) + " matching shows found")
the_show = random.choice(datalist)
else:
print("INFO: NO MATCHING SHOWS FOUND, TRYING AGAIN WITHOUT SOME METADATA")
#get shows list with only length, rating and date filters
cursor_execute = "SELECT * FROM shows WHERE (customSectionName LIKE \"TV Shows\")"
if rating != None:
if len(ratingsAllowed) == 1:
cursor_execute = cursor_execute + " and rating LIKE \""+rating[1]+"\""
leading_and = True
elif len(ratingsAllowed) > 0:
c = 0
for r in ratingsAllowed:
if c == 0:
cursor_execute = cursor_execute + " and (rating IN (\""+r+"\""
else:
cursor_execute = cursor_execute + ", \""+r+"\""
c = c + 1
cursor_execute = cursor_execute + "))"
cursor_execute = cursor_execute + " ORDER BY mediaID ASC"
print("ACTION: " + cursor_execute)
self.cursor.execute(cursor_execute)
showslist = self.cursor.fetchall()
episode_execute = "SELECT * FROM episodes WHERE (duration BETWEEN "+str(min)+" and "+str(max)+") ORDER BY mediaID ASC"
print("INFO: " + episode_execute)
self.cursor.execute(episode_execute)
episodelist = self.cursor.fetchall()
datalist = []
for one_episode in episodelist:
for one_show in showslist:
if one_episode[2] == one_show[2] and one_show not in datalist:
datalist.append(one_show)
print("INFO: " + str(len(showslist)) + " shows found.")
if datalist != []:
print("INFO: " + str(len(datalist)) + " matching shows found")
the_show = random.choice(datalist)
#print(str(the_show))
return the_show
def get_random_episode_of_show_by_data(self, seriesID, min, max, date, season=None, episode=None):
print("INFO: "+ str(seriesID) + ', ' + str(min) + ', ' + str(max) + ', ' + str(date) + ', Season: ' + str(season) + ', Episode: ' + str(episode))
cursor_execute = "SELECT * FROM episodes WHERE mediaID LIKE \""+str(seriesID)+"\" AND duration BETWEEN \""+str(min)+"\" and \""+str(max)+"\""
if season != None:
cursor_execute = cursor_execute + " and seasonNumber LIKE \""+str(season)+"\""
if episode != None:
cursor_execute = cursor_execute + " and episodeNumber LIKE \""+str(episode)+"\""
if date != None:
if str(date)[3] == '*':
date = str(date)[0:3]
cursor_execute = cursor_execute + " and airDate LIKE \""+str(date)+"%\""
cursor_execute = cursor_execute + " ORDER BY RANDOM() LIMIT 1"
print("INFO: " + cursor_execute)
self.cursor.execute(cursor_execute)
return self.cursor.fetchone()
def get_random_episode_of_show_by_data_alt(self, series, min, max, date, season=None, episode=None):
print("INFO: "+ str(series) + ', ' + str(min) + ', ' + str(max) + ', ' + str(date) + ', Season: ' + str(season) + ', Episode: ' + str(episode))
cursor_execute = "SELECT * FROM episodes WHERE showTitle LIKE \""+series+"\" AND duration BETWEEN \""+str(min)+"\" and \""+str(max)+"\""
if season != None:
cursor_execute = cursor_execute + " and seasonNumber LIKE \""+str(season)+"\""
if episode != None:
cursor_execute = cursor_execute + " and episodeNumber LIKE \""+str(episode)+"\""
if date != None:
cursor_execute = cursor_execute + " and airDate LIKE \""+date+"%\""
cursor_execute = cursor_execute + " ORDER BY RANDOM() LIMIT 1"
print("INFO: " + cursor_execute)
self.cursor.execute(cursor_execute)
random_episode = self.cursor.fetchone()
print("INFO: "+str(random_episode))
return random_episode
####mutto233 made this one####
def get_next_episode(self, series):
'''
@@ -692,7 +1175,7 @@ class PseudoChannelDatabase():
* Add this episdoe title to the "shows" table for the queue functionality to work
*
'''
self.update_shows_table_with_last_episode(series, first_episode_title)
#self.update_shows_table_with_last_episode(series, first_episode_title)
return first_episode
elif last_title_list:
@@ -709,19 +1192,19 @@ class PseudoChannelDatabase():
try:
print("NOTICE: Getting next episode of "+series.upper()+ " by matching ID and series or playlist name")
sql = ("SELECT * FROM episodes WHERE ( id > "+str(self.get_episode_id_alternate(last_title_list[0],series)[0])+
" AND showTitle LIKE ? ) ORDER BY seasonNumber LIMIT 1 COLLATE NOCASE")
" AND showTitle LIKE ? ) ORDER BY id LIMIT 1 COLLATE NOCASE")
except TypeError:
try:
print("NOTICE: Getting next episode by matching title")
sql = ("SELECT * FROM episodes WHERE ( id > "+str(self.get_episode_id(last_title_list[0])[0])+
" AND showTitle LIKE ? ) ORDER BY seasonNumber LIMIT 1 COLLATE NOCASE")
" AND showTitle LIKE ? ) ORDER BY id LIMIT 1 COLLATE NOCASE")
print("NOTICE: We have an old school last episode title. Using old method, then converting to new method")
except TypeError:
sql = ""
print("ERROR: For some reason, episode was not stored correctly. Maybe you updated your database and lost last episode? Reverting to first episode")
if sql=="":
first_episode = self.get_first_episode(series)
self.update_shows_table_with_last_episode(series, first_episode[8])
#self.update_shows_table_with_last_episode(series, first_episode[8])
return first_episode
self.cursor.execute(sql, (series, ))
@@ -739,12 +1222,220 @@ class PseudoChannelDatabase():
# self.cursor.execute(sql, (series, ))
if next_episode != None:
self.update_shows_table_with_last_episode(series, next_episode[8])
#self.update_shows_table_with_last_episode(series, next_episode[8])
return next_episode
else:
print("NOTICE: Not grabbing next episode restarting series, series must be over. Restarting from episode 1.")
first_episode = self.get_first_episode(series)
self.update_shows_table_with_last_episode(series, first_episode[8])
#self.update_shows_table_with_last_episode(series, first_episode[8])
return first_episode
def get_next_episode_alt(self, series, ID):
'''
*
* As a way of storing a "queue", I am storing the *next episode title in the "shows" table so I can
* determine what has been previously scheduled for each show
*
*
* If the last episode stored in the "shows" table is empty, then this is probably a first run...
*
'''
if ID == '':
'''
*
* Find the first episode of the series
*
'''
first_episode = self.get_first_episode(series)
first_episode_title = first_episode[8]
'''
*
* Add this episdoe title to the "shows" table for the queue functionality to work
*
'''
return first_episode
else:
'''
*
* The last episode stored in the "shows" table was not empty... get the next episode in the series
*
'''
"""
*
* If this isn't a first run, then grabbing the next episode by incrementing id
*
"""
try:
print("NOTICE: Getting next episode of "+series.upper()+ " by matching ID and series or playlist name")
sql = ("SELECT * FROM episodes WHERE ( id > "+str(ID)+
" AND showTitle LIKE ? ) ORDER BY id LIMIT 1 COLLATE NOCASE")
except TypeError:
try:
print("NOTICE: Getting next episode by matching ID and series or playlist name")
sql = ("SELECT * FROM episodes WHERE ( id > "+str(ID)+
" AND showTitle LIKE ? ) ORDER BY id LIMIT 1 COLLATE NOCASE")
print("NOTICE: We have an old school last episode title. Using old method, then converting to new method")
except TypeError:
sql = ""
print("ERROR: For some reason, episode was not stored correctly. Maybe you updated your database and lost last episode? Reverting to first episode")
if sql=="":
first_episode = self.get_first_episode(series)
#self.update_shows_table_with_last_episode(series, first_episode[8])
return first_episode
self.cursor.execute(sql, (series, ))
'''
*
* Try and advance to the next episode in the series, if it returns None then that means it reached the end...
*
'''
next_episode = self.cursor.fetchone()
if next_episode != None:
#self.update_shows_table_with_last_episode(series, next_episode[8])
return next_episode
else:
print("NOTICE: Not grabbing next episode restarting series, series must be over. Restarting from episode 1.")
first_episode = self.get_first_episode(series)
#self.update_shows_table_with_last_episode(series, first_episode[8])
return first_episode
def get_last_episode(self, series):
'''
*
* As a way of storing a "queue", I am storing the *next episode title in the "shows" table so I can
* determine what has been previously scheduled for each show
*
'''
self.cursor.execute("SELECT lastEpisodeTitle FROM shows WHERE mediaID LIKE ? COLLATE NOCASE", (series, ))
last_title_list = self.cursor.fetchone()
'''
*
* If the last episode stored in the "shows" table is empty, then this is probably a first run...
*
'''
if last_title_list and last_title_list[0] == '':
'''
*
* Find the first episode of the series
*
'''
first_episode = self.get_first_episode_by_id(series)
first_episode_title = first_episode[8]
'''
*
* Add this episdoe title to the "shows" table for the queue functionality to work
*
'''
return first_episode
elif last_title_list:
'''
*
* The last episode stored in the "shows" table was not empty... get the next episode in the series
*
'''
"""
*
* If this isn't a first run, then grabbing the next episode by incrementing id
*
"""
try:
print("NOTICE: Getting last episode of "+str(series)+ " by matching ID and series or playlist ID")
sql = ("SELECT * FROM episodes WHERE ( id = "+str(self.get_episode_id_by_show_id(last_title_list[0],series)[0])+
" AND mediaID LIKE ? ) ORDER BY id LIMIT 1 COLLATE NOCASE")
except TypeError as e:
print("ERROR: " + str(e))
try:
print("NOTICE: Getting last episode by matching title")
sql = ("SELECT * FROM episodes WHERE ( id = "+str(self.get_episode_id(last_title_list[0])[0])+
" AND mediaID LIKE ? ) ORDER BY id LIMIT 1 COLLATE NOCASE")
print("NOTICE: We have an old school last episode title. Using old method, then converting to new method")
except TypeError:
sql = ""
print("ERROR: For some reason, episode was not stored correctly. Maybe you updated your database and lost last episode? Reverting to first episode")
if sql=="":
first_episode = self.get_first_episode_by_id(series)
return first_episode
self.cursor.execute(sql, (series, ))
next_episode = self.cursor.fetchone()
if next_episode != None:
return next_episode
else:
print("NOTICE: Not grabbing next episode restarting series, series must be over. Restarting from episode 1.")
first_episode = self.get_first_episode_by_id(series)
return first_episode
def get_last_episode_alt(self, series):
'''
*
* As a way of storing a "queue", I am storing the *next episode title in the "shows" table so I can
* determine what has been previously scheduled for each show
*
'''
self.cursor.execute("SELECT lastEpisodeTitle FROM shows WHERE title LIKE ? COLLATE NOCASE", (series, ))
last_title_list = self.cursor.fetchone()
'''
*
* If the last episode stored in the "shows" table is empty, then this is probably a first run...
*
'''
if last_title_list and last_title_list[0] == '':
'''
*
* Find the first episode of the series
*
'''
first_episode = self.get_first_episode(series)
first_episode_title = first_episode[8]
'''
*
* Add this episdoe title to the "shows" table for the queue functionality to work
*
'''
return first_episode
elif last_title_list:
'''
*
* The last episode stored in the "shows" table was not empty... get the next episode in the series
*
'''
"""
*
* If this isn't a first run, then grabbing the next episode by incrementing id
*
"""
try:
print("NOTICE: Getting last episode of "+str(series)+ " by matching ID and series or playlist name")
sql = ("SELECT * FROM episodes WHERE ( id = "+str(self.get_episode_id_alternate(last_title_list[0],series)[0])+
" AND showTitle LIKE ? ) ORDER BY id LIMIT 1 COLLATE NOCASE")
except TypeError as e:
print("ERROR: " + str(e))
try:
print("NOTICE: Getting last episode by matching title")
sql = ("SELECT * FROM episodes WHERE ( id = "+str(self.get_episode_id(last_title_list[0])[0])+
" AND showTitle LIKE ? ) ORDER BY id LIMIT 1 COLLATE NOCASE")
print("NOTICE: We have an old school last episode title. Using old method, then converting to new method")
except TypeError:
sql = ""
print("ERROR: For some reason, episode was not stored correctly. Maybe you updated your database and lost last episode? Reverting to first episode")
if sql=="":
first_episode = self.get_first_episode(series)
return first_episode
self.cursor.execute(sql, (series, ))
next_episode = self.cursor.fetchone()
if next_episode != None:
return next_episode
else:
print("NOTICE: Not grabbing next episode restarting series, series must be over. Restarting from episode 1.")
first_episode = self.get_first_episode_by_id(series)
return first_episode
def get_commercial(self, title):

View File

@@ -188,14 +188,19 @@ for channel_dir in channel_dirs:
endloop = 1
else:
for i in range(0,len(schedule)):
sql = "INSERT INTO schedule(id,unix,mediaID,title,duration,startTime,endTime,dayOfWeek,startTimeUnix,section,strictTime,timeShift,overlapMax,xtra) \
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
sql = "INSERT INTO schedule(id,unix,mediaID,title,duration,startTime,endTime,dayOfWeek,startTimeUnix,section,strictTime,timeShift,overlapMax,xtra,rerun,year,genres,actors,collections,rating,studio,seasonEpisode) \
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
table.execute(sql,schedule[i])
for i in range(0,len(daily_schedule)):
sql = "INSERT INTO daily_schedule(id,unix,mediaID,title,episodeNumber,seasonNumber,showTitle,duration,startTime,endTime,dayOfWeek,sectionType,plexMediaID,customSectionName) \
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
table.execute(sql,daily_schedule[i])
try:
sql = "INSERT INTO daily_schedule(id,unix,mediaID,title,episodeNumber,seasonNumber,showTitle,duration,startTime,endTime,dayOfWeek,sectionType,plexMediaID,customSectionName,notes) \
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
table.execute(sql,daily_schedule[i])
except Exception as e:
print("ERROR: "+str(e))
sql = "INSERT INTO daily_schedule(id,unix,mediaID,title,episodeNumber,seasonNumber,showTitle,duration,startTime,endTime,dayOfWeek,sectionType,plexMediaID,customSectionName) \
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
table.execute(sql,daily_schedule[i])
# Step FIVE: Remove any media not in the directories set of commerical archives
print("NOTICE: Trimming database at " + db_path)