settings.py: add 'proxy_images'
This commit is contained in:
parent
9123d9a6cf
commit
f8d9be2d5a
18
settings.py
18
settings.py
@ -128,6 +128,13 @@ For security reasons, enabling this is not recommended.''',
|
|||||||
'comment': '',
|
'comment': '',
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
('proxy_images', {
|
||||||
|
'label': 'proxy images',
|
||||||
|
'type': bool,
|
||||||
|
'default': True,
|
||||||
|
'comment': '',
|
||||||
|
}),
|
||||||
|
|
||||||
('theme', {
|
('theme', {
|
||||||
'type': int,
|
'type': int,
|
||||||
'default': 0,
|
'default': 0,
|
||||||
@ -257,7 +264,7 @@ else:
|
|||||||
if type(node) != ast.Assign:
|
if type(node) != ast.Assign:
|
||||||
log_ignored_line(node.lineno, "only assignments are allowed")
|
log_ignored_line(node.lineno, "only assignments are allowed")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if len(node.targets) > 1:
|
if len(node.targets) > 1:
|
||||||
log_ignored_line(node.lineno, "only simple single-variable assignments allowed")
|
log_ignored_line(node.lineno, "only simple single-variable assignments allowed")
|
||||||
continue
|
continue
|
||||||
@ -266,11 +273,11 @@ else:
|
|||||||
if type(target) != ast.Name:
|
if type(target) != ast.Name:
|
||||||
log_ignored_line(node.lineno, "only simple single-variable assignments allowed")
|
log_ignored_line(node.lineno, "only simple single-variable assignments allowed")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if target.id not in acceptable_targets:
|
if target.id not in acceptable_targets:
|
||||||
log_ignored_line(node.lineno, target.id + " is not a valid setting")
|
log_ignored_line(node.lineno, target.id + " is not a valid setting")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if type(node.value) not in attributes:
|
if type(node.value) not in attributes:
|
||||||
log_ignored_line(node.lineno, "only literals allowed for values")
|
log_ignored_line(node.lineno, "only literals allowed for values")
|
||||||
continue
|
continue
|
||||||
@ -298,6 +305,11 @@ else:
|
|||||||
globals().update(current_settings_dict)
|
globals().update(current_settings_dict)
|
||||||
|
|
||||||
|
|
||||||
|
if proxy_images:
|
||||||
|
img_prefix = "/"
|
||||||
|
else:
|
||||||
|
img_prefix = ""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if route_tor:
|
if route_tor:
|
||||||
|
@ -92,7 +92,7 @@ def post_process_comments_info(comments_info):
|
|||||||
comment['author_url'] = concat_or_none(
|
comment['author_url'] = concat_or_none(
|
||||||
util.URL_ORIGIN, comment['author_url'])
|
util.URL_ORIGIN, comment['author_url'])
|
||||||
comment['author_avatar'] = concat_or_none(
|
comment['author_avatar'] = concat_or_none(
|
||||||
'/', comment['author_avatar'])
|
settings.img_prefix, comment['author_avatar'])
|
||||||
|
|
||||||
comment['permalink'] = concat_or_none(util.URL_ORIGIN, '/watch?v=',
|
comment['permalink'] = concat_or_none(util.URL_ORIGIN, '/watch?v=',
|
||||||
comments_info['video_id'], '&lc=', comment['id'])
|
comments_info['video_id'], '&lc=', comment['id'])
|
||||||
@ -139,7 +139,7 @@ def post_process_comments_info(comments_info):
|
|||||||
|
|
||||||
comments_info['video_url'] = concat_or_none(util.URL_ORIGIN,
|
comments_info['video_url'] = concat_or_none(util.URL_ORIGIN,
|
||||||
'/watch?v=', comments_info['video_id'])
|
'/watch?v=', comments_info['video_id'])
|
||||||
comments_info['video_thumbnail'] = concat_or_none('/i.ytimg.com/vi/',
|
comments_info['video_thumbnail'] = concat_or_none(settings.img_prefix, 'https://i.ytimg.com/vi/',
|
||||||
comments_info['video_id'], '/mqdefault.jpg')
|
comments_info['video_id'], '/mqdefault.jpg')
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ def add_to_playlist(name, video_info_list):
|
|||||||
file.write(info + "\n")
|
file.write(info + "\n")
|
||||||
missing_thumbnails.append(id)
|
missing_thumbnails.append(id)
|
||||||
gevent.spawn(util.download_thumbnails, os.path.join(thumbnails_directory, name), missing_thumbnails)
|
gevent.spawn(util.download_thumbnails, os.path.join(thumbnails_directory, name), missing_thumbnails)
|
||||||
|
|
||||||
|
|
||||||
def get_local_playlist_videos(name, offset=0, amount=50):
|
def get_local_playlist_videos(name, offset=0, amount=50):
|
||||||
try:
|
try:
|
||||||
@ -52,7 +52,7 @@ def get_local_playlist_videos(name, offset=0, amount=50):
|
|||||||
try:
|
try:
|
||||||
info = json.loads(video_json)
|
info = json.loads(video_json)
|
||||||
if info['id'] + ".jpg" in thumbnails:
|
if info['id'] + ".jpg" in thumbnails:
|
||||||
info['thumbnail'] = "/youtube.com/data/playlist_thumbnails/" + name + "/" + info['id'] + ".jpg"
|
info['thumbnail'] = settings.img_prefix + "https://youtube.com/data/playlist_thumbnails/" + name + "/" + info['id'] + ".jpg"
|
||||||
else:
|
else:
|
||||||
info['thumbnail'] = util.get_thumbnail_url(info['id'])
|
info['thumbnail'] = util.get_thumbnail_url(info['id'])
|
||||||
missing_thumbnails.append(info['id'])
|
missing_thumbnails.append(info['id'])
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
from youtube import util, yt_data_extract, proto
|
from youtube import util, yt_data_extract, proto
|
||||||
from youtube import yt_app
|
from youtube import yt_app
|
||||||
|
import settings
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
import urllib
|
import urllib
|
||||||
@ -14,15 +15,15 @@ import flask
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def playlist_ctoken(playlist_id, offset):
|
def playlist_ctoken(playlist_id, offset):
|
||||||
|
|
||||||
offset = proto.uint(1, offset)
|
offset = proto.uint(1, offset)
|
||||||
# this is just obfuscation as far as I can tell. It doesn't even follow protobuf
|
# this is just obfuscation as far as I can tell. It doesn't even follow protobuf
|
||||||
offset = b'PT:' + proto.unpadded_b64encode(offset)
|
offset = b'PT:' + proto.unpadded_b64encode(offset)
|
||||||
offset = proto.string(15, offset)
|
offset = proto.string(15, offset)
|
||||||
|
|
||||||
continuation_info = proto.string( 3, proto.percent_b64encode(offset) )
|
continuation_info = proto.string( 3, proto.percent_b64encode(offset) )
|
||||||
|
|
||||||
playlist_id = proto.string(2, 'VL' + playlist_id )
|
playlist_id = proto.string(2, 'VL' + playlist_id )
|
||||||
pointless_nest = proto.string(80226972, playlist_id + continuation_info)
|
pointless_nest = proto.string(80226972, playlist_id + continuation_info)
|
||||||
|
|
||||||
@ -51,7 +52,7 @@ def playlist_first_page(playlist_id, report_text = "Retrieved playlist"):
|
|||||||
content = json.loads(util.uppercase_escape(content.decode('utf-8')))
|
content = json.loads(util.uppercase_escape(content.decode('utf-8')))
|
||||||
|
|
||||||
return content
|
return content
|
||||||
|
|
||||||
|
|
||||||
#https://m.youtube.com/playlist?itct=CBMQybcCIhMIptj9xJaJ2wIV2JKcCh3Idwu-&ctoken=4qmFsgI2EiRWTFBMT3kwajlBdmxWWlB0bzZJa2pLZnB1MFNjeC0tN1BHVEMaDmVnWlFWRHBEUWxFJTNE&pbj=1
|
#https://m.youtube.com/playlist?itct=CBMQybcCIhMIptj9xJaJ2wIV2JKcCh3Idwu-&ctoken=4qmFsgI2EiRWTFBMT3kwajlBdmxWWlB0bzZJa2pLZnB1MFNjeC0tN1BHVEMaDmVnWlFWRHBEUWxFJTNE&pbj=1
|
||||||
def get_videos(playlist_id, page):
|
def get_videos(playlist_id, page):
|
||||||
@ -84,7 +85,7 @@ def get_playlist_page():
|
|||||||
this_page_json = first_page_json
|
this_page_json = first_page_json
|
||||||
else:
|
else:
|
||||||
tasks = (
|
tasks = (
|
||||||
gevent.spawn(playlist_first_page, playlist_id, report_text="Retrieved playlist info" ),
|
gevent.spawn(playlist_first_page, playlist_id, report_text="Retrieved playlist info" ),
|
||||||
gevent.spawn(get_videos, playlist_id, page)
|
gevent.spawn(get_videos, playlist_id, page)
|
||||||
)
|
)
|
||||||
gevent.joinall(tasks)
|
gevent.joinall(tasks)
|
||||||
@ -103,7 +104,7 @@ def get_playlist_page():
|
|||||||
util.prefix_urls(item)
|
util.prefix_urls(item)
|
||||||
util.add_extra_html_info(item)
|
util.add_extra_html_info(item)
|
||||||
if 'id' in item:
|
if 'id' in item:
|
||||||
item['thumbnail'] = '/https://i.ytimg.com/vi/' + item['id'] + '/default.jpg'
|
item['thumbnail'] = f'{settings.img_prefix}https://i.ytimg.com/vi/' + item['id'] + '/default.jpg'
|
||||||
|
|
||||||
item['url'] += '&list=' + playlist_id
|
item['url'] += '&list=' + playlist_id
|
||||||
if item['index']:
|
if item['index']:
|
||||||
|
@ -820,6 +820,7 @@ def get_subscriptions_page():
|
|||||||
videos, number_of_videos_in_db = _get_videos(cursor, 60, (page - 1)*60, tag)
|
videos, number_of_videos_in_db = _get_videos(cursor, 60, (page - 1)*60, tag)
|
||||||
for video in videos:
|
for video in videos:
|
||||||
video['thumbnail'] = util.URL_ORIGIN + '/data/subscription_thumbnails/' + video['id'] + '.jpg'
|
video['thumbnail'] = util.URL_ORIGIN + '/data/subscription_thumbnails/' + video['id'] + '.jpg'
|
||||||
|
if not settings.proxy_images: video['thumbnail'] = video['thumbnail'][1:]
|
||||||
video['type'] = 'video'
|
video['type'] = 'video'
|
||||||
video['item_size'] = 'small'
|
video['item_size'] = 'small'
|
||||||
util.add_extra_html_info(video)
|
util.add_extra_html_info(video)
|
||||||
|
@ -3,7 +3,9 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>{{ page_title }}</title>
|
<title>{{ page_title }}</title>
|
||||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline'; media-src 'self' https://*.googlevideo.com">
|
{% if settings.proxy_images %}
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline'; media-src 'self' https://*.googlevideo.com">
|
||||||
|
{% endif %}
|
||||||
<link href="{{ theme_path }}" type="text/css" rel="stylesheet">
|
<link href="{{ theme_path }}" type="text/css" rel="stylesheet">
|
||||||
<link href="/youtube.com/static/shared.css" type="text/css" rel="stylesheet">
|
<link href="/youtube.com/static/shared.css" type="text/css" rel="stylesheet">
|
||||||
<link href="/youtube.com/static/comments.css" type="text/css" rel="stylesheet">
|
<link href="/youtube.com/static/comments.css" type="text/css" rel="stylesheet">
|
||||||
|
@ -342,8 +342,8 @@ def video_id(url):
|
|||||||
|
|
||||||
# default, sddefault, mqdefault, hqdefault, hq720
|
# default, sddefault, mqdefault, hqdefault, hq720
|
||||||
def get_thumbnail_url(video_id):
|
def get_thumbnail_url(video_id):
|
||||||
return "/i.ytimg.com/vi/" + video_id + "/mqdefault.jpg"
|
return f"{settings.img_prefix}https://i.ytimg.com/vi/" + video_id + "/mqdefault.jpg"
|
||||||
|
|
||||||
def seconds_to_timestamp(seconds):
|
def seconds_to_timestamp(seconds):
|
||||||
seconds = int(seconds)
|
seconds = int(seconds)
|
||||||
hours, seconds = divmod(seconds,3600)
|
hours, seconds = divmod(seconds,3600)
|
||||||
@ -394,10 +394,11 @@ def concat_or_none(*strings):
|
|||||||
|
|
||||||
|
|
||||||
def prefix_urls(item):
|
def prefix_urls(item):
|
||||||
try:
|
if settings.proxy_images:
|
||||||
item['thumbnail'] = prefix_url(item['thumbnail'])
|
try:
|
||||||
except KeyError:
|
item['thumbnail'] = prefix_url(item['thumbnail'])
|
||||||
pass
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
item['author_url'] = prefix_url(item['author_url'])
|
item['author_url'] = prefix_url(item['author_url'])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user