diff options
author | micsthepick <11528421+micsthepick@users.noreply.github.com> | 2024-02-18 10:01:13 +1100 |
---|---|---|
committer | Markus Heiser <markus.heiser@darmarIT.de> | 2024-02-20 14:45:07 +0100 |
commit | fde21c8f99a578f60332bebc336b6f2e9fbe3874 (patch) | |
tree | cf574266a02a16f707d6b10dde06a2bee3ed1360 /searx/engines/livespace.py | |
parent | 3b80f9fe0377f1e5033d01e0f9aabdf97d963893 (diff) | |
download | searxng-fde21c8f99a578f60332bebc336b6f2e9fbe3874.tar.gz searxng-fde21c8f99a578f60332bebc336b6f2e9fbe3874.zip |
[feat] engine: Add LiveSpace livestreams
Diffstat (limited to 'searx/engines/livespace.py')
-rwxr-xr-x | searx/engines/livespace.py | 101 |
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 |