From bfc7c7452276106509c7a6e54a920a29d29a9f77 Mon Sep 17 00:00:00 2001 From: jakewaldron Date: Mon, 16 Mar 2015 20:57:53 -0700 Subject: [PATCH] New Features and Bug Fixes UTF-8 Characters now supported in the config file Can now filter out specific libraries from being included Can now control the fields shown for each title and can filter by each specific field --- README.md | 10 ++ scripts/config.conf | 170 +++++++++++++++++++++++++++ scripts/plexEmail.py | 268 ++++++++++++++++++++++++++----------------- 3 files changed, 344 insertions(+), 104 deletions(-) diff --git a/README.md b/README.md index 1eef704..ee2e516 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,16 @@ The config file is in the scripts folder. Before first run of the script, pleas * filter_show_shows - True to show recently added TV shows * filter_show_seasons - True to show recently added TV seasons * filter_show_episodes - True to show recently added TV episodes +* filter_libraries - A list of library names to filter out - ['Home Videos', 'Private'] +* filter_sections_movies - Movie specific filters +* filter_sections_TV - TV specific filters + * Possible fields: tagline, summary, content_rating, duration, year, rating, studio, tags_genre, tags_director, tags_star + * order - The order this field should appear for each title + * show - Whether or not this field should be shown for each title + * preText - The text that should be added before this field for each title + * postText - The text that should be added after this field for each title + * include - A list of values that are each title must match at least one to be shown + * exclude - A list of values that if the title matches any of, will not be shown #####Messages * msg_email_teaser - Teaser text on the email diff --git a/scripts/config.conf b/scripts/config.conf index a59295c..24161e8 100644 --- a/scripts/config.conf +++ b/scripts/config.conf @@ -1,3 +1,4 @@ +# This Python file uses the following encoding: utf-8 ##Folder Paths # Windows Example: 'C:\\Users\\{User Name}\\AppData\\Local\\' # Linux Example: '/var/lib/plexmediaserver/Library/Application Support/' @@ -22,6 +23,8 @@ upload_cloudinary_api_secret = '' ##Web web_enabled = True +#This will not create the index.html file, but will still save the images to the images folder. (Useful for when you only want to send an email) +web_only_save_images = False web_domain = '' web_path = 'plexemail' web_delete_previous_images = False @@ -47,6 +50,173 @@ filter_show_movies = True filter_show_shows = True filter_show_seasons = True filter_show_episodes = True +#Name of libraries to filter out - ['Home Videos', 'Private'] +filter_libraries = [] +#The sections to include and ordering - tagline, summary, content_rating, duration, year, rating, studio, tags_genre, tags_director, tags_star +filter_sections_movies = { + 'tagline':{ + 'order':1, + 'show': True, + 'preText':'', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'summary':{ + 'order':2, + 'show': True, + 'preText':'', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'tags_genre':{ + 'order':3, + 'show': True, + 'preText':'Genre(s): ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'tags_director':{ + 'order':4, + 'show': False, + 'preText':'Director: ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'tags_star':{ + 'order':5, + 'show': True, + 'preText':'Star(s): ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'content_rating':{ + 'order':6, + 'show': False, + 'preText':'Content Rating: ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'duration':{ + 'order':7, + 'show': True, + 'preText':'Runtime: ', + 'postText':' minutes', + 'include':[], + 'exclude':[] + }, + 'year':{ + 'order':8, + 'show': True, + 'preText':'Year: ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'studio':{ + 'order':9, + 'show': False, + 'preText':'Studio: ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'rating':{ + 'order':10, + 'show': True, + 'preText':'Rating: ', + 'postText':'%', + 'include':[], + 'exclude':[] + } + } +filter_sections_TV = { + 'tagline':{ + 'order':1, + 'show': True, + 'preText':'', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'summary':{ + 'order':2, + 'show': True, + 'preText':'', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'tags_genre':{ + 'order':3, + 'show': False, + 'preText':'Genre(s): ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'tags_director':{ + 'order':4, + 'show': False, + 'preText':'Director: ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'tags_star':{ + 'order':5, + 'show': False, + 'preText':'Star(s): ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'content_rating':{ + 'order':6, + 'show': False, + 'preText':'Content Rating: ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'duration':{ + 'order':7, + 'show': True, + 'preText':'Runtime: ', + 'postText':' minutes', + 'include':[], + 'exclude':[] + }, + 'year':{ + 'order':8, + 'show': False, + 'preText':'Year: ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'studio':{ + 'order':9, + 'show': True, + 'preText':'Network: ', + 'postText':'', + 'include':[], + 'exclude':[] + }, + 'rating':{ + 'order':10, + 'show': False, + 'preText':'Rating: ', + 'postText':'%', + 'include':[], + 'exclude':[] + } + } ##Messages msg_email_teaser = 'Check out this week\'s releases from Plex: {website} - {past_day} - {current_day}' diff --git a/scripts/plexEmail.py b/scripts/plexEmail.py index 6103e43..09182bf 100644 --- a/scripts/plexEmail.py +++ b/scripts/plexEmail.py @@ -22,6 +22,15 @@ def replaceConfigTokens(): ## The below code is for backwards compatibility + if ('filter_sections_movies' not in config): + config['filter_include_sections_movies'] = {'tagline':{'order':1,'show':True,'preText':'','postText':'','include':[],'exclude':[]},'summary':{'order':2,'show':True,'preText':'','postText':'','include':[],'exclude':[]},'tags_genre':{'order':3,'show':True,'preText':'Genre(s): ','postText':'','include':[],'exclude':[]},'tags_director':{'order':4,'show':False,'preText':'Director: ','postText':'','include':[],'exclude':[]},'tags_star':{'order':5,'show':True,'preText':'Star(s): ','postText':'','include':[],'exclude':[]},'content_rating':{'order':6,'show':False,'preText':'ContentRating: ','postText':'','include':[],'exclude':[]},'duration':{'order':7,'show':True,'preText':'Runtime: ','postText':' minutes','include':[],'exclude':[]},'year':{'order':8,'show':True,'preText':'Year: ','postText':'','include':[],'exclude':[]},'studio':{'order':9,'show':False,'preText':'Studio: ','postText':'','include':[],'exclude':[]},'rating':{'order':10,'show':True,'preText':'Rating: ','postText':'%','include':[],'exclude':[]}} + + if ('filter_sections_TV' not in config): + config['filter_include_sections_TV'] = {'tagline':{'order':1,'show':True,'preText':'','postText':'','include':[],'exclude':[]},'summary':{'order':2,'show':True,'preText':'','postText':'','include':[],'exclude':[]},'tags_genre':{'order':3,'show':False,'preText':'Genre(s): ','postText':'','include':[],'exclude':[]},'tags_director':{'order':4,'show':False,'preText':'Director: ','postText':'','include':[],'exclude':[]},'tags_star':{'order':5,'show':False,'preText':'Star(s): ','postText':'','include':[],'exclude':[]},'content_rating':{'order':6,'show':False,'preText':'ContentRating: ','postText':'','include':[],'exclude':[]},'duration':{'order':7,'show':True,'preText':'Runtime: ','postText':' minutes','include':[],'exclude':[]},'year':{'order':8,'show':False,'preText':'Year: ','postText':'','include':[],'exclude':[]},'studio':{'order':9,'show':True,'preText':'Network: ','postText':'','include':[],'exclude':[]},'rating':{'order':10,'show':False,'preText':'Rating: ','postText':'%','include':[],'exclude':[]}} + + if ('web_only_save_images' not in config): + config['web_only_save_images'] = False + if ('filter_show_movies' not in config): config['filter_show_movies'] = True @@ -113,11 +122,26 @@ def replaceConfigTokens(): if (config['web_folder'].rfind(os.path.sep) < len(config['web_folder']) - len(os.path.sep)): config['web_folder'] = config['web_folder'] + os.path.sep + +def convertToHumanReadable(valuesToConvert): + convertedValues = {} + for value in valuesToConvert: + convertedValues[value] = valuesToConvert[value] + convertedValues[value + '_filter'] = [valuesToConvert[value]] + if (not valuesToConvert[value]): + continue + if (value == 'duration'): + convertedValues[value] = str(valuesToConvert[value] // 1000 // 60) + elif (value == 'rating'): + convertedValues[value] = str(int(valuesToConvert[value] * 10)) + elif (value == 'tags_genre' or value == 'tags_star' or value == 'tags_director'): + convertedValues[value + '_filter'] = valuesToConvert[value].split('|') + convertedValues[value] = valuesToConvert[value].replace('|', ', ') + return convertedValues def deleteImages(): folder = config['web_folder'] + config['web_path'] + os.path.sep + 'images' + os.path.sep for file in os.listdir(folder): - print folder, file if (file.endswith('.jpg')): os.remove(folder + file) @@ -500,10 +524,15 @@ def createWebHTML(): parser = argparse.ArgumentParser(description='This script aggregates all new TV and movie releases for the past x days then writes to your web directory and sends out an email.') parser.add_argument('-c','--configfile', help='The path to a config file to be used in the running of this instance of the script.', default=os.path.dirname(os.path.realpath(sys.argv[0])) + os.path.sep + 'config.conf', required=False) +parser.add_argument('-t','--test', help='Run this script in test mode - Sends email only to sender', action='store_true') args = vars(parser.parse_args()) + +testMode = False if ('configfile' in args): configFile = args['configfile'] +if ('test' in args): + testMode = args['test'] if (not os.path.isfile(configFile)): print configFile + ' does not exist' @@ -529,21 +558,29 @@ def createWebHTML(): con = sqlite3.connect(DATABASE_FILE) con.text_factory = str -with con: - - #if ('date_use_hours' in config and config['date_use_hours']): - #dateSearch = 'datetime(\'now\', \'localtime\', \'-' + str(config['date_hours_back_to_search']) + ' hours\')' - #else: - #dateSearch = 'datetime(\'now\', \'localtime\', \'-' + str(config['date_days_back_to_search']) + ' days\')' +with con: + libraryFilter = '' + if (config['filter_libraries']): + cur = con.cursor() + cur.execute('SELECT id, name FROM library_sections;') + for row in cur: + if (row[1].lower() in (library.lower() for library in config['filter_libraries'])): + if (libraryFilter == ''): + libraryFilter = ' AND (' + libraryFilter += 'library_section_id != ' + str(row[0]) + else: + libraryFilter += ' OR library_section_id != ' + str(row[0]) + if (libraryFilter != ''): + libraryFilter += ') ' dateSearch = 'datetime(\'now\', \'localtime\', \'-' + str(config['date_days_back_to_search']) + ' days\', \'-' + str(config['date_hours_back_to_search']) + ' hours\', \'-' + str(config['date_minutes_back_to_search']) + ' minutes\')' cur = con.cursor() - cur.execute("SELECT id, parent_id, metadata_type, title, title_sort, original_title, rating, tagline, summary, content_rating, duration, user_thumb_url, tags_genre, tags_director, tags_star, year, hash, [index], studio FROM metadata_items WHERE added_at >= " + dateSearch + " AND metadata_type >= 1 AND metadata_type <= 4 ORDER BY title_sort;") + cur.execute("SELECT id, parent_id, metadata_type, title, title_sort, original_title, rating, tagline, summary, content_rating, duration, user_thumb_url, tags_genre, tags_director, tags_star, year, hash, [index], studio FROM metadata_items WHERE added_at >= " + dateSearch + " AND metadata_type >= 1 AND metadata_type <= 4 " + libraryFilter + " ORDER BY title_sort;") response = {}; for row in cur: - response[row[0]] = {'id': row[0], 'parent_id': row[1], 'metadata_type': row[2], 'title': row[3], 'title_sort': row[4], 'original_title': row[5], 'rating': row[6], 'tagline': row[7], 'summary': row[8], 'content_rating': row[9], 'duration': row[10], 'user_thumb_url': row[11], 'tags_genre': row[12], 'tags_director': row[13], 'tags_star': row[14], 'year': row[15], 'hash': row[16], 'index': row[17], 'studio': row[18]} + response[row[0]] = {'id': row[0], 'parent_id': row[1], 'metadata_type': row[2], 'title': row[3], 'title_sort': row[4], 'original_title': row[5], 'rating': row[6], 'tagline': row[7], 'summary': row[8], 'content_rating': row[9], 'duration': row[10], 'user_thumb_url': row[11], 'tags_genre': row[12], 'tags_director': row[13], 'tags_star': row[14], 'year': row[15], 'hash': row[16], 'index': row[17], 'studio': row[18]} emailMovies = """

