Improvement to each DB requests that need to filter out monitored, tags or series type.

pull/1096/head
Louis Vézina 4 years ago
parent 561d5e0890
commit 221f92d09a

@ -18,7 +18,7 @@ from config import settings, base_url, save_settings
from init import * from init import *
import logging import logging
from database import database, filter_exclusions from database import database, get_exclusion_clause
from helper import path_mappings from helper import path_mappings
from get_languages import language_from_alpha3, language_from_alpha2, alpha2_from_alpha3, alpha2_from_language, \ from get_languages import language_from_alpha3, language_from_alpha2, alpha2_from_alpha3, alpha2_from_language, \
alpha3_from_language, alpha3_from_alpha2 alpha3_from_language, alpha3_from_alpha2
@ -86,8 +86,7 @@ class BadgesSeries(Resource):
missing_episodes = database.execute("SELECT table_shows.tags, table_episodes.monitored, table_shows.seriesType " missing_episodes = database.execute("SELECT table_shows.tags, table_episodes.monitored, table_shows.seriesType "
"FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId =" "FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId ="
" table_episodes.sonarrSeriesId WHERE missing_subtitles is not null AND " " table_episodes.sonarrSeriesId WHERE missing_subtitles is not null AND "
"missing_subtitles != '[]'") "missing_subtitles != '[]'" + get_exclusion_clause('series'))
missing_episodes = filter_exclusions(missing_episodes, 'series')
missing_episodes = len(missing_episodes) missing_episodes = len(missing_episodes)
result = { result = {
@ -100,8 +99,7 @@ class BadgesMovies(Resource):
@authenticate @authenticate
def get(self): def get(self):
missing_movies = database.execute("SELECT tags, monitored FROM table_movies WHERE missing_subtitles is not " missing_movies = database.execute("SELECT tags, monitored FROM table_movies WHERE missing_subtitles is not "
"null AND missing_subtitles != '[]'") "null AND missing_subtitles != '[]'" + get_exclusion_clause('movie'))
missing_movies = filter_exclusions(missing_movies, 'movie')
missing_movies = len(missing_movies) missing_movies = len(missing_movies)
result = { result = {
@ -330,8 +328,8 @@ class Series(Resource):
"table_shows.seriesType FROM table_episodes INNER JOIN table_shows " "table_shows.seriesType FROM table_episodes INNER JOIN table_shows "
"on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId " "on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId "
"WHERE table_episodes.sonarrSeriesId=? AND missing_subtitles is not " "WHERE table_episodes.sonarrSeriesId=? AND missing_subtitles is not "
"null AND missing_subtitles != '[]'", (item['sonarrSeriesId'],)) "null AND missing_subtitles != '[]'" +
episodeMissingCount = filter_exclusions(episodeMissingCount, 'series') get_exclusion_clause('series'), (item['sonarrSeriesId'],))
episodeMissingCount = len(episodeMissingCount) episodeMissingCount = len(episodeMissingCount)
item.update({"episodeMissingCount": episodeMissingCount}) item.update({"episodeMissingCount": episodeMissingCount})
@ -339,8 +337,8 @@ class Series(Resource):
episodeFileCount = database.execute("SELECT table_shows.tags, table_episodes.monitored, " episodeFileCount = database.execute("SELECT table_shows.tags, table_episodes.monitored, "
"table_shows.seriesType FROM table_episodes INNER JOIN table_shows on " "table_shows.seriesType FROM table_episodes INNER JOIN table_shows on "
"table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE " "table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE "
"table_episodes.sonarrSeriesId=?", (item['sonarrSeriesId'],)) "table_episodes.sonarrSeriesId=?" + get_exclusion_clause('series'),
episodeFileCount = filter_exclusions(episodeFileCount, 'series') (item['sonarrSeriesId'],))
episodeFileCount = len(episodeFileCount) episodeFileCount = len(episodeFileCount)
item.update({"episodeFileCount": episodeFileCount}) item.update({"episodeFileCount": episodeFileCount})
@ -460,7 +458,7 @@ class SeriesEditSave(Resource):
list_missing_subtitles(no=seriesId, send_event=False) list_missing_subtitles(no=seriesId, send_event=False)
event_stream(type='series_editor', action='update') event_stream(type='series_editor', action='update')
event_stream(type='badges') event_stream(type='badges_series')
return '', 204 return '', 204
@ -1024,7 +1022,7 @@ class MoviesEditSave(Resource):
list_missing_subtitles_movies(no=radarrId, send_event=False) list_missing_subtitles_movies(no=radarrId, send_event=False)
event_stream(type='movies_editor', action='update') event_stream(type='movies_editor', action='update')
event_stream(type='badges') event_stream(type='badges_movies')
return '', 204 return '', 204
@ -1329,9 +1327,9 @@ class HistorySeries(Resource):
"table_shows.seriesType FROM table_history INNER JOIN table_episodes on " "table_shows.seriesType FROM table_history INNER JOIN table_episodes on "
"table_episodes.sonarrEpisodeId = table_history.sonarrEpisodeId INNER JOIN table_shows on " "table_episodes.sonarrEpisodeId = table_history.sonarrEpisodeId INNER JOIN table_shows on "
"table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE action IN (" + "table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE action IN (" +
','.join(map(str, query_actions)) + ") AND timestamp > ? AND score is not null GROUP BY " ','.join(map(str, query_actions)) + ") AND timestamp > ? AND score is not null" +
"table_history.video_path, table_history.language", (minimum_timestamp,)) get_exclusion_clause('series') + " GROUP BY table_history.video_path, table_history.language",
upgradable_episodes = filter_exclusions(upgradable_episodes, 'series') (minimum_timestamp,))
for upgradable_episode in upgradable_episodes: for upgradable_episode in upgradable_episodes:
if upgradable_episode['timestamp'] > minimum_timestamp: if upgradable_episode['timestamp'] > minimum_timestamp:
@ -1432,9 +1430,8 @@ class HistoryMovies(Resource):
upgradable_movies = database.execute( upgradable_movies = database.execute(
"SELECT video_path, MAX(timestamp) as timestamp, score, tags, monitored FROM table_history_movie " "SELECT video_path, MAX(timestamp) as timestamp, score, tags, monitored FROM table_history_movie "
"INNER JOIN table_movies on table_movies.radarrId=table_history_movie.radarrId WHERE action IN (" + "INNER JOIN table_movies on table_movies.radarrId=table_history_movie.radarrId WHERE action IN (" +
','.join(map(str, query_actions)) + ") AND timestamp > ? AND score is not NULL GROUP BY video_path, " ','.join(map(str, query_actions)) + ") AND timestamp > ? AND score is not NULL" +
"language", (minimum_timestamp,)) get_exclusion_clause('movie') + " GROUP BY video_path, language", (minimum_timestamp,))
upgradable_movies = filter_exclusions(upgradable_movies, 'movie')
for upgradable_movie in upgradable_movies: for upgradable_movie in upgradable_movies:
if upgradable_movie['timestamp'] > minimum_timestamp: if upgradable_movie['timestamp'] > minimum_timestamp:
@ -1571,8 +1568,8 @@ class WantedSeries(Resource):
data_count = database.execute("SELECT table_episodes.monitored, table_shows.tags, table_shows.seriesType FROM " data_count = database.execute("SELECT table_episodes.monitored, table_shows.tags, table_shows.seriesType FROM "
"table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = " "table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = "
"table_episodes.sonarrSeriesId WHERE table_episodes.missing_subtitles != '[]'") "table_episodes.sonarrSeriesId WHERE table_episodes.missing_subtitles != '[]'" +
data_count = filter_exclusions(data_count, 'series') get_exclusion_clause('series'))
row_count = len(data_count) row_count = len(data_count)
data = database.execute("SELECT table_shows.title as seriesTitle, table_episodes.monitored, " data = database.execute("SELECT table_shows.title as seriesTitle, table_episodes.monitored, "
"table_episodes.season || 'x' || table_episodes.episode as episode_number, " "table_episodes.season || 'x' || table_episodes.episode as episode_number, "
@ -1581,8 +1578,8 @@ class WantedSeries(Resource):
"table_episodes.sonarrEpisodeId, table_episodes.scene_name, table_shows.tags, " "table_episodes.sonarrEpisodeId, table_episodes.scene_name, table_shows.tags, "
"table_episodes.failedAttempts, table_shows.seriesType FROM table_episodes INNER JOIN " "table_episodes.failedAttempts, table_shows.seriesType FROM table_episodes INNER JOIN "
"table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE " "table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE "
"table_episodes.missing_subtitles != '[]' ORDER BY table_episodes._rowid_ DESC") "table_episodes.missing_subtitles != '[]'" + get_exclusion_clause('series') +
data = filter_exclusions(data, 'series')[int(start):int(start)+int(length)] " ORDER BY table_episodes._rowid_ DESC LIMIT " + length + " OFFSET " + start)
for item in data: for item in data:
# Parse missing subtitles # Parse missing subtitles
@ -1614,13 +1611,13 @@ class WantedMovies(Resource):
length = request.args.get('length') or -1 length = request.args.get('length') or -1
draw = request.args.get('draw') draw = request.args.get('draw')
data_count = database.execute("SELECT tags, monitored FROM table_movies WHERE missing_subtitles != '[]'") data_count = database.execute("SELECT tags, monitored FROM table_movies WHERE missing_subtitles != '[]'" +
data_count = filter_exclusions(data_count, 'movie') get_exclusion_clause('movie'))
row_count = len(data_count) row_count = len(data_count)
data = database.execute("SELECT title, missing_subtitles, radarrId, path, hearing_impaired, sceneName, " data = database.execute("SELECT title, missing_subtitles, radarrId, path, hearing_impaired, sceneName, "
"failedAttempts, tags, monitored FROM table_movies WHERE missing_subtitles != '[]' " "failedAttempts, tags, monitored FROM table_movies WHERE missing_subtitles != '[]'" +
"ORDER BY _rowid_ DESC") get_exclusion_clause('movie') + " ORDER BY _rowid_ DESC LIMIT " + length + " OFFSET " +
data = filter_exclusions(data, 'movie')[int(start):int(start)+int(length)] start)
for item in data: for item in data:
# Parse missing subtitles # Parse missing subtitles

