Implement media filter for raw media lists

master
Felix Stupp 7 months ago
parent dc8fe05649
commit 7f2df84fe7
Signed by: zocker
GPG Key ID: 93E1BD26F6B02FB7

@ -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/<int:seconds>")
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/<int:seconds>")
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")

@ -10,6 +10,21 @@
<body>
{{ macros.body_header() }}
<h1>{{ title }}</h1>
{% if show_filters | default(False) %}
<form class="form-single-button" method="get" action="{{ this_url() }}">
<label>
<span>Min Length:</span>
<input type="number" name="min_length" min="0" size="4" value="{{ min_length or '' }}"/>
<span>min</span>
</label>
<label>
<span>Max Length:</span>
<input type="number" name="max_length" min="0" size="4" value="{{ max_length or '' }}"/>
<span>min</span>
</label>
<button type="submit">Filter</button>
</form>
{% endif %}
{{ macros.media_thumbnail_list(
elements=media_list,
check_considered=check_considered|default(True),

Loading…
Cancel
Save