""" + config['msg_new_movies_header'] + """

@@ -606,9 +643,9 @@ def createWebHTML(): movies = OrderedDict(sorted(movies.iteritems(), key=lambda t: t[1][config['movie_sort_1']], reverse=config['movie_sort_1_reverse'])) for movie in movies: - movieCount += 1 + movies[movie] = convertToHumanReadable(movies[movie]) title = '' - if (movies[movie]['original_title'] != ''): + if ('original_title' in movies[movie] and movies[movie]['original_title'] != ''): title += movies[movie]['original_title'] + ' AKA ' title += movies[movie]['title'] hash = str(movies[movie]['hash']) @@ -616,35 +653,34 @@ def createWebHTML(): imageInfo['thumb'] = movies[movie]['user_thumb_url'] imageInfo = processImage(hash, imageInfo['thumb'], 'movie', 0, 0) - emailMovies += '' - emailMovies += '' - emailMovies += '
' - emailMovies += '' - emailMovies += '

' + title.decode('utf-8') + '

' - if (movies[movie]['tagline'] != ''): - emailMovies += '

' + movies[movie]['tagline'].decode('utf-8') + '

' - emailMovies += '

' + movies[movie]['summary'].decode('utf-8') + '

' - if (movies[movie]['duration']): - emailMovies += '