@ -228,6 +228,11 @@ def save_settings(settings_items):
'settings-proxy-password']: 'settings-proxy-password']:
configure_proxy = True configure_proxy = True
if key in ['settings-sonarr-excluded_tags', 'settings-sonarr-only_monitored',
'settings-sonarr-excluded_series_types', 'settings.radarr.excluded_tags',
'settings-radarr-only_monitored']:
exclusion_updated = True
if settings_keys[0] == 'settings': if settings_keys[0] == 'settings':
settings[settings_keys[1]][settings_keys[2]] = str(value) settings[settings_keys[1]][settings_keys[2]] = str(value)
@ -253,6 +258,11 @@ def save_settings(settings_items):
if configure_proxy: if configure_proxy:
configure_proxy_func() configure_proxy_func()
if exclusion_updated:
from event_handler import event_stream
event_stream(type='badges_series')
event_stream(type='badges_movies')
def url_sonarr(): def url_sonarr():
if settings.sonarr.getboolean('ssl'): if settings.sonarr.getboolean('ssl'):

@ -149,28 +149,29 @@ def db_upgrade():
"provider text, subs_id text, language text)") "provider text, subs_id text, language text)")
def filter_exclusions(dicts_list, type): def get_exclusion_clause(type):
where_clause = ''
if type == 'series': if type == 'series':
tagsList = ast.literal_eval(settings.sonarr.excluded_tags) tagsList = ast.literal_eval(settings.sonarr.excluded_tags)
monitoredOnly = settings.sonarr.getboolean('only_monitored') for tag in tagsList:
where_clause += ' AND table_shows.tags NOT LIKE "%\'' + tag + '\'%"'
else: else:
tagsList = ast.literal_eval(settings.radarr.excluded_tags) tagsList = ast.literal_eval(settings.radarr.excluded_tags)
monitoredOnly = settings.radarr.getboolean('only_monitored') for tag in tagsList:
where_clause += ' AND table_movies.tags NOT LIKE "%\'' + tag + '\'%"'
# Filter tags if type == 'series':
dictsList_tags_filtered = [item for item in dicts_list if set(tagsList).isdisjoint(ast.literal_eval(item['tags']))] monitoredOnly = settings.sonarr.getboolean('only_monitored')
if monitoredOnly:
# Filter monitored where_clause += ' AND table_episodes.monitored = "True"'
if monitoredOnly:
dictsList_monitored_filtered = [item for item in dictsList_tags_filtered if item['monitored'] == 'True']
else: else:
dictsList_monitored_filtered = dictsList_tags_filtered monitoredOnly = settings.radarr.getboolean('only_monitored')
if monitoredOnly:
where_clause += ' AND table_movies.monitored = "True"'
# Filter series type
if type == 'series': if type == 'series':
dictsList_types_filtered = [item for item in dictsList_monitored_filtered if item['seriesType'] not in typesList = ast.literal_eval(settings.sonarr.excluded_series_types)
ast.literal_eval(settings.sonarr.excluded_series_types)] for type in typesList:
else: where_clause += ' AND table_shows.seriesType != "' + type + '"'
dictsList_types_filtered = dictsList_monitored_filtered
return dictsList_types_filtered return where_clause

