Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
d6b7a255d0
|
|||
|
22bc7324db
|
|||
|
48e8f271e7
|
|||
|
9a0ad6070b
|
|||
|
6039589f24
|
|||
|
d4cba7eb6c
|
|||
|
70cb453280
|
|||
|
7a106331e7
|
|||
|
8775e131af
|
|||
|
1f16f7cb62
|
|||
|
80b7f3cd00
|
|||
|
8b79e067bc
|
@@ -1,5 +1,3 @@
|
||||
[](https://drone.hgit.ga/heckyel/yt-local)
|
||||
|
||||
# yt-local
|
||||
|
||||
Fork of [youtube-local](https://github.com/user234683/youtube-local)
|
||||
@@ -153,7 +151,7 @@ For coding guidelines and an overview of the software architecture, see the [HAC
|
||||
|
||||
yt-local is not made to work in public mode, however there is an instance of yt-local in public mode but with less features
|
||||
|
||||
- <https://1cd1-93-95-230-133.ngrok-free.app/https://youtube.com>
|
||||
- <https://m.fridu.us/https://youtube.com>
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -264,7 +264,7 @@ def get_channel_tab(channel_id, page="1", sort=3, tab='videos', view=1,
|
||||
'hl': 'en',
|
||||
'gl': 'US',
|
||||
'clientName': 'WEB',
|
||||
'clientVersion': '2.20180830',
|
||||
'clientVersion': '2.20240327.00.00',
|
||||
},
|
||||
},
|
||||
'continuation': ctoken,
|
||||
@@ -371,7 +371,7 @@ def get_channel_search_json(channel_id, query, page):
|
||||
'hl': 'en',
|
||||
'gl': 'US',
|
||||
'clientName': 'WEB',
|
||||
'clientVersion': '2.20180830',
|
||||
'clientVersion': '2.20240327.00.00',
|
||||
},
|
||||
},
|
||||
'continuation': ctoken,
|
||||
|
||||
@@ -53,7 +53,7 @@ def request_comments(ctoken, replies=False):
|
||||
'hl': 'en',
|
||||
'gl': 'US',
|
||||
'clientName': 'MWEB',
|
||||
'clientVersion': '2.20210804.02.00',
|
||||
'clientVersion': '2.20240328.08.00',
|
||||
},
|
||||
},
|
||||
'continuation': ctoken.replace('=', '%3D'),
|
||||
|
||||
@@ -1,20 +1,22 @@
|
||||
:root {
|
||||
--background: #212121;
|
||||
--background: #121113;
|
||||
--text: #FFFFFF;
|
||||
--secondary-hover: #73828c;
|
||||
--secondary-focus: #303030;
|
||||
--secondary-inverse: #FFF;
|
||||
--secondary-hover: #222725;
|
||||
--secondary-focus: #121113;
|
||||
--secondary-inverse: #FFFFFF;
|
||||
--primary-background: #242424;
|
||||
--secondary-background: #424242;
|
||||
--thumb-background: #757575;
|
||||
--secondary-background: #222725;
|
||||
--thumb-background: #222725;
|
||||
--link: #00B0FF;
|
||||
--link-visited: #40C4FF;
|
||||
--border-bg: #FFFFFF;
|
||||
--buttom: #dcdcdb;
|
||||
--buttom-text: #415462;
|
||||
--button-border: #91918c;
|
||||
--buttom-hover: #BBB;
|
||||
--search-text: #FFF;
|
||||
--time-background: #212121;
|
||||
--time-text: #FFF;
|
||||
--border-bg: #222725;
|
||||
--border-bg-settings: #000000;
|
||||
--border-bg-license: #000000;
|
||||
--buttom: #121113;
|
||||
--buttom-text: #FFFFFF;
|
||||
--button-border: #222725;
|
||||
--buttom-hover: #222725;
|
||||
--search-text: #FFFFFF;
|
||||
--time-background: #121113;
|
||||
--time-text: #FFFFFF;
|
||||
}
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
:root {
|
||||
--background: #2d3743;
|
||||
--background: #2D3743;
|
||||
--text: #FFFFFF;
|
||||
--secondary-hover: #73828c;
|
||||
--secondary-hover: #73828C;
|
||||
--secondary-focus: rgba(115, 130, 140, 0.125);
|
||||
--secondary-inverse: #FFFFFF;
|
||||
--primary-background: #2d3743;
|
||||
--primary-background: #2D3743;
|
||||
--secondary-background: #102027;
|
||||
--thumb-background: #35404D;
|
||||
--link: #22aaff;
|
||||
--link: #22AAff;
|
||||
--link-visited: #7755ff;
|
||||
--border-bg: #FFFFFF;
|
||||
--buttom: #DCDCDC;
|
||||
--buttom-text: #415462;
|
||||
--button-border: #91918c;
|
||||
--buttom-hover: #BBBBBB;
|
||||
--border-bg-settings: #FFFFFF;
|
||||
--border-bg-license: #FFFFFF;
|
||||
--buttom: #2D3743;
|
||||
--buttom-text: #FFFFFF;
|
||||
--button-border: #102027;
|
||||
--buttom-hover: #102027;
|
||||
--search-text: #FFFFFF;
|
||||
--time-background: #212121;
|
||||
--time-text: #FFFFFF;
|
||||
|
||||
@@ -181,7 +181,7 @@ label[for=options-toggle-cbox] {
|
||||
|
||||
.table td,.table th {
|
||||
padding: 10px 10px;
|
||||
border: 1px solid var(--secondary-background);
|
||||
border: 1px solid var(--border-bg-license);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,9 +10,11 @@
|
||||
--link: #212121;
|
||||
--link-visited: #808080;
|
||||
--border-bg: #212121;
|
||||
--buttom: #DCDCDC;
|
||||
--border-bg-settings: #91918C;
|
||||
--border-bg-license: #91918C;
|
||||
--buttom: #FFFFFF;
|
||||
--buttom-text: #212121;
|
||||
--button-border: #91918c;
|
||||
--button-border: #91918C;
|
||||
--buttom-hover: #BBBBBB;
|
||||
--search-text: #212121;
|
||||
--time-background: #212121;
|
||||
|
||||
@@ -155,7 +155,7 @@ label[for=options-toggle-cbox] {
|
||||
}
|
||||
|
||||
.settings-form > h2 {
|
||||
border-bottom: 2px solid var(--border-bg);
|
||||
border-bottom: 2px solid var(--border-bg-settings);
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
|
||||
@@ -395,22 +395,22 @@ def head(url, use_tor=False, report_text=None, max_redirects=10):
|
||||
return response
|
||||
|
||||
|
||||
mobile_user_agent = 'Mozilla/5.0 (Linux; Android 7.0; Redmi Note 4 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36'
|
||||
mobile_user_agent = 'Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.80 Mobile Safari/537.36'
|
||||
mobile_ua = (('User-Agent', mobile_user_agent),)
|
||||
desktop_user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0'
|
||||
desktop_user_agent = 'Mozilla/5.0 (Windows NT 10.0; rv:124.0) Gecko/20100101 Firefox/124.0'
|
||||
desktop_ua = (('User-Agent', desktop_user_agent),)
|
||||
json_header = (('Content-Type', 'application/json'),)
|
||||
desktop_xhr_headers = (
|
||||
('Accept', '*/*'),
|
||||
('Accept-Language', 'en-US,en;q=0.5'),
|
||||
('X-YouTube-Client-Name', '1'),
|
||||
('X-YouTube-Client-Version', '2.20180830'),
|
||||
('X-YouTube-Client-Version', '2.20240327.00.00'),
|
||||
) + desktop_ua
|
||||
mobile_xhr_headers = (
|
||||
('Accept', '*/*'),
|
||||
('Accept-Language', 'en-US,en;q=0.5'),
|
||||
('X-YouTube-Client-Name', '2'),
|
||||
('X-YouTube-Client-Version', '2.20180830'),
|
||||
('X-YouTube-Client-Name', '1'),
|
||||
('X-YouTube-Client-Version', '2.20240328.08.00'),
|
||||
) + mobile_ua
|
||||
|
||||
|
||||
@@ -667,6 +667,25 @@ def to_valid_filename(name):
|
||||
|
||||
# https://github.com/yt-dlp/yt-dlp/blob/master/yt_dlp/extractor/youtube.py#L72
|
||||
INNERTUBE_CLIENTS = {
|
||||
'android_music': {
|
||||
'INNERTUBE_API_KEY': 'AIzaSyAOghZGza2MQSZkY_zfZ370N-PUdXEo8AI',
|
||||
'INNERTUBE_CONTEXT': {
|
||||
'client': {
|
||||
'hl': 'en',
|
||||
'gl': 'US',
|
||||
'clientName': 'ANDROID_MUSIC',
|
||||
'clientVersion': '6.44.54',
|
||||
'osName': 'Android',
|
||||
'osVersion': '14',
|
||||
'androidSdkVersion': 34,
|
||||
'platform': 'MOBILE',
|
||||
'userAgent': 'com.google.android.apps.youtube.music/6.44.54 (Linux; U; Android 14; US) gzip'
|
||||
}
|
||||
},
|
||||
'INNERTUBE_CONTEXT_CLIENT_NAME': 21,
|
||||
'REQUIRE_JS_PLAYER': False
|
||||
},
|
||||
|
||||
'android': {
|
||||
'INNERTUBE_API_KEY': 'AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w',
|
||||
'INNERTUBE_CONTEXT': {
|
||||
@@ -674,21 +693,34 @@ INNERTUBE_CLIENTS = {
|
||||
'hl': 'en',
|
||||
'gl': 'US',
|
||||
'clientName': 'ANDROID',
|
||||
'clientVersion': '18.11.34',
|
||||
'clientVersion': '19.12.36',
|
||||
'osName': 'Android',
|
||||
'osVersion': '12',
|
||||
'androidSdkVersion': 30,
|
||||
'userAgent': 'com.google.android.youtube/18.11.34 (Linux; U; Android 12) gzip'
|
||||
},
|
||||
# https://github.com/yt-dlp/yt-dlp/pull/575#issuecomment-887739287
|
||||
#'thirdParty': {
|
||||
# 'embedUrl': 'https://google.com', # Can be any valid URL
|
||||
#}
|
||||
'osVersion': '14',
|
||||
'androidSdkVersion': 34,
|
||||
'platform': 'MOBILE',
|
||||
'userAgent': 'com.google.android.youtube/19.13.36 (Linux; U; Android 14; en_US; Google Pixel 6 Pro) gzip'
|
||||
}
|
||||
},
|
||||
'INNERTUBE_CONTEXT_CLIENT_NAME': 3,
|
||||
'REQUIRE_JS_PLAYER': False,
|
||||
},
|
||||
|
||||
'ios': {
|
||||
'INNERTUBE_API_KEY': 'AIzaSyB-63vPrdThhKuerbB2N_l7Kwwcxj6yUAc',
|
||||
'INNERTUBE_CONTEXT': {
|
||||
'client': {
|
||||
'hl': 'en',
|
||||
'gl': 'US',
|
||||
'clientName': 'IOS',
|
||||
'clientVersion': '19.12.3',
|
||||
'deviceModel': 'iPhone14,3',
|
||||
'userAgent': 'com.google.ios.youtube/19.12.3 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X)'
|
||||
}
|
||||
},
|
||||
'INNERTUBE_CONTEXT_CLIENT_NAME': 5,
|
||||
'REQUIRE_JS_PLAYER': False
|
||||
},
|
||||
|
||||
# This client can access age restricted videos (unless the uploader has disabled the 'allow embedding' option)
|
||||
# See: https://github.com/zerodytrash/YouTube-Internal-Clients
|
||||
'tv_embedded': {
|
||||
@@ -699,6 +731,7 @@ INNERTUBE_CLIENTS = {
|
||||
'gl': 'US',
|
||||
'clientName': 'TVHTML5_SIMPLY_EMBEDDED_PLAYER',
|
||||
'clientVersion': '2.0',
|
||||
'clientScreen': 'EMBED',
|
||||
},
|
||||
# https://github.com/yt-dlp/yt-dlp/pull/575#issuecomment-887739287
|
||||
'thirdParty': {
|
||||
@@ -715,7 +748,7 @@ INNERTUBE_CLIENTS = {
|
||||
'INNERTUBE_CONTEXT': {
|
||||
'client': {
|
||||
'clientName': 'WEB',
|
||||
'clientVersion': '2.20220801.00.00',
|
||||
'clientVersion': '2.20240327.00.00',
|
||||
'userAgent': desktop_user_agent,
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
__version__ = '0.2.10'
|
||||
__version__ = '0.2.14'
|
||||
|
||||
@@ -343,7 +343,7 @@ def _add_to_error(info, key, additional_message):
|
||||
def fetch_player_response(client, video_id):
|
||||
return util.call_youtube_api(client, 'player', {
|
||||
'videoId': video_id,
|
||||
'params': 'CgIQBg',
|
||||
'params': 'CgIIAQ==',
|
||||
})
|
||||
|
||||
|
||||
@@ -372,16 +372,6 @@ def extract_info(video_id, use_invidious, playlist_id=None, index=None):
|
||||
tasks = (
|
||||
# Get video metadata from here
|
||||
gevent.spawn(fetch_watch_page_info, video_id, playlist_id, index),
|
||||
|
||||
# Get video URLs by spoofing as android client because its urls don't
|
||||
# require decryption
|
||||
# The URLs returned with WEB for videos requiring decryption
|
||||
# couldn't be decrypted with the base.js from the web page for some
|
||||
# reason
|
||||
# https://github.com/yt-dlp/yt-dlp/issues/574#issuecomment-887171136
|
||||
|
||||
# Update 4/26/23, these URLs will randomly start returning 403
|
||||
# mid-playback and I'm not sure why
|
||||
gevent.spawn(fetch_player_response, 'android', video_id)
|
||||
)
|
||||
gevent.joinall(tasks)
|
||||
|
||||
Reference in New Issue
Block a user