Runtime: ' + str(movies[movie]['duration'] // 1000 // 60) + ' minutes

' - if (movies[movie]['year']): - emailMovies += '

Release Year: ' + str(movies[movie]['year']) + '

' - if (movies[movie]['rating']): - emailMovies += '

Rating: ' + str(int(movies[movie]['rating'] * 10)) + '%

' - emailMovies += '

 
 ' + skipItem = False + emailText = '' + htmlText = '' + + emailText += '' + emailText += '' + emailText += '
' + emailText += '' + emailText += '

' + title.decode('utf-8') + '

' + htmlText += '
' + htmlText += '' + htmlText += '

' + title.decode('utf-8') + '

' + + sections = config['filter_sections_movies'] + for section in sorted(sections.iteritems(), key=lambda t: t[1]['order']): + if (movies[movie][section[0]] in sections[section[0]]['exclude'] or len(set(movies[movie][section[0] + '_filter']).intersection(sections[section[0]]['exclude'])) > 0 or (sections[section[0]]['include'] and movies[movie][section[0]] not in sections[section[0]]['include'] and len(set(movies[movie][section[0] + '_filter']).intersection(sections[section[0]]['include'])) == 0)): + skipItem = True + if (sections[section[0]]['show'] and movies[movie][section[0]] and movies[movie][section[0]] != ''): + emailText += '

