summaryrefslogtreecommitdiff
path: root/searx/engines
diff options
context:
space:
mode:
authorBnyro <bnyro@tutanota.com>2025-03-20 21:16:37 +0100
committerMarkus Heiser <markus.heiser@darmarIT.de>2025-03-25 16:48:44 +0100
commit4dfc47584d7c946b9682dc1e4858fae003b16d1f (patch)
tree5dae9c70c914a7462ef302044fd5fc72a783bf0a /searx/engines
parentc28d35c7fc34da4e27700610f58c57135fea6310 (diff)
[refactor] duration strings: move parsing logic to utils.py
Diffstat (limited to 'searx/engines')
-rw-r--r--searx/engines/bilibili.py21
-rw-r--r--searx/engines/iqiyi.py18
-rw-r--r--searx/engines/peertube.py14
-rw-r--r--searx/engines/presearch.py4
4 files changed, 18 insertions, 39 deletions
diff --git a/searx/engines/bilibili.py b/searx/engines/bilibili.py
index 06e1cddb2..c6aa70dfd 100644
--- a/searx/engines/bilibili.py
+++ b/searx/engines/bilibili.py
@@ -56,18 +56,6 @@ def request(query, params):
return params
-# Format the video duration
-def format_duration(duration):
- if not ":" in duration:
- return None
- minutes, seconds = map(int, duration.split(":"))
- total_seconds = minutes * 60 + seconds
-
- formatted_duration = str(timedelta(seconds=total_seconds))[2:] if 0 <= total_seconds < 3600 else ""
-
- return formatted_duration
-
-
def response(resp):
search_res = resp.json()
@@ -83,7 +71,12 @@ def response(resp):
unix_date = item["pubdate"]
formatted_date = datetime.fromtimestamp(unix_date)
- formatted_duration = format_duration(item["duration"])
+
+ # the duration only seems to be valid if the video is less than 60 mins
+ duration = utils.parse_duration_string(item["duration"])
+ if duration and duration > timedelta(minutes=60):
+ duration = None
+
iframe_url = f"https://player.bilibili.com/player.html?aid={video_id}&high_quality=1&autoplay=false&danmaku=0"
results.append(
@@ -93,7 +86,7 @@ def response(resp):
"content": description,
"author": author,
"publishedDate": formatted_date,
- "length": formatted_duration,
+ "length": duration,
"thumbnail": thumbnail,
"iframe_src": iframe_url,
"template": "videos.html",
diff --git a/searx/engines/iqiyi.py b/searx/engines/iqiyi.py
index 3158b44e9..70a746bec 100644
--- a/searx/engines/iqiyi.py
+++ b/searx/engines/iqiyi.py
@@ -2,9 +2,10 @@
"""iQiyi: A search engine for retrieving videos from iQiyi."""
from urllib.parse import urlencode
-from datetime import datetime, timedelta
+from datetime import datetime
from searx.exceptions import SearxEngineAPIException
+from searx.utils import parse_duration_string
about = {
"website": "https://www.iqiyi.com/",
@@ -55,20 +56,7 @@ def response(resp):
except (ValueError, TypeError):
pass
- length = None
- subscript_content = album_info.get("subscriptContent")
- if subscript_content:
- try:
- time_parts = subscript_content.split(":")
- if len(time_parts) == 2:
- minutes, seconds = map(int, time_parts)
- length = timedelta(minutes=minutes, seconds=seconds)
- elif len(time_parts) == 3:
- hours, minutes, seconds = map(int, time_parts)
- length = timedelta(hours=hours, minutes=minutes, seconds=seconds)
- except (ValueError, TypeError):
- pass
-
+ length = parse_duration_string(album_info.get("subscriptionContent"))
results.append(
{
'url': album_info.get("pageUrl", "").replace("http://", "https://"),
diff --git a/searx/engines/peertube.py b/searx/engines/peertube.py
index 0457c5d8d..b9d8e582f 100644
--- a/searx/engines/peertube.py
+++ b/searx/engines/peertube.py
@@ -6,7 +6,7 @@
import re
from urllib.parse import urlencode
-from datetime import datetime
+from datetime import datetime, timedelta
from dateutil.parser import parse
from dateutil.relativedelta import relativedelta
@@ -50,12 +50,6 @@ safesearch = True
safesearch_table = {0: 'both', 1: 'false', 2: 'false'}
-def minute_to_hm(minute):
- if isinstance(minute, int):
- return "%d:%02d" % (divmod(minute, 60))
- return None
-
-
def request(query, params):
"""Assemble request for the Peertube API"""
@@ -117,13 +111,17 @@ def video_response(resp):
if x
]
+ duration = result.get('duration')
+ if duration:
+ duration = timedelta(seconds=duration)
+
results.append(
{
'url': result['url'],
'title': result['name'],
'content': html_to_text(result.get('description') or ''),
'author': result.get('account', {}).get('displayName'),
- 'length': minute_to_hm(result.get('duration')),
+ 'length': duration,
'views': humanize_number(result['views']),
'template': 'videos.html',
'publishedDate': parse(result['publishedAt']),
diff --git a/searx/engines/presearch.py b/searx/engines/presearch.py
index ed68e1507..7e30801d1 100644
--- a/searx/engines/presearch.py
+++ b/searx/engines/presearch.py
@@ -73,7 +73,7 @@ Implementations
from urllib.parse import urlencode, urlparse
from searx import locales
from searx.network import get
-from searx.utils import gen_useragent, html_to_text
+from searx.utils import gen_useragent, html_to_text, parse_duration_string
about = {
"website": "https://presearch.io",
@@ -270,7 +270,7 @@ def response(resp):
'url': item.get('link'),
'content': item.get('description', ''),
'thumbnail': item.get('image'),
- 'length': item.get('duration'),
+ 'length': parse_duration_string(item.get('duration')),
}
)