summaryrefslogtreecommitdiff
path: root/searx/engines/livespace.py
diff options
context:
space:
mode:
authormicsthepick <11528421+micsthepick@users.noreply.github.com>2024-02-18 10:01:13 +1100
committerMarkus Heiser <markus.heiser@darmarIT.de>2024-02-20 14:45:07 +0100
commitfde21c8f99a578f60332bebc336b6f2e9fbe3874 (patch)
treecf574266a02a16f707d6b10dde06a2bee3ed1360 /searx/engines/livespace.py
parent3b80f9fe0377f1e5033d01e0f9aabdf97d963893 (diff)
downloadsearxng-fde21c8f99a578f60332bebc336b6f2e9fbe3874.tar.gz
searxng-fde21c8f99a578f60332bebc336b6f2e9fbe3874.zip
[feat] engine: Add LiveSpace livestreams
Diffstat (limited to 'searx/engines/livespace.py')
-rwxr-xr-xsearx/engines/livespace.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/searx/engines/livespace.py b/searx/engines/livespace.py
new file mode 100755
index 000000000..3f466bbf0
--- /dev/null
+++ b/searx/engines/livespace.py
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+# lint: pylint
+"""LiveSpace (Videos)
+
+.. hint::
+
+ This engine only search for **live streams**!
+
+"""
+
+from urllib.parse import urlencode
+from datetime import datetime
+from babel import dates
+
+about = {
+ "website": 'https://live.space',
+ "wikidata_id": None,
+ "official_api_documentation": None,
+ "use_official_api": True,
+ "require_api_key": False,
+ "results": 'JSON',
+}
+
+categories = ['videos']
+
+base_url = 'https://backend.live.space'
+
+# engine dependent config
+paging = True
+results_per_page = 10
+
+
+def request(query, params):
+
+ args = {'page': params['pageno'] - 1, 'searchKey': query, 'size': results_per_page}
+ params['url'] = f"{base_url}/search/public/stream?{urlencode(args)}"
+ params['headers'] = {'Accept': 'application/json', 'Content-Type': 'application/json'}
+
+ return params
+
+
+def response(resp):
+
+ results = []
+ json = resp.json()
+ now = datetime.now()
+
+ # for live videos
+
+ for result in json.get('result', []):
+
+ title = result.get("title")
+ thumbnailUrl = result.get("thumbnailUrl")
+ category = result.get("category/name")
+ username = result.get("user", {}).get("userName", "")
+ url = f'https://live.space/watch/{username}'
+
+ # stream tags
+ # currently the api seems to always return null before the first tag,
+ # so strip that unless it's not already there
+ tags = ''
+ if result.get("tags"):
+ tags = [x for x in result.get("tags").split(';') if x and x != 'null']
+ tags = ', '.join(tags)
+
+ content = []
+ if category:
+ content.append(f'category - {category}')
+
+ if tags and len(tags) > 0:
+ content.append(f'tags - {tags}')
+
+ # time & duration
+ start_time = None
+ if result.get("startTimeStamp"):
+ start_time = datetime.fromtimestamp(result.get("startTimeStamp") / 1000)
+
+ # for VODs (videos on demand)
+ end_time = None
+ if result.get("endTimeStamp"):
+ end_time = datetime.fromtimestamp(result.get("endTimeStamp") / 1000)
+
+ timestring = ""
+ if start_time:
+ delta = (now if end_time is None else end_time) - start_time
+ timestring = dates.format_timedelta(delta, granularity='second')
+
+ results.append(
+ {
+ 'url': url,
+ 'title': title,
+ 'content': "No category or tags." if len(content) == 0 else ' '.join(content),
+ 'author': username,
+ 'length': (">= " if end_time is None else "") + timestring,
+ 'publishedDate': start_time,
+ 'thumbnail': thumbnailUrl,
+ 'template': 'videos.html',
+ }
+ )
+
+ return results