' + sections[section[0]]['preText'].decode('utf-8') + str(movies[movie][section[0]]).decode('utf-8') + sections[section[0]]['postText'].decode('utf-8') + '

' + htmlText += '

' + sections[section[0]]['preText'].decode('utf-8') + str(movies[movie][section[0]]).decode('utf-8') + sections[section[0]]['postText'].decode('utf-8') + '

' - htmlMovies += '
' - htmlMovies += '' - htmlMovies += '

' + title.decode('utf-8') + '

' - if (movies[movie]['tagline'] != ''): - htmlMovies += '

' + movies[movie]['tagline'].decode('utf-8') + '

' - htmlMovies += '

' + movies[movie]['summary'].decode('utf-8') + '

' - if (movies[movie]['duration']): - htmlMovies += '

Runtime: ' + str(movies[movie]['duration'] // 1000 // 60) + ' minutes

' - if (movies[movie]['year']): - htmlMovies += '

Release Year: ' + str(movies[movie]['year']) + '

' - if (movies[movie]['rating']): - htmlMovies += '

Rating: ' + str(int(movies[movie]['rating'] * 10)) + '%

' - htmlMovies += '

 
 ' + emailText += '

 
 ' + htmlText += '

 
 ' + + if (not skipItem): + movieCount += 1 + emailMovies += emailText + htmlMovies += htmlText if ('show_sort_3' in config and config['show_sort_3'] != ''): tvShows = OrderedDict(sorted(tvShows.iteritems(), key=lambda t: t[1][config['show_sort_3']], reverse=config['show_sort_3_reverse'])) @@ -654,7 +690,7 @@ def createWebHTML(): tvShows = OrderedDict(sorted(tvShows.iteritems(), key=lambda t: t[1][config['show_sort_1']], reverse=config['show_sort_1_reverse'])) for show in tvShows: - showCount += 1 + tvShows[show] = convertToHumanReadable(tvShows[show]) title = '' if (tvShows[show]['original_title'] != ''): title += tvShows[show]['original_title'] + ' AKA ' @@ -664,25 +700,32 @@ def createWebHTML(): imageInfo['thumb'] = tvShows[show]['user_thumb_url'] imageInfo = processImage(hash, imageInfo['thumb'], 'show', 0, 0) - emailTVShows += '' - emailTVShows += '' - emailTVShows += '

