mirror of
https://github.com/searxng/searxng.git
synced 2025-02-17 02:40:03 +00:00
Merge pull request #882 from return42/fix-873
[fix] replace embedded HTML by data_src
This commit is contained in:
commit
bf2a2ed48f
@ -4,7 +4,7 @@ Bandcamp (Music)
|
|||||||
@website https://bandcamp.com/
|
@website https://bandcamp.com/
|
||||||
@provide-api no
|
@provide-api no
|
||||||
@results HTML
|
@results HTML
|
||||||
@parse url, title, content, publishedDate, embedded, thumbnail
|
@parse url, title, content, publishedDate, iframe_src, thumbnail
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from urllib.parse import urlencode, urlparse, parse_qs
|
from urllib.parse import urlencode, urlparse, parse_qs
|
||||||
@ -27,10 +27,7 @@ paging = True
|
|||||||
|
|
||||||
base_url = "https://bandcamp.com/"
|
base_url = "https://bandcamp.com/"
|
||||||
search_string = search_string = 'search?{query}&page={page}'
|
search_string = search_string = 'search?{query}&page={page}'
|
||||||
embedded_url = '''<iframe width="100%" height="166"
|
iframe_src = "https://bandcamp.com/EmbeddedPlayer/{type}={result_id}/size=large/bgcol=ffffff/linkcol=0687f5/tracklist=false/artwork=small/transparent=true/"
|
||||||
scrolling="no" frameborder="no"
|
|
||||||
data-src="https://bandcamp.com/EmbeddedPlayer/{type}={result_id}/size=large/bgcol=ffffff/linkcol=0687f5/tracklist=false/artwork=small/transparent=true/"
|
|
||||||
></iframe>'''
|
|
||||||
|
|
||||||
|
|
||||||
def request(query, params):
|
def request(query, params):
|
||||||
@ -74,8 +71,9 @@ def response(resp):
|
|||||||
if thumbnail:
|
if thumbnail:
|
||||||
new_result['thumbnail'] = thumbnail[0]
|
new_result['thumbnail'] = thumbnail[0]
|
||||||
if "album" in result.classes:
|
if "album" in result.classes:
|
||||||
new_result["embedded"] = embedded_url.format(type='album', result_id=result_id)
|
new_result["iframe_src"] = iframe_src.format(type='album', result_id=result_id)
|
||||||
elif "track" in result.classes:
|
elif "track" in result.classes:
|
||||||
new_result["embedded"] = embedded_url.format(type='track', result_id=result_id)
|
new_result["iframe_src"] = iframe_src.format(type='track', result_id=result_id)
|
||||||
|
|
||||||
results.append(new_result)
|
results.append(new_result)
|
||||||
return results
|
return results
|
||||||
|
@ -25,11 +25,6 @@ paging = True
|
|||||||
# search-url
|
# search-url
|
||||||
# see http://www.dailymotion.com/doc/api/obj-video.html
|
# see http://www.dailymotion.com/doc/api/obj-video.html
|
||||||
search_url = 'https://api.dailymotion.com/videos?fields=created_time,title,description,duration,url,thumbnail_360_url,id&sort=relevance&limit=5&page={pageno}&{query}' # noqa
|
search_url = 'https://api.dailymotion.com/videos?fields=created_time,title,description,duration,url,thumbnail_360_url,id&sort=relevance&limit=5&page={pageno}&{query}' # noqa
|
||||||
embedded_url = (
|
|
||||||
'<iframe frameborder="0" width="540" height="304" '
|
|
||||||
+ 'data-src="https://www.dailymotion.com/embed/video/{videoid}" allowfullscreen></iframe>'
|
|
||||||
)
|
|
||||||
|
|
||||||
supported_languages_url = 'https://api.dailymotion.com/languages'
|
supported_languages_url = 'https://api.dailymotion.com/languages'
|
||||||
|
|
||||||
|
|
||||||
@ -64,7 +59,6 @@ def response(resp):
|
|||||||
content = html_to_text(res['description'])
|
content = html_to_text(res['description'])
|
||||||
thumbnail = res['thumbnail_360_url']
|
thumbnail = res['thumbnail_360_url']
|
||||||
publishedDate = datetime.fromtimestamp(res['created_time'], None)
|
publishedDate = datetime.fromtimestamp(res['created_time'], None)
|
||||||
embedded = embedded_url.format(videoid=res['id'])
|
|
||||||
|
|
||||||
# http to https
|
# http to https
|
||||||
thumbnail = thumbnail.replace("http://", "https://")
|
thumbnail = thumbnail.replace("http://", "https://")
|
||||||
@ -76,7 +70,7 @@ def response(resp):
|
|||||||
'title': title,
|
'title': title,
|
||||||
'content': content,
|
'content': content,
|
||||||
'publishedDate': publishedDate,
|
'publishedDate': publishedDate,
|
||||||
'embedded': embedded,
|
'iframe_src': "https://www.dailymotion.com/embed/video/" + res['id'],
|
||||||
'thumbnail': thumbnail,
|
'thumbnail': thumbnail,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -23,13 +23,7 @@ paging = True
|
|||||||
# search-url
|
# search-url
|
||||||
url = 'https://api.deezer.com/'
|
url = 'https://api.deezer.com/'
|
||||||
search_url = url + 'search?{query}&index={offset}'
|
search_url = url + 'search?{query}&index={offset}'
|
||||||
|
iframe_src = "https://www.deezer.com/plugins/player?type=tracks&id={audioid}"
|
||||||
embedded_url = (
|
|
||||||
'<iframe scrolling="no" frameborder="0" allowTransparency="true" '
|
|
||||||
+ 'data-src="https://www.deezer.com/plugins/player?type=tracks&id={audioid}" '
|
|
||||||
+ 'width="540" height="80"></iframe>'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# do search-request
|
# do search-request
|
||||||
def request(query, params):
|
def request(query, params):
|
||||||
@ -57,10 +51,10 @@ def response(resp):
|
|||||||
|
|
||||||
content = '{} - {} - {}'.format(result['artist']['name'], result['album']['title'], result['title'])
|
content = '{} - {} - {}'.format(result['artist']['name'], result['album']['title'], result['title'])
|
||||||
|
|
||||||
embedded = embedded_url.format(audioid=result['id'])
|
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append({'url': url, 'title': title, 'embedded': embedded, 'content': content})
|
results.append(
|
||||||
|
{'url': url, 'title': title, 'iframe_src': iframe_src.format(audioid=result['id']), 'content': content}
|
||||||
|
)
|
||||||
|
|
||||||
# return results
|
# return results
|
||||||
return results
|
return results
|
||||||
|
@ -29,9 +29,6 @@ search_url = (
|
|||||||
url + "search/text/?query={query}&page={page}&fields=name,url,download,created,description,type&token={api_key}"
|
url + "search/text/?query={query}&page={page}&fields=name,url,download,created,description,type&token={api_key}"
|
||||||
)
|
)
|
||||||
|
|
||||||
embedded_url = '<audio controls><source src="{uri}" type="audio/{ftype}"></audio>'
|
|
||||||
|
|
||||||
|
|
||||||
# search request
|
# search request
|
||||||
def request(query, params):
|
def request(query, params):
|
||||||
params["url"] = search_url.format(
|
params["url"] = search_url.format(
|
||||||
@ -52,7 +49,6 @@ def response(resp):
|
|||||||
content = result["description"][:128]
|
content = result["description"][:128]
|
||||||
publishedDate = datetime.fromisoformat(result["created"])
|
publishedDate = datetime.fromisoformat(result["created"])
|
||||||
uri = result["download"]
|
uri = result["download"]
|
||||||
embedded = embedded_url.format(uri=uri, ftype=result["type"])
|
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append(
|
results.append(
|
||||||
@ -60,7 +56,7 @@ def response(resp):
|
|||||||
"url": result["url"],
|
"url": result["url"],
|
||||||
"title": title,
|
"title": title,
|
||||||
"publishedDate": publishedDate,
|
"publishedDate": publishedDate,
|
||||||
"embedded": embedded,
|
"audio_src": uri,
|
||||||
"content": content,
|
"content": content,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -58,14 +58,6 @@ def response(resp):
|
|||||||
results = []
|
results = []
|
||||||
|
|
||||||
search_results = resp.json()
|
search_results = resp.json()
|
||||||
embedded_url = (
|
|
||||||
'<iframe width="540" height="304" '
|
|
||||||
+ 'data-src="'
|
|
||||||
+ resp.search_params['base_url']
|
|
||||||
+ '/embed/{videoid}" '
|
|
||||||
+ 'frameborder="0" allowfullscreen></iframe>'
|
|
||||||
)
|
|
||||||
|
|
||||||
base_invidious_url = resp.search_params['base_url'] + "/watch?v="
|
base_invidious_url = resp.search_params['base_url'] + "/watch?v="
|
||||||
|
|
||||||
for result in search_results:
|
for result in search_results:
|
||||||
@ -76,7 +68,6 @@ def response(resp):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
url = base_invidious_url + videoid
|
url = base_invidious_url + videoid
|
||||||
embedded = embedded_url.format(videoid=videoid)
|
|
||||||
thumbs = result.get("videoThumbnails", [])
|
thumbs = result.get("videoThumbnails", [])
|
||||||
thumb = next((th for th in thumbs if th["quality"] == "sddefault"), None)
|
thumb = next((th for th in thumbs if th["quality"] == "sddefault"), None)
|
||||||
if thumb:
|
if thumb:
|
||||||
@ -100,7 +91,7 @@ def response(resp):
|
|||||||
"template": "videos.html",
|
"template": "videos.html",
|
||||||
"author": result.get("author"),
|
"author": result.get("author"),
|
||||||
"publishedDate": publishedDate,
|
"publishedDate": publishedDate,
|
||||||
"embedded": embedded,
|
"iframe_src": resp.search_params['base_url'] + '/embed/' + videoid,
|
||||||
"thumbnail": thumbnail,
|
"thumbnail": thumbnail,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -24,12 +24,7 @@ paging = True
|
|||||||
# search-url
|
# search-url
|
||||||
url = 'https://api.mixcloud.com/'
|
url = 'https://api.mixcloud.com/'
|
||||||
search_url = url + 'search/?{query}&type=cloudcast&limit=10&offset={offset}'
|
search_url = url + 'search/?{query}&type=cloudcast&limit=10&offset={offset}'
|
||||||
|
iframe_src = "https://www.mixcloud.com/widget/iframe/?feed={url}"
|
||||||
embedded_url = (
|
|
||||||
'<iframe scrolling="no" frameborder="0" allowTransparency="true" '
|
|
||||||
+ 'data-src="https://www.mixcloud.com/widget/iframe/?feed={url}" width="300" height="300"></iframe>'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# do search-request
|
# do search-request
|
||||||
def request(query, params):
|
def request(query, params):
|
||||||
@ -51,12 +46,17 @@ def response(resp):
|
|||||||
title = result['name']
|
title = result['name']
|
||||||
url = result['url']
|
url = result['url']
|
||||||
content = result['user']['name']
|
content = result['user']['name']
|
||||||
embedded = embedded_url.format(url=url)
|
|
||||||
publishedDate = parser.parse(result['created_time'])
|
publishedDate = parser.parse(result['created_time'])
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append(
|
results.append(
|
||||||
{'url': url, 'title': title, 'embedded': embedded, 'publishedDate': publishedDate, 'content': content}
|
{
|
||||||
|
'url': url,
|
||||||
|
'title': title,
|
||||||
|
'iframe_src': iframe_src.format(url=url),
|
||||||
|
'publishedDate': publishedDate,
|
||||||
|
'content': content,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
# return results
|
# return results
|
||||||
|
@ -51,12 +51,6 @@ def response(resp):
|
|||||||
|
|
||||||
search_res = loads(resp.text)
|
search_res = loads(resp.text)
|
||||||
|
|
||||||
embedded_url = (
|
|
||||||
'<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" '
|
|
||||||
+ 'src="'
|
|
||||||
+ sanitized_url
|
|
||||||
+ '{embed_path}" frameborder="0" allowfullscreen></iframe>'
|
|
||||||
)
|
|
||||||
# return empty array if there are no results
|
# return empty array if there are no results
|
||||||
if "data" not in search_res:
|
if "data" not in search_res:
|
||||||
return []
|
return []
|
||||||
@ -72,7 +66,6 @@ def response(resp):
|
|||||||
content = ""
|
content = ""
|
||||||
thumbnail = sanitized_url + res["thumbnailPath"]
|
thumbnail = sanitized_url + res["thumbnailPath"]
|
||||||
publishedDate = datetime.strptime(res["publishedAt"], "%Y-%m-%dT%H:%M:%S.%fZ")
|
publishedDate = datetime.strptime(res["publishedAt"], "%Y-%m-%dT%H:%M:%S.%fZ")
|
||||||
embedded = embedded_url.format(embed_path=res["embedPath"])
|
|
||||||
|
|
||||||
results.append(
|
results.append(
|
||||||
{
|
{
|
||||||
@ -81,7 +74,7 @@ def response(resp):
|
|||||||
"title": title,
|
"title": title,
|
||||||
"content": content,
|
"content": content,
|
||||||
"publishedDate": publishedDate,
|
"publishedDate": publishedDate,
|
||||||
"embedded": embedded,
|
"iframe_src": sanitized_url + res["embedPath"],
|
||||||
"thumbnail": thumbnail,
|
"thumbnail": thumbnail,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -41,9 +41,6 @@ time_range_table = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
embedded_url = '<iframe width="540" height="304" src="{url}" frameborder="0" allowfullscreen></iframe>'
|
|
||||||
|
|
||||||
|
|
||||||
def minute_to_hm(minute):
|
def minute_to_hm(minute):
|
||||||
if isinstance(minute, int):
|
if isinstance(minute, int):
|
||||||
return "%d:%02d" % (divmod(minute, 60))
|
return "%d:%02d" % (divmod(minute, 60))
|
||||||
@ -88,7 +85,6 @@ def response(resp):
|
|||||||
content = result['description']
|
content = result['description']
|
||||||
thumbnail = result['thumbnailUrl']
|
thumbnail = result['thumbnailUrl']
|
||||||
publishedDate = parser.parse(result['publishedAt'])
|
publishedDate = parser.parse(result['publishedAt'])
|
||||||
embedded = embedded_url.format(url=result.get('embedUrl'))
|
|
||||||
author = result.get('account', {}).get('displayName')
|
author = result.get('account', {}).get('displayName')
|
||||||
length = minute_to_hm(result.get('duration'))
|
length = minute_to_hm(result.get('duration'))
|
||||||
url = result['url']
|
url = result['url']
|
||||||
@ -102,7 +98,7 @@ def response(resp):
|
|||||||
'length': length,
|
'length': length,
|
||||||
'template': 'videos.html',
|
'template': 'videos.html',
|
||||||
'publishedDate': publishedDate,
|
'publishedDate': publishedDate,
|
||||||
'embedded': embedded,
|
'iframe_src': result.get('embedUrl'),
|
||||||
'thumbnail': thumbnail,
|
'thumbnail': thumbnail,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -37,12 +37,6 @@ search_url = (
|
|||||||
'&client_id={client_id}'
|
'&client_id={client_id}'
|
||||||
) # noqa
|
) # noqa
|
||||||
|
|
||||||
embedded_url = (
|
|
||||||
'<iframe width="100%" height="166" '
|
|
||||||
+ 'scrolling="no" frameborder="no" '
|
|
||||||
+ 'data-src="https://w.soundcloud.com/player/?url={uri}"></iframe>'
|
|
||||||
)
|
|
||||||
|
|
||||||
cid_re = re.compile(r'client_id:"([^"]*)"', re.I | re.U)
|
cid_re = re.compile(r'client_id:"([^"]*)"', re.I | re.U)
|
||||||
guest_client_id = ''
|
guest_client_id = ''
|
||||||
|
|
||||||
@ -97,7 +91,6 @@ def response(resp):
|
|||||||
content = result['description'] or ''
|
content = result['description'] or ''
|
||||||
publishedDate = parser.parse(result['last_modified'])
|
publishedDate = parser.parse(result['last_modified'])
|
||||||
uri = quote_plus(result['uri'])
|
uri = quote_plus(result['uri'])
|
||||||
embedded = embedded_url.format(uri=uri)
|
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append(
|
results.append(
|
||||||
@ -105,7 +98,7 @@ def response(resp):
|
|||||||
'url': result['permalink_url'],
|
'url': result['permalink_url'],
|
||||||
'title': title,
|
'title': title,
|
||||||
'publishedDate': publishedDate,
|
'publishedDate': publishedDate,
|
||||||
'embedded': embedded,
|
'iframe_src': "https://w.soundcloud.com/player/?url=" + uri,
|
||||||
'content': content,
|
'content': content,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -29,10 +29,6 @@ api_client_secret = None
|
|||||||
url = 'https://api.spotify.com/'
|
url = 'https://api.spotify.com/'
|
||||||
search_url = url + 'v1/search?{query}&type=track&offset={offset}'
|
search_url = url + 'v1/search?{query}&type=track&offset={offset}'
|
||||||
|
|
||||||
embedded_url = '<iframe data-src="https://embed.spotify.com/?uri=spotify:track:{audioid}"\
|
|
||||||
width="300" height="80" frameborder="0" allowtransparency="true"></iframe>'
|
|
||||||
|
|
||||||
|
|
||||||
# do search-request
|
# do search-request
|
||||||
def request(query, params):
|
def request(query, params):
|
||||||
offset = (params['pageno'] - 1) * 20
|
offset = (params['pageno'] - 1) * 20
|
||||||
@ -66,10 +62,15 @@ def response(resp):
|
|||||||
url = result['external_urls']['spotify']
|
url = result['external_urls']['spotify']
|
||||||
content = '{} - {} - {}'.format(result['artists'][0]['name'], result['album']['name'], result['name'])
|
content = '{} - {} - {}'.format(result['artists'][0]['name'], result['album']['name'], result['name'])
|
||||||
|
|
||||||
embedded = embedded_url.format(audioid=result['id'])
|
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append({'url': url, 'title': title, 'embedded': embedded, 'content': content})
|
results.append(
|
||||||
|
{
|
||||||
|
'url': url,
|
||||||
|
'title': title,
|
||||||
|
'iframe_src': "https://embed.spotify.com/?uri=spotify:track:" + result['id'],
|
||||||
|
'content': content,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
# return results
|
# return results
|
||||||
return results
|
return results
|
||||||
|
@ -25,12 +25,6 @@ paging = True
|
|||||||
base_url = 'https://vimeo.com/'
|
base_url = 'https://vimeo.com/'
|
||||||
search_url = base_url + '/search/page:{pageno}?{query}'
|
search_url = base_url + '/search/page:{pageno}?{query}'
|
||||||
|
|
||||||
embedded_url = (
|
|
||||||
'<iframe data-src="https://player.vimeo.com/video/{videoid}" '
|
|
||||||
+ 'width="540" height="304" frameborder="0" '
|
|
||||||
+ 'webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# do search-request
|
# do search-request
|
||||||
def request(query, params):
|
def request(query, params):
|
||||||
@ -54,7 +48,6 @@ def response(resp):
|
|||||||
title = result['name']
|
title = result['name']
|
||||||
thumbnail = result['pictures']['sizes'][-1]['link']
|
thumbnail = result['pictures']['sizes'][-1]['link']
|
||||||
publishedDate = parser.parse(result['created_time'])
|
publishedDate = parser.parse(result['created_time'])
|
||||||
embedded = embedded_url.format(videoid=videoid)
|
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append(
|
results.append(
|
||||||
@ -64,7 +57,7 @@ def response(resp):
|
|||||||
'content': '',
|
'content': '',
|
||||||
'template': 'videos.html',
|
'template': 'videos.html',
|
||||||
'publishedDate': publishedDate,
|
'publishedDate': publishedDate,
|
||||||
'embedded': embedded,
|
'iframe_src': "https://player.vimeo.com/video/" + videoid,
|
||||||
'thumbnail': thumbnail,
|
'thumbnail': thumbnail,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -26,13 +26,6 @@ api_key = None
|
|||||||
# search-url
|
# search-url
|
||||||
base_url = 'https://www.googleapis.com/youtube/v3/search'
|
base_url = 'https://www.googleapis.com/youtube/v3/search'
|
||||||
search_url = base_url + '?part=snippet&{query}&maxResults=20&key={api_key}'
|
search_url = base_url + '?part=snippet&{query}&maxResults=20&key={api_key}'
|
||||||
|
|
||||||
embedded_url = (
|
|
||||||
'<iframe width="540" height="304" '
|
|
||||||
+ 'data-src="https://www.youtube-nocookie.com/embed/{videoid}" '
|
|
||||||
+ 'frameborder="0" allowfullscreen></iframe>'
|
|
||||||
)
|
|
||||||
|
|
||||||
base_youtube_url = 'https://www.youtube.com/watch?v='
|
base_youtube_url = 'https://www.youtube.com/watch?v='
|
||||||
|
|
||||||
|
|
||||||
@ -77,8 +70,6 @@ def response(resp):
|
|||||||
|
|
||||||
url = base_youtube_url + videoid
|
url = base_youtube_url + videoid
|
||||||
|
|
||||||
embedded = embedded_url.format(videoid=videoid)
|
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append(
|
results.append(
|
||||||
{
|
{
|
||||||
@ -87,7 +78,7 @@ def response(resp):
|
|||||||
'content': content,
|
'content': content,
|
||||||
'template': 'videos.html',
|
'template': 'videos.html',
|
||||||
'publishedDate': publishedDate,
|
'publishedDate': publishedDate,
|
||||||
'embedded': embedded,
|
'iframe_src': "https://www.youtube-nocookie.com/embed/" + videoid,
|
||||||
'thumbnail': thumbnail,
|
'thumbnail': thumbnail,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -32,12 +32,6 @@ time_range_url = '&sp=EgII{time_range}%253D%253D'
|
|||||||
next_page_url = 'https://www.youtube.com/youtubei/v1/search?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8'
|
next_page_url = 'https://www.youtube.com/youtubei/v1/search?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8'
|
||||||
time_range_dict = {'day': 'Ag', 'week': 'Aw', 'month': 'BA', 'year': 'BQ'}
|
time_range_dict = {'day': 'Ag', 'week': 'Aw', 'month': 'BA', 'year': 'BQ'}
|
||||||
|
|
||||||
embedded_url = (
|
|
||||||
'<iframe width="540" height="304" '
|
|
||||||
+ 'data-src="https://www.youtube-nocookie.com/embed/{videoid}" '
|
|
||||||
+ 'frameborder="0" allowfullscreen></iframe>'
|
|
||||||
)
|
|
||||||
|
|
||||||
base_youtube_url = 'https://www.youtube.com/watch?v='
|
base_youtube_url = 'https://www.youtube.com/watch?v='
|
||||||
|
|
||||||
|
|
||||||
@ -91,7 +85,7 @@ def parse_next_page_response(response_text):
|
|||||||
'author': section['ownerText']['runs'][0]['text'],
|
'author': section['ownerText']['runs'][0]['text'],
|
||||||
'length': section['lengthText']['simpleText'],
|
'length': section['lengthText']['simpleText'],
|
||||||
'template': 'videos.html',
|
'template': 'videos.html',
|
||||||
'embedded': embedded_url.format(videoid=section['videoId']),
|
'iframe_src': 'https://www.youtube-nocookie.com/embed/' + section['videoId'],
|
||||||
'thumbnail': section['thumbnail']['thumbnails'][-1]['url'],
|
'thumbnail': section['thumbnail']['thumbnails'][-1]['url'],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@ -150,7 +144,6 @@ def parse_first_page_response(response_text):
|
|||||||
thumbnail = 'https://i.ytimg.com/vi/' + videoid + '/hqdefault.jpg'
|
thumbnail = 'https://i.ytimg.com/vi/' + videoid + '/hqdefault.jpg'
|
||||||
title = get_text_from_json(video.get('title', {}))
|
title = get_text_from_json(video.get('title', {}))
|
||||||
content = get_text_from_json(video.get('descriptionSnippet', {}))
|
content = get_text_from_json(video.get('descriptionSnippet', {}))
|
||||||
embedded = embedded_url.format(videoid=videoid)
|
|
||||||
author = get_text_from_json(video.get('ownerText', {}))
|
author = get_text_from_json(video.get('ownerText', {}))
|
||||||
length = get_text_from_json(video.get('lengthText', {}))
|
length = get_text_from_json(video.get('lengthText', {}))
|
||||||
|
|
||||||
@ -163,7 +156,7 @@ def parse_first_page_response(response_text):
|
|||||||
'author': author,
|
'author': author,
|
||||||
'length': length,
|
'length': length,
|
||||||
'template': 'videos.html',
|
'template': 'videos.html',
|
||||||
'embedded': embedded,
|
'iframe_src': 'https://www.youtube-nocookie.com/embed/' + videoid,
|
||||||
'thumbnail': thumbnail,
|
'thumbnail': thumbnail,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
import re
|
import re
|
||||||
from urllib.parse import urlunparse
|
from urllib.parse import urlunparse, urlparse
|
||||||
from searx import settings
|
from searx import settings
|
||||||
from searx.plugins import logger
|
from searx.plugins import logger
|
||||||
from flask_babel import gettext
|
from flask_babel import gettext
|
||||||
@ -17,16 +17,30 @@ replacements = {re.compile(p): r for (p, r) in settings[plugin_id].items()} if p
|
|||||||
|
|
||||||
logger = logger.getChild(plugin_id)
|
logger = logger.getChild(plugin_id)
|
||||||
parsed = 'parsed_url'
|
parsed = 'parsed_url'
|
||||||
|
_url_fields = ['iframe_src', 'audio_src']
|
||||||
|
|
||||||
|
|
||||||
def on_result(request, search, result):
|
def on_result(request, search, result):
|
||||||
if parsed not in result:
|
|
||||||
return True
|
|
||||||
for (pattern, replacement) in replacements.items():
|
for (pattern, replacement) in replacements.items():
|
||||||
if pattern.search(result[parsed].netloc):
|
|
||||||
if not replacement:
|
if parsed in result:
|
||||||
return False
|
if pattern.search(result[parsed].netloc):
|
||||||
result[parsed] = result[parsed]._replace(netloc=pattern.sub(replacement, result[parsed].netloc))
|
# to keep or remove this result from the result list depends
|
||||||
result['url'] = urlunparse(result[parsed])
|
# (only) on the 'parsed_url'
|
||||||
|
if not replacement:
|
||||||
|
return False
|
||||||
|
result[parsed] = result[parsed]._replace(netloc=pattern.sub(replacement, result[parsed].netloc))
|
||||||
|
result['url'] = urlunparse(result[parsed])
|
||||||
|
|
||||||
|
for url_field in _url_fields:
|
||||||
|
if result.get(url_field):
|
||||||
|
url_src = urlparse(result[url_field])
|
||||||
|
if pattern.search(url_src.netloc):
|
||||||
|
if not replacement:
|
||||||
|
del result[url_field]
|
||||||
|
else:
|
||||||
|
url_src = url_src._replace(netloc=pattern.sub(replacement, url_src.netloc))
|
||||||
|
result[url_field] = urlunparse(url_src)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
Binary file not shown.
BIN
searx/static/themes/simple/css/searxng-rtl.min.css
vendored
BIN
searx/static/themes/simple/css/searxng-rtl.min.css
vendored
Binary file not shown.
Binary file not shown.
BIN
searx/static/themes/simple/css/searxng.min.css
vendored
BIN
searx/static/themes/simple/css/searxng.min.css
vendored
Binary file not shown.
Binary file not shown.
19
searx/static/themes/simple/src/less/embedded.less
Normal file
19
searx/static/themes/simple/src/less/embedded.less
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
iframe[src^="https://w.soundcloud.com"] {
|
||||||
|
height: 120px;
|
||||||
|
}
|
||||||
|
|
||||||
|
iframe[src^="https://www.deezer.com"] {
|
||||||
|
// The real size is 92px, but 94px are needed to avoid an inner scrollbar of
|
||||||
|
// the embedded HTML.
|
||||||
|
height: 94px;
|
||||||
|
}
|
||||||
|
|
||||||
|
iframe[src^="https://www.mixcloud.com"] {
|
||||||
|
// the embedded player from mixcloud has some quirks: initial there is an
|
||||||
|
// issue with an image URL that is blocked since it is an a Cross-Origin
|
||||||
|
// request. The alternative text (<img alt='Mixcloud Logo'> then cause an
|
||||||
|
// scrollbar in the inner of the iframe we can't avoid. Another quirk comes
|
||||||
|
// when pressing the play button, somtimes the shown player has an height of
|
||||||
|
// 200px, somtimes 250px.
|
||||||
|
height: 250px;
|
||||||
|
}
|
@ -17,6 +17,7 @@
|
|||||||
@import "autocomplete.less";
|
@import "autocomplete.less";
|
||||||
@import "detail.less";
|
@import "detail.less";
|
||||||
@import "animations.less";
|
@import "animations.less";
|
||||||
|
@import "embedded.less";
|
||||||
|
|
||||||
// for index.html template
|
// for index.html template
|
||||||
@import "index.less";
|
@import "index.less";
|
||||||
@ -296,10 +297,34 @@ article[data-vim-selected].category-social {
|
|||||||
padding: 0 5px 25px 0 !important;
|
padding: 0 5px 25px 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.audio-control audio {
|
||||||
|
width: 100%;
|
||||||
|
padding: 10px 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.embedded-content iframe {
|
||||||
|
width: 100%;
|
||||||
|
padding: 10px 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
.result-videos .content {
|
.result-videos .content {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.result-videos .embedded-video iframe {
|
||||||
|
width: 100%;
|
||||||
|
aspect-ratio: 16 / 9;
|
||||||
|
padding: 10px 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@supports not (aspect-ratio: 1 / 1) {
|
||||||
|
// support older browsers which do not have aspect-ratio
|
||||||
|
// https://caniuse.com/?search=aspect-ratio
|
||||||
|
.result-videos .embedded-video iframe {
|
||||||
|
height: calc(@results-width * 9 / 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.engines {
|
.engines {
|
||||||
.ltr-float-right();
|
.ltr-float-right();
|
||||||
color: var(--color-result-engines-font);
|
color: var(--color-result-engines-font);
|
||||||
|
@ -3,13 +3,13 @@
|
|||||||
{{- result_header(result, favicons, loop.index) -}}
|
{{- result_header(result, favicons, loop.index) -}}
|
||||||
{{- result_sub_header(result, loop.index) -}}
|
{{- result_sub_header(result, loop.index) -}}
|
||||||
|
|
||||||
{%- if result.embedded -%}
|
{%- if result.iframe_src -%}
|
||||||
<small> • <a class="text-info btn-collapse collapsed cursor-pointer media-loader disabled_if_nojs" data-toggle="collapse" data-target="#result-media-{{ index }}" data-btn-text-collapsed="{{ _('show media') }}" data-btn-text-not-collapsed="{{ _('hide media') }}" aria-labelledby="result-{{loop.index}}">{{ icon('music') }} {{ _('show media') }}</a></small>
|
<small> • <a class="text-info btn-collapse collapsed cursor-pointer media-loader disabled_if_nojs" data-toggle="collapse" data-target="#result-media-{{ index }}" data-btn-text-collapsed="{{ _('show media') }}" data-btn-text-not-collapsed="{{ _('hide media') }}" aria-labelledby="result-{{loop.index}}">{{ icon('music') }} {{ _('show media') }}</a></small>
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
{%- if result.embedded -%}
|
{% if result.iframe_src -%}
|
||||||
<div id="result-media-{{ index }}" class="collapse">
|
<div id="result-media-{{ index }}" class="embedded-content invisible">
|
||||||
{{- result.embedded|safe -}}
|
<iframe data-src="{{result.iframe_src}}" frameborder="0" scrolling="no" allowfullscreen></iframe>
|
||||||
</div>
|
</div>
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
@ -24,6 +24,13 @@
|
|||||||
{%- if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif -%}
|
{%- if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
|
{% if result.audio_src -%}
|
||||||
|
<div id="result-media-{{ index }}" class="audio-control">
|
||||||
|
<audio controls><source src="{{result.audio_src}}"></audio>
|
||||||
|
</div>
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
|
||||||
{%- if rtl -%}
|
{%- if rtl -%}
|
||||||
{{ result_footer_rtl(result, loop.index) }}
|
{{ result_footer_rtl(result, loop.index) }}
|
||||||
{%- else -%}
|
{%- else -%}
|
||||||
|
@ -3,15 +3,15 @@
|
|||||||
{{- result_header(result, favicons, loop.index) -}}
|
{{- result_header(result, favicons, loop.index) -}}
|
||||||
{{- result_sub_header(result, loop.index) -}}
|
{{- result_sub_header(result, loop.index) -}}
|
||||||
|
|
||||||
{%- if result.embedded -%}
|
{%- if result.iframe_src -%}
|
||||||
<small> • <a class="text-info btn-collapse collapsed cursor-pointer media-loader disabled_if_nojs" data-toggle="collapse" data-target="#result-video-{{ index }}" data-btn-text-collapsed="{{ _('show video') }}" data-btn-text-not-collapsed="{{ _('hide video') }}" aria-labelledby="result-{{loop.index}}">{{ icon('film') }} {{ _('show video') }}</a></small>
|
<small> • <a class="text-info btn-collapse collapsed cursor-pointer media-loader disabled_if_nojs" data-toggle="collapse" data-target="#result-video-{{ index }}" data-btn-text-collapsed="{{ _('show video') }}" data-btn-text-not-collapsed="{{ _('hide video') }}" aria-labelledby="result-{{loop.index}}">{{ icon('film') }} {{ _('show video') }}</a></small>
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
|
||||||
{%- if result.embedded -%}
|
{% if result.iframe_src -%}
|
||||||
<div id="result-video-{{ index }}" class="collapse">
|
<div id="result-video-{{ index }}" class="embedded-video collapse">
|
||||||
{{- result.embedded|safe -}}
|
<iframe data-src="{{result.iframe_src}}" width="540" height="304" frameborder="0" scrolling="no" allowfullscreen></iframe>
|
||||||
</div>
|
</div>
|
||||||
{%- endif -%}
|
{%- endif %}
|
||||||
|
|
||||||
<div class="container-fluid">{{- "" -}}
|
<div class="container-fluid">{{- "" -}}
|
||||||
<div class="row">{{- "" -}}
|
<div class="row">{{- "" -}}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{{ result_header(result, favicons, image_proxify) -}}
|
{{ result_header(result, favicons, image_proxify) -}}
|
||||||
{{- result_sub_header(result) -}}
|
{{- result_sub_header(result) -}}
|
||||||
{% if result.embedded -%}
|
{% if result.iframe_src -%}
|
||||||
<p class="altlink"> • <a class="btn-collapse collapsed media-loader disabled_if_nojs" data-target="#result-media-{{ index }}" data-btn-text-collapsed="{{ _('show media') }}" data-btn-text-not-collapsed="{{ _('hide media') }}">{{ icon('music-note') }} {{ _('show media') }}</a></p>
|
<p class="altlink"> • <a class="btn-collapse collapsed media-loader disabled_if_nojs" data-target="#result-media-{{ index }}" data-btn-text-collapsed="{{ _('show media') }}" data-btn-text-not-collapsed="{{ _('hide media') }}">{{ icon('music-note') }} {{ _('show media') }}</a></p>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- if result.content %}
|
{%- if result.content %}
|
||||||
@ -15,9 +15,14 @@
|
|||||||
</p>
|
</p>
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
{{- result_sub_footer(result, proxify) -}}
|
{{- result_sub_footer(result, proxify) -}}
|
||||||
{% if result.embedded -%}
|
{% if result.iframe_src -%}
|
||||||
<div id="result-media-{{ index }}" class="invisible">
|
<div id="result-media-{{ index }}" class="embedded-content invisible">
|
||||||
{{- result.embedded|safe -}}
|
<iframe data-src="{{result.iframe_src}}" frameborder="0" allowfullscreen></iframe>
|
||||||
|
</div>
|
||||||
|
{%- endif %}
|
||||||
|
{% if result.audio_src -%}
|
||||||
|
<div id="result-media-{{ index }}" class="audio-control">
|
||||||
|
<audio controls><source src="{{result.audio_src}}"></audio>
|
||||||
</div>
|
</div>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{{- result_footer(result) }}
|
{{- result_footer(result) }}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{{ result_header(result, favicons, image_proxify) }}
|
{{ result_header(result, favicons, image_proxify) }}
|
||||||
{{ result_sub_header(result) }}
|
{{ result_sub_header(result) }}
|
||||||
{% if result.embedded -%}
|
{% if result.iframe_src -%}
|
||||||
<p class="altlink"> • <a class="btn-collapse collapsed media-loader disabled_if_nojs" data-target="#result-video-{{ index }}" data-btn-text-collapsed="{{ _('show video') }}" data-btn-text-not-collapsed="{{ _('hide video') }}">{{ icon('film-outline') }} {{ _('show video') }}</a></p>
|
<p class="altlink"> • <a class="btn-collapse collapsed media-loader disabled_if_nojs" data-target="#result-video-{{ index }}" data-btn-text-collapsed="{{ _('show video') }}" data-btn-text-not-collapsed="{{ _('hide video') }}">{{ icon('film-outline') }} {{ _('show video') }}</a></p>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- if result.content %}
|
{%- if result.content %}
|
||||||
@ -16,9 +16,9 @@
|
|||||||
{% endif -%}
|
{% endif -%}
|
||||||
</p>
|
</p>
|
||||||
{{- result_sub_footer(result, proxify) -}}
|
{{- result_sub_footer(result, proxify) -}}
|
||||||
{% if result.embedded -%}
|
{% if result.iframe_src -%}
|
||||||
<div id="result-video-{{ index }}" class="invisible">
|
<div id="result-video-{{ index }}" class="embedded-video invisible">
|
||||||
{{- result.embedded|safe -}}
|
<iframe data-src="{{result.iframe_src}}" frameborder="0" allowfullscreen></iframe>
|
||||||
</div>
|
</div>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{{ result_footer(result) }}
|
{{ result_footer(result) }}
|
||||||
|
Loading…
Reference in New Issue
Block a user