diff --git a/searx/engines/9gag.py b/searx/engines/9gag.py new file mode 100644 index 000000000..b142adc0e --- /dev/null +++ b/searx/engines/9gag.py @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# lint: pylint +# pylint: disable=C0103 +"""9GAG (social media)""" + +from json import loads +from datetime import datetime +from urllib.parse import urlencode + +about = { + "website": 'https://9gag.com/', + "wikidata_id": 'Q277421', + "official_api_documentation": None, + "use_official_api": True, + "require_api_key": False, + "results": 'JSON', +} + +categories = ['social media'] +paging = True + +search_url = "https://9gag.com/v1/search-posts?{query}" +page_size = 10 + + +def request(query, params): + query = urlencode({'query': query, 'c': (params['pageno'] - 1) * page_size}) + + params['url'] = search_url.format(query=query) + + return params + + +def response(resp): + results = [] + + json_results = loads(resp.text)['data']['posts'] + + for result in json_results: + result_type = result['type'] + + if result_type == 'Photo': + results.append( + { + 'template': 'images.html', + 'url': result['url'], + 'title': result['title'], + 'content': result['description'], + 'publishedDate': datetime.utcfromtimestamp(result['creationTs']), + 'img_src': result['images']['image700']['url'], + 'thumbnail_src': result['images']['imageFbThumbnail']['url'], + } + ) + elif result_type == 'Animated': + results.append( + { + 'template': 'videos.html', + 'url': result['url'], + 'title': result['title'], + 'content': result['description'], + 'publishedDate': datetime.utcfromtimestamp(result['creationTs']), + 'thumbnail': result['images']['imageFbThumbnail']['url'], + } + ) + + return results diff --git a/searx/settings.yml b/searx/settings.yml index a61be1071..73119d2d4 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -262,6 +262,11 @@ categories_as_tabs: social media: engines: + - name: 9gag + engine: 9gag + shortcut: 9g + disabled: true + - name: apk mirror engine: apkmirror timeout: 4.0