' + title.decode('utf-8') + '

' - if (tvShows[show]['tagline'] != ''): - emailTVShows += '

' + tvShows[show]['tagline'].decode('utf-8') + '

' - emailTVShows += '

' + tvShows[show]['summary'].decode('utf-8') + '

' - if (tvShows[show]['studio'] != ''): - emailTVShows += '

Network: ' + tvShows[show]['studio'].decode('utf-8') + '

' - emailTVShows += '

 
 ' + skipItem = False + emailText = '' + htmlText = '' + + emailText += '' + emailText += '' + emailText += '

' + title.decode('utf-8') + '

' + htmlText += '
' + htmlText += '' + htmlText += '

' + title.decode('utf-8') + '

' - htmlTVShows += '
' - htmlTVShows += '' - htmlTVShows += '

' + title.decode('utf-8') + '

' - if (tvShows[show]['tagline'] != ''): - htmlTVShows += '

' + tvShows[show]['tagline'].decode('utf-8') + '

' - htmlTVShows += '

' + tvShows[show]['summary'].decode('utf-8') + '

' - if (tvShows[show]['studio'] != ''): - htmlTVShows += '

Network: ' + tvShows[show]['studio'].decode('utf-8') + '

' - htmlTVShows += '

 
 ' + sections = config['filter_sections_TV'] + for section in sorted(sections.iteritems(), key=lambda t: t[1]['order']): + if (tvShows[show][section[0]] in sections[section[0]]['exclude'] or len(set(tvShows[show][section[0] + '_filter']).intersection(sections[section[0]]['exclude'])) > 0 or (sections[section[0]]['include'] and tvShows[show][section[0]] not in sections[section[0]]['include'] and len(set(tvShows[show][section[0] + '_filter']).intersection(sections[section[0]]['include'])) == 0)): + skipItem = True + if (sections[section[0]]['show'] and tvShows[show][section[0]] and tvShows[show][section[0]] != ''): + emailText += '

' + sections[section[0]]['preText'].decode('utf-8') + str(tvShows[show][section[0]]).decode('utf-8') + sections[section[0]]['postText'].decode('utf-8') + '

' + htmlText += '

' + sections[section[0]]['preText'].decode('utf-8') + str(tvShows[show][section[0]]).decode('utf-8') + sections[section[0]]['postText'].decode('utf-8') + '

' + + emailText += '

 
 ' + htmlText += '
 
 ' + + if (not skipItem): + showCount += 1 + emailTVShows += emailText + htmlTVShows += htmlText for season in tvSeasons: cur2 = con.cursor() @@ -713,7 +756,7 @@ def createWebHTML(): tvSeasons = OrderedDict(sorted(tvSeasons.iteritems(), key=lambda t: t[1][config['season_sort_1']], reverse=config['season_sort_1_reverse'])) for season in tvSeasons: - seasonCount += 1 + tvSeasons[season] = convertToHumanReadable(tvSeasons[season]) title = '' if (tvSeasons[season]['original_title'] != ''): title += tvSeasons[season]['original_title'] + ' AKA ' @@ -727,27 +770,34 @@ def createWebHTML(): imageInfo['thumb'] = tvSeasons[season]['parent_thumb_url'] imageInfo = processImage(hash, imageInfo['thumb'], 'show', 0, 0) - emailTVSeasons += '' - emailTVSeasons += '' - emailTVSeasons += '

' + title.decode('utf-8') + '

' - emailTVSeasons += '

Season ' + str(tvSeasons[season]['index']) + '

' - if (tvSeasons[season]['tagline'] != ''): - emailTVSeasons += '

' + tvSeasons[season]['tagline'].decode('utf-8') + '

' - emailTVSeasons += '

' + tvSeasons[season]['summary'].decode('utf-8') + '

' - if (tvSeasons[season]['studio'] != ''): - emailTVSeasons += '

Network: ' + tvSeasons[season]['studio'].decode('utf-8') + '