@ -1,7 +1,7 @@
# coding=utf-8 # coding=utf-8
import requests import requests
import logging import logging
from database import database, dict_converter from database import database, dict_converter, get_exclusion_clause
from config import settings, url_sonarr from config import settings, url_sonarr
from helper import path_mappings from helper import path_mappings
@ -180,11 +180,13 @@ def sync_episodes():
if len(altered_episodes) <= 5: if len(altered_episodes) <= 5:
logging.debug("BAZARR No more than 5 episodes were added during this sync then we'll search for subtitles.") logging.debug("BAZARR No more than 5 episodes were added during this sync then we'll search for subtitles.")
for altered_episode in altered_episodes: for altered_episode in altered_episodes:
if settings.sonarr.getboolean('only_monitored'): data = database.execute("SELECT table_episodes.sonarrEpisodeId, table_episodes.monitored, table_shows.tags,"
if altered_episode[2] == 'True': " table_shows.seriesType FROM table_episodes LEFT JOIN table_shows on "
episode_download_subtitles(altered_episode[0]) "table_episodes.sonarrSeriesId = table_shows.sonarrSeriesId WHERE "
else: "sonarrEpisodeId = ?" + get_exclusion_clause('series'), (altered_episode[0],),
episode_download_subtitles(altered_episode[0]) only_one=True)
episode_download_subtitles(data['sonarrEpisodeId'])
else: else:
logging.debug("BAZARR More than 5 episodes were added during this sync then we wont search for subtitles right now.") logging.debug("BAZARR More than 5 episodes were added during this sync then we wont search for subtitles right now.")

@ -10,7 +10,7 @@ from utils import get_radarr_version
from list_subtitles import store_subtitles_movie, list_missing_subtitles_movies, movies_full_scan_subtitles from list_subtitles import store_subtitles_movie, list_missing_subtitles_movies, movies_full_scan_subtitles
from get_subtitle import movies_download_subtitles from get_subtitle import movies_download_subtitles
from database import database, dict_converter from database import database, dict_converter, get_exclusion_clause
def update_all_movies(): def update_all_movies():
@ -265,11 +265,9 @@ def update_movies():
if len(altered_movies) <= 5: if len(altered_movies) <= 5:
logging.debug("BAZARR No more than 5 movies were added during this sync then we'll search for subtitles.") logging.debug("BAZARR No more than 5 movies were added during this sync then we'll search for subtitles.")
for altered_movie in altered_movies: for altered_movie in altered_movies:
if settings.radarr.getboolean('only_monitored'): data = database.execute("SELECT * FROM table_movies WHERE radarrId = ?" +
if altered_movie[3] == 'True': get_exclusion_clause('movie'), (altered_movie[2],), only_one=True)
movies_download_subtitles(altered_movie[2]) movies_download_subtitles(data['radarrId'])
else:
movies_download_subtitles(altered_movie[2])
else: else:
logging.debug("BAZARR More than 5 movies were added during this sync then we wont search for subtitles.") logging.debug("BAZARR More than 5 movies were added during this sync then we wont search for subtitles.")

@ -29,11 +29,10 @@ from notifier import send_notifications, send_notifications_movie
from get_providers import get_providers, get_providers_auth, provider_throttle, provider_pool from get_providers import get_providers, get_providers_auth, provider_throttle, provider_pool
from knowit import api from knowit import api
from subsyncer import subsync from subsyncer import subsync
from database import database, dict_mapper, filter_exclusions from database import database, dict_mapper, get_exclusion_clause
from analytics import track_event from analytics import track_event
from locale import getpreferredencoding from locale import getpreferredencoding
import chardet
def get_video(path, title, sceneName, providers=None, media_type="movie"): def get_video(path, title, sceneName, providers=None, media_type="movie"):
@ -641,10 +640,10 @@ def manual_upload_subtitle(path, language, forced, title, scene_name, media_type
def series_download_subtitles(no): def series_download_subtitles(no):
episodes_details = database.execute("SELECT table_episodes.path, table_episodes.missing_subtitles, monitored, " episodes_details = database.execute("SELECT table_episodes.path, table_episodes.missing_subtitles, monitored, "
"table_episodes.sonarrEpisodeId, table_episodes.scene_name, table_shows.tags, " "table_episodes.sonarrEpisodeId, table_episodes.scene_name, table_shows.tags, "
"table_shows.seriesType, table_episodes.audio_language FROM table_episodes INNER JOIN table_shows on " "table_shows.seriesType, table_episodes.audio_language FROM table_episodes "
"table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE " "INNER JOIN table_shows on table_shows.sonarrSeriesId = "
"table_episodes.sonarrSeriesId=? and missing_subtitles!='[]'", (no,)) "table_episodes.sonarrSeriesId WHERE table_episodes.sonarrSeriesId=? and "
episodes_details = filter_exclusions(episodes_details, 'series') "missing_subtitles!='[]'" + get_exclusion_clause('series'), (no,))
if not episodes_details: if not episodes_details:
logging.debug("BAZARR no episode for that sonarrSeriesId can be found in database:", str(no)) logging.debug("BAZARR no episode for that sonarrSeriesId can be found in database:", str(no))
return return
@ -699,8 +698,8 @@ def episode_download_subtitles(no):
"table_shows.hearing_impaired, table_shows.title, table_shows.sonarrSeriesId, " "table_shows.hearing_impaired, table_shows.title, table_shows.sonarrSeriesId, "
"table_shows.forced, table_episodes.audio_language, table_shows.seriesType FROM " "table_shows.forced, table_episodes.audio_language, table_shows.seriesType FROM "
"table_episodes LEFT JOIN table_shows on table_episodes.sonarrSeriesId = " "table_episodes LEFT JOIN table_shows on table_episodes.sonarrSeriesId = "
"table_shows.sonarrSeriesId WHERE sonarrEpisodeId=?", (no,)) "table_shows.sonarrSeriesId WHERE sonarrEpisodeId=?" +
episodes_details = filter_exclusions(episodes_details, 'series') get_exclusion_clause('series'), (no,))
if not episodes_details: if not episodes_details:
logging.debug("BAZARR no episode with that sonarrEpisodeId can be found in database:", str(no)) logging.debug("BAZARR no episode with that sonarrEpisodeId can be found in database:", str(no))
return return
@ -743,8 +742,7 @@ def episode_download_subtitles(no):
def movies_download_subtitles(no): def movies_download_subtitles(no):
movies = database.execute( movies = database.execute(
"SELECT path, missing_subtitles, audio_language, radarrId, sceneName, hearing_impaired, title, forced, tags, " "SELECT path, missing_subtitles, audio_language, radarrId, sceneName, hearing_impaired, title, forced, tags, "
"monitored FROM table_movies WHERE radarrId=?", (no,)) "monitored FROM table_movies WHERE radarrId=?" + get_exclusion_clause('movie'), (no,))
movies = filter_exclusions(movies, 'movie')
if not len(movies): if not len(movies):
logging.debug("BAZARR no movie with that radarrId can be found in database:", str(no)) logging.debug("BAZARR no movie with that radarrId can be found in database:", str(no))
return return
@ -911,8 +909,7 @@ def wanted_search_missing_subtitles_series():
episodes = database.execute("SELECT table_episodes.path, table_shows.tags, table_episodes.monitored, " episodes = database.execute("SELECT table_episodes.path, table_shows.tags, table_episodes.monitored, "
"table_shows.seriesType FROM table_episodes INNER JOIN table_shows on " "table_shows.seriesType FROM table_episodes INNER JOIN table_shows on "
"table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE missing_subtitles != " "table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE missing_subtitles != "
"'[]'") "'[]'" + get_exclusion_clause('series'))
episodes = filter_exclusions(episodes, 'series')
# path_replace # path_replace
dict_mapper.path_replace(episodes) dict_mapper.path_replace(episodes)
@ -929,8 +926,8 @@ def wanted_search_missing_subtitles_series():
def wanted_search_missing_subtitles_movies(): def wanted_search_missing_subtitles_movies():
movies = database.execute("SELECT path, tags, monitored FROM table_movies WHERE missing_subtitles != '[]'") movies = database.execute("SELECT path, tags, monitored FROM table_movies WHERE missing_subtitles != '[]'" +
movies = filter_exclusions(movies, 'movie') get_exclusion_clause('movie'))
# path_replace # path_replace
dict_mapper.path_replace_movie(movies) dict_mapper.path_replace_movie(movies)
@ -1079,11 +1076,10 @@ def upgrade_subtitles():
"table_shows.sonarrSeriesId = table_history.sonarrSeriesId INNER JOIN " "table_shows.sonarrSeriesId = table_history.sonarrSeriesId INNER JOIN "
"table_episodes on table_episodes.sonarrEpisodeId = " "table_episodes on table_episodes.sonarrEpisodeId = "
"table_history.sonarrEpisodeId WHERE action IN " "table_history.sonarrEpisodeId WHERE action IN "
"(" + ','.join(map(str, query_actions)) + "(" + ','.join(map(str, query_actions)) + ") AND timestamp > ? AND score"
") AND timestamp > ? AND score is not null GROUP BY " " is not null" + get_exclusion_clause('series') + " GROUP BY "
"table_history.video_path, table_history.language", "table_history.video_path, table_history.language",
(minimum_timestamp,)) (minimum_timestamp,))
upgradable_episodes = filter_exclusions(upgradable_episodes, 'series')
upgradable_episodes_not_perfect = [] upgradable_episodes_not_perfect = []
for upgradable_episode in upgradable_episodes: for upgradable_episode in upgradable_episodes:
if upgradable_episode['timestamp'] > minimum_timestamp: if upgradable_episode['timestamp'] > minimum_timestamp:
@ -1111,9 +1107,9 @@ def upgrade_subtitles():
"table_movies.monitored FROM table_history_movie INNER JOIN table_movies " "table_movies.monitored FROM table_history_movie INNER JOIN table_movies "
"on table_movies.radarrId = table_history_movie.radarrId WHERE action IN " "on table_movies.radarrId = table_history_movie.radarrId WHERE action IN "
"(" + ','.join(map(str, query_actions)) + ") AND timestamp > ? AND score " "(" + ','.join(map(str, query_actions)) + ") AND timestamp > ? AND score "
"is not null GROUP BY table_history_movie.video_path, " "is not null" + get_exclusion_clause('movie') + " GROUP BY "
"table_history_movie.language", (minimum_timestamp,)) "table_history_movie.video_path, table_history_movie.language",
upgradable_movies = filter_exclusions(upgradable_movies, 'movie') (minimum_timestamp,))
upgradable_movies_not_perfect = [] upgradable_movies_not_perfect = []
for upgradable_movie in upgradable_movies: for upgradable_movie in upgradable_movies:
if upgradable_movie['timestamp'] > minimum_timestamp: if upgradable_movie['timestamp'] > minimum_timestamp:

Loading…
Cancel
Save