diff --git a/server/app.py b/server/app.py index 53b69d7..846c60c 100644 --- a/server/app.py +++ b/server/app.py @@ -59,6 +59,9 @@ from entertainment_decider.models import ( setup_custom_tables, update_element_lookup_cache, ) +from entertainment_decider.models.sql_helpers import ( + sql_condition_join, +) from entertainment_decider.preferences import PreferenceScore, generate_preference_list from entertainment_decider.extractors.collection import ( collection_extract_uri, @@ -487,32 +490,7 @@ def list_media() -> ResponseReturnValue: "media_list.htm", media_list=common.limit_iter(media_list, 100), check_considered=False, - ) - - -@flask_app.route("/media/short") -@flask_app.route("/media/short/") -def list_short_media(seconds: int = 10 * 60) -> ResponseReturnValue: - media_list = prepare_media_sql( - filter_by=f"(length - progress) <= {seconds}", - ) - return render_template( - "media_list.htm", - media_list=list(itertools.islice(media_list, 100)), - check_considered=False, - ) - - -@flask_app.route("/media/long") -@flask_app.route("/media/long/") -def list_long_media(seconds: int = 10 * 60) -> ResponseReturnValue: - media_list = prepare_media_sql( - filter_by=f"{seconds} <= (length - progress)", - ) - return render_template( - "media_list.htm", - media_list=list(itertools.islice(media_list, 100)), - check_considered=False, + **pass_media_filter_vals(), ) @@ -550,14 +528,32 @@ def list_unsorted_media() -> ResponseReturnValue: def prepare_media_sql( - filter_by: str = "TRUE", + filter_by: str | None = None, ) -> Sequence[MediaElement]: + elem_len = "(elem.length - elem.progress)" + min_len = request.args.get("min_length", default=None, type=int) + max_len = request.args.get("max_length", default=None, type=int) + filter_str = sql_condition_join( + filter_by, + f"{min_len * 60} <= {elem_len}" if min_len else None, + f"{elem_len} <= {max_len * 60}" if max_len else None, + ) return get_all_considered( - filter_by=filter_by, + filter_by=filter_str, order_by="elem.release_date DESC, elem.id", ) +def pass_media_filter_vals() -> Mapping[str, Any]: + KEYS = [ + "min_length", + "max_length", + ] + return { + "show_filters": True, + } | {key: request.args.get(key) for key in KEYS} + + @flask_app.route("/media/extract") def extract_media() -> ResponseReturnValue: return render_template("media_extract.htm") diff --git a/server/templates/media_list.htm b/server/templates/media_list.htm index e3860b3..bf0f196 100644 --- a/server/templates/media_list.htm +++ b/server/templates/media_list.htm @@ -10,6 +10,21 @@ {{ macros.body_header() }}

{{ title }}

+ {% if show_filters | default(False) %} +
+ + + +
+ {% endif %} {{ macros.media_thumbnail_list( elements=media_list, check_considered=check_considered|default(True),