' - emailTVSeasons += '

 
 ' + skipItem = False + emailText = '' + htmlText = '' + + emailText += '' + emailText += '' + emailText += '

' + title.decode('utf-8') + '

' + emailText += '

Season ' + str(tvSeasons[season]['index']) + '

' + htmlText += '
' + htmlText += '' + htmlText += '

' + title.decode('utf-8') + '

' + htmlText += '

Season ' + str(tvSeasons[season]['index']) + '

' + + sections = config['filter_sections_TV'] + for section in sorted(sections.iteritems(), key=lambda t: t[1]['order']): + if (tvSeasons[season][section[0]] in sections[section[0]]['exclude'] or len(set(tvSeasons[season][section[0] + '_filter']).intersection(sections[section[0]]['exclude'])) > 0 or (sections[section[0]]['include'] and tvSeasons[season][section[0]] not in sections[section[0]]['include'] and len(set(tvSeasons[season][section[0] + '_filter']).intersection(sections[section[0]]['include'])) == 0)): + skipItem = True + if (sections[section[0]]['show'] and tvSeasons[season][section[0]] and tvSeasons[season][section[0]] != ''): + emailText += '

' + sections[section[0]]['preText'].decode('utf-8') + str(tvSeasons[season][section[0]]).decode('utf-8') + sections[section[0]]['postText'].decode('utf-8') + '

' + htmlText += '

' + sections[section[0]]['preText'].decode('utf-8') + str(tvSeasons[season][section[0]]).decode('utf-8') + sections[section[0]]['postText'].decode('utf-8') + '

' + + emailText += '

 
 ' + htmlText += '
 
 ' - htmlTVSeasons += '
' - htmlTVSeasons += '' - htmlTVSeasons += '

' + title.decode('utf-8') + '

' - htmlTVSeasons += '

Season ' + str(tvSeasons[season]['index']) + '

' - if (tvSeasons[season]['tagline'] != ''): - htmlTVSeasons += '

' + tvSeasons[season]['tagline'].decode('utf-8') + '

' - htmlTVSeasons += '

' + tvSeasons[season]['summary'].decode('utf-8') + '

' - if (tvSeasons[season]['studio'] != ''): - htmlTVSeasons += '

Network: ' + tvSeasons[season]['studio'].decode('utf-8') + '

' - htmlTVSeasons += '

 
 ' + if (not skipItem): + seasonCount += 1 + emailTVSeasons += emailText + htmlTVSeasons += htmlText for episode in tvEpisodes: cur2 = con.cursor() @@ -782,7 +832,7 @@ def createWebHTML(): for episode in tvEpisodes: if (tvEpisodes[episode]['parent_id'] not in tvSeasons): - episodeCount += 1 + tvEpisodes[episode] = convertToHumanReadable(tvEpisodes[episode]) showTitle = '' if (tvEpisodes[episode]['show_original_title'] != ''): showTitle += tvEpisodes[episode]['show_original_title'] + ' AKA ' @@ -803,27 +853,34 @@ def createWebHTML(): imageInfo['thumb'] = tvEpisodes[episode]['show_thumb_url'] imageInfo = processImage(hash, imageInfo['thumb'], 'show', 0, 0) - emailTVEpisodes += '' - emailTVEpisodes += '' - emailTVEpisodes += '

' + showTitle.decode('utf-8') + '

' - emailTVEpisodes += '

S' + str(tvEpisodes[episode]['season_index']) + ' E' + str(tvEpisodes[episode]['index']) + ': ' + title.decode('utf-8') + '

' - if (tvEpisodes[episode]['tagline'] != ''): - emailTVEpisodes += '

' + tvEpisodes[episode]['tagline'].decode('utf-8') + '

' - emailTVEpisodes += '

' + tvEpisodes[episode]['summary'].decode('utf-8') + '

' - if (tvEpisodes[episode]['studio'] != ''): - emailTVEpisodes += '

Network: ' + tvEpisodes[episode]['studio'].decode('utf-8') + '

' - emailTVEpisodes += '

 
 ' + skipItem = False + emailText = '' + htmlText = '' + + emailText += '' + emailText += '' + emailText += '

' + showTitle.decode('utf-8') + '

' + emailText += '

S' + str(tvEpisodes[episode]['season_index']) + ' E' + str(tvEpisodes[episode]['index']) + ': ' + title.decode('utf-8') + '

' + htmlText += '
' + htmlText += '' + htmlText += '

' + showTitle.decode('utf-8') + '

' + htmlText += '

S' + str(tvEpisodes[episode]['season_index']) + ' E' + str(tvEpisodes[episode]['index']) + ': ' + title.decode('utf-8') + '

' + + sections = config['filter_sections_TV'] + for section in sorted(sections.iteritems(), key=lambda t: t[1]['order']): + if (tvEpisodes[episode][section[0]] in sections[section[0]]['exclude'] or len(set(tvEpisodes[episode][section[0] + '_filter']).intersection(sections[section[0]]['exclude'])) > 0 or (sections[section[0]]['include'] and tvEpisodes[episode][section[0]] not in sections[section[0]]['include'] and len(set(tvEpisodes[episode][section[0] + '_filter']).intersection(sections[section[0]]['include'])) == 0)): + skipItem = True + if (sections[section[0]]['show'] and tvEpisodes[episode][section[0]] and tvEpisodes[episode][section[0]] != ''): + emailText += '

' + sections[section[0]]['preText'].decode('utf-8') + str(tvEpisodes[episode][section[0]]).decode('utf-8') + sections[section[0]]['postText'].decode('utf-8') + '

' + htmlText += '

' + sections[section[0]]['preText'].decode('utf-8') + str(tvEpisodes[episode][section[0]]).decode('utf-8') + sections[section[0]]['postText'].decode('utf-8') + '

' - htmlTVEpisodes += '
' - htmlTVEpisodes += '' - htmlTVEpisodes += '

' + showTitle.decode('utf-8') + '

' - htmlTVEpisodes += '

S' + str(tvEpisodes[episode]['season_index']) + ' E' + str(tvEpisodes[episode]['index']) + ': ' + title.decode('utf-8') + '

' - if (tvEpisodes[episode]['tagline'] != ''): - htmlTVEpisodes += '

' + tvEpisodes[episode]['tagline'].decode('utf-8') + '

' - htmlTVEpisodes += '

' + tvEpisodes[episode]['summary'].decode('utf-8') + '

' - if (tvEpisodes[episode]['studio'] != ''): - htmlTVEpisodes += '

Network: ' + tvEpisodes[episode]['studio'].decode('utf-8') + '

' - htmlTVEpisodes += '

 
 ' + emailText += '

 
 ' + htmlText += '
 
 ' + + if (not skipItem): + episodeCount += 1 + emailTVEpisodes += emailText + htmlTVEpisodes += htmlText if ((movieCount > 0 and config['filter_show_movies']) or (showCount > 0 and config['filter_show_shows']) or (seasonCount > 0 and config['filter_show_seasons']) or (episodeCount > 0 and config['filter_show_episodes'])): hasNewContent = True @@ -833,11 +890,11 @@ def createWebHTML(): emailHTML = createEmailHTML() webHTML = createWebHTML() - if (config['web_enabled'] and (not config['web_skip_if_no_additions'] or hasNewContent)): + if (config['web_enabled'] and not config['web_only_save_images'] and (not config['web_skip_if_no_additions'] or hasNewContent)): with open(config['web_folder'] + config['web_path'] + os.path.sep + 'index.html', 'w') as text_file: text_file.write(webHTML.encode('utf-8')) print 'Web page created successfully' - elif (not config['web_enabled']): + elif (not config['web_enabled'] or (config['web_only_save_images'] and config['web_enabled'])): print 'Web page was not created because the option is disabled in the config file.' else: print 'Web page was not created because there were no new additions in the timeframe specified.' @@ -845,7 +902,10 @@ def createWebHTML(): if (config['email_enabled'] and (not config['email_skip_if_no_additions'] or hasNewContent)): try: emailCount = 0 - if (config['email_individually']): + if (testMode): + sendMail([config['email_from']]) + emailCount += 1 + elif (config['email_individually']): for emailAdd in config['email_to']: email = [emailAdd] sendMail(email) @@ -856,7 +916,7 @@ def createWebHTML(): print 'Successfully sent %s email(s)' % emailCount except: print "Failed to send email(s)" - elif (config['email_enabled']): + elif (not config['email_enabled']): print 'Emails were not sent because the option is disabled in the config file.' else: print 'Emails were not sent because there were no new additions in the timeframe specified.' \ No newline at end of file