Привет, Хабр! Когда‑то давно я наткнулся на ролик, где парень писал консольный клиент для YouTube. Идея была просто потрясающей! Написать свой минималистичный и быстрый клиент, который не будет надоедать лентами рекомендаций, рекламой и т. д.
Но вот беда, автор, не найдя возможности использовать YouTube API, решил спарсить одну из фронтенд обёрток над YouTube.
Стоит ли говорить о том, что такое решение сильно теряет в производительности и абсолютно нежизнеспособно на какой‑либо длительный период времени?
И вот относительно недавно я решил написать свой минималистичный ютуб клиент на базе Android приложения.
Часто бывает, что во время прогулок по городу хочется послушать ютуб в фоновом или в PiP режиме, не отвлекаясь от общения с друзьями в мессенджере.
Теперь это возможно!
В этой статье я хочу поделиться как бесплатно работать с YouTube API.
Как оказалось, для этого существует невероятно простая Python библиотека InnerTube:
Библиотека обрабатывает низкоуровневое взаимодействие с базовым API InnerTube, используемым каждой службой YouTube.
Что-то типа брутфорса*
Библиотека используется в основе известной утилиты yt-dlp
Приложение ViMusic также использует эту библиотеку и уже более двух лет работает без обновлений. Так что вcё надежно, как швейцарские часы!
Простой пример использования InnerTube. При выводе мы получим данные в формате JSON, которые в дальнейшем можно обработать по вашему усмотрению.
import innertube
client = innertube.InnerTube("WEB")
# Поиск списка видео по запросу
client.search(query="уроки программирования на python")
# Получить данные для воспроизведения видео Rick Astley - Never Gonna Give You Up
client.player(video_id="dQw4w9WgXcQ")
Тащить целиком эту библиотеку в наше Android приложение совсем необязательно.
Достаточно будет понять, какие параметры и тело запроса нам нужно передавать.
Если порыться в коде проекта InnerTube, то можно найти файл config.py с параметрами для создания запроса к WEB клиенту.
К слову, существует множество вариантов клиентов, таких как TVLITE, ANDROID, IOS и др.
У всех них будут разные версии, и где-то могут отличаться возвращаемые данные.
REFERER_YOUTUBE: str = "https://www.youtube.com/"
USER_AGENT_WEB: str = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"
)
config: Config = Config(
base_url="https://youtubei.googleapis.com/youtubei/v1/",
clients=[
ClientContext(
client_id=1,
client_name="WEB",
client_version="2.20230728.00.00",
user_agent=USER_AGENT_WEB,
referer=REFERER_YOUTUBE,
api_key="AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8",
)
],
)
Ну а теперь переходим к запросам из Android приложения. Стандартом для работы с сетью, естественно, является Retrofit.
Самым сложным для меня оказалось конвертировать JSON объект с 40 тысячами строк ответа в дата классы.
interface InnerTubeService {
@POST("v1/player")
suspend fun getPlayerInfo(@Body body: PlayerBody): Response<PlayerResponse>
@POST("v1/search?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8")
suspend fun searchVideos(@Body body: SearchBody): Response<SearchResponse>
}
// Body для поиска видео по названию
val searchBody = SearchBody(
contentCheckOk = true, context = Context(
client = Client(
androidSdkVersion = 31,
clientName = "WEB",
clientScreen = "WATCH",
clientVersion = "2.20230728.00.00",
gl = "US",
hl = "en"
), thirdParty = ThirdParty(embedUrl = "https://www.youtube.com/")
), playbackContext = PlaybackContext(
contentPlaybackContext = ContentPlaybackContext(
signatureTimestamp = 19250
)
), racyCheckOk = true, query = query
)
//Body для получения данных проигрывателя
val playerBody = PlayerBody(
contentCheckOk = true, context = Context(
client = Client(
androidSdkVersion = 31,
clientName = "TVLITE",
clientScreen = "WATCH",
clientVersion = "2",
gl = "US",
hl = "en"
), thirdParty = ThirdParty(embedUrl = "https://www.youtube.com/")
), playbackContext = PlaybackContext(
contentPlaybackContext = ContentPlaybackContext(
signatureTimestamp = 19250
)
), racyCheckOk = true, videoId = videoId
)
Вот так выглядит ответ с потоковой ссылкой для просмотра.
data class PlayerResponse(val streamingData : StreamingData,
val videoDetails : VideoDetails)
data class StreamingData(val formats : List<Formats>)
data class Formats(val itag : Long, val url : String)
Итог
Всё работает достаточно шустро и напрямую с YouTube API.
Я уже реализовал историю просмотра видео. В дальнейшем появятся плейлисты, будет переработан мини-плеер и др.
Спасибо за внимание! Надеюсь, что эта статья будет полезна и для ваших проектов.
Комментарии (49)
un1t
16.05.2024 21:35+21) Если тыкнуть на плеер в шторке уведомлений, то сам плеер не открывается.
2) В шторке уведомлений только две кнопки плей/пауза и переметка назад. Мне бы хотелось там увидеть кнопки проматывающие на несколько секунда назад и на несколько секунд вперед. Например т.к. это сделано в полноразмерном плеере. В идеале, чтобы время насколько проматывается можно было менять в настройках.
jonic
16.05.2024 21:35+1В рутубе это и так работает. Да и в ютубе тоже.
zhirnoov Автор
16.05.2024 21:35+1В ютубе только для премиум версии, которая в России с 2022 года недоступна.
jonic
16.05.2024 21:35Попросите друга с iOS купить вам подписку и кидайте ему 249 рублей в месяц на телефон
borisphen2001
16.05.2024 21:35Даже имея премиум подписку, при запуске Ютуба без впн вылазит полноэкранное предупреждение, о том что премиум функции не будут работать. Ну хоть без рекламы, уже хорошо.
Dolios
16.05.2024 21:35Часто бывает, что во время прогулок по городу хочется послушать ютуб в фоновом или в PiP режиме, не отвлекаясь от общения с друзьями в мессенджере. Теперь это возможно!
Так это много лет уже возможно с подпиской. Вот что в ютубе через жж сделано, так это подписки на каналы - все в одной куче без возможности как-то по папкам/группам их разложить.
zhirnoov Автор
16.05.2024 21:35+1возможно с подпиской
Доступно не только лишь для всех. Для россиян с 2022 года недоступно.
По подпискам на каналы интересно. Если доберусь, то может что-то такое и реализую.
Только как вариант без авторизации и аккаунта. Т.е все подписки хранить в БД на устройстве пользователя.Dolios
16.05.2024 21:35+1Кстати, был же ещё Vanced, он тоже вроде фоновый режим умел, если я не путаю. Вы его смотрели?
vikarti
16.05.2024 21:35+1Вы еще скажите что покупки в Google Play везде работают.
Dolios
16.05.2024 21:35Как будто большая проблема стать для гугла аргентинским кабальеро...
13werwolf13
16.05.2024 21:35+7технически - никаких проблем. но принципиально делать этого не буду. я готов платить, если не хотят брать деньги это их проблемы, буду брать бесплатно. где это видно чтобы покупатель за продавцом бегал и уговаривал взять деньги, силой в карман пихал.
un1t
16.05.2024 21:35+1А что там Аргентина россиянам карты выдает удаленно? Или вы о чем? Я конечно знаю, что можно сделать карту в Казахстане, но ехать туда чисто ради карты не хочу и платить посредникаи 20к тоже не хочу.
Dolios
16.05.2024 21:35Аргентина, это регион с ценами, близкими к российским. Рабочую карту я бы порекомендовал иметь на случай экстренной эвакуации.
un1t
16.05.2024 21:35Непонятно почему Аргентина? Можно получить аргентинскую карту удаленно?
Dolios
16.05.2024 21:35Аргентина, это регион с ценами, близкими к российским.
Какое именно слово в этой фразе вам не понятно?
Можно получить аргентинскую карту удаленно?
Аргентинская карта не требуется, подойдёт любая карта, которая принимается в мире.
jackcrane
16.05.2024 21:35+1как бы еще смотреть комментарии под некоторыми видео (не привлекая внимание сантиаров ест-но) ?
zhirnoov Автор
16.05.2024 21:35+1У InnerTube есть и на этот случай есть пример кода (сам не тестировал, но вариант свежий).
Если не секрет, то для чего это вам? Собиратесь парсить комментарии?jackcrane
16.05.2024 21:35в питоне не силен. хочу почитать что накидали в комменты к ранним роликам одному конспирологу и историчскому ревизионисту.
vedmak3
16.05.2024 21:35+2Могу посоветовать обратить внимание на оригинал решения, а именно youtube-dl. А если быть еще точнее, то сюда https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/youtube.py
D7ILeucoH
16.05.2024 21:35+3Выглядит как ненужный велосипед. Есть бесплатный Vanced/ReVanced, который умеет ещё и не скачивать видео, если вы слушаете музыку в фоне - экономит трафик. Если хочешь сделать что-то полезное, лучше выкати ПР со своей идеей в этот проект.
nixtonixto
16.05.2024 21:35Revanced требует авторизацию через MicroG, т.е. есть риск слить аккаунт. Но в остальном - очень достойная замена официальному приложению.
ris58h
16.05.2024 21:35+3Часто бывает, что во время прогулок по городу хочется послушать ютуб в
фоновом или в PiP режиме, не отвлекаясь от общения с друзьями в
мессенджере.Смотрю YouTube на мобилке в браузере: Firefox (Android) или Orion (iOS). Установлены расширения uBlock и Video Background Play Fix. Полёт нормальный.
SnakeSolid
16.05.2024 21:35У меня тоже Firefox, из расширений стоит только uBlock. После блокировки видео ставится на паузу, но его можно запустить/остановить с экрана блокировки как в обычном плеере.
ris58h
16.05.2024 21:35Что-то типа брутфорса*
Каким местом это брутфорс? Просто внутренний API используемый YouTube. Я в своих расширениях его тоже использую. Кстати, пару недель назад они поломали обратную совместимость своими изменениями, но этого стоит ожидать - на то он и внутренний API.
minaevmike
16.05.2024 21:35Часто бывает, что во время прогулок по городу хочется послушать ютуб в фоновом или в PiP режиме, не отвлекаясь от общения с друзьями в мессенджере.
Но эта возможность есть и в стандартном плеере Ютуба, если не жлобить 200р в месяц
Kasyan666
16.05.2024 21:35А что делать половине планеты, где Premium не доступен? Казахстану, например?
Dolios
16.05.2024 21:35Следить за новостями?
https://www.reddit.com/r/Kazakhstan/comments/1be91dh/youtube_premium_and_youtube_music_is_now/
Kasyan666
16.05.2024 21:35+2Каюсь, пропустил, но что делать остальным
110 странам?
Afghanistan
Albania
Botswana
Brunei
Burkina Faso
Burundi
Cape Verde (Cabo Verde)
Central African Republic
Chad
China
Comoros
Congo (Congo-Brazzaville)
Côte d’Ivoire
Cuba
Democratic Republic of the Congo
Djibouti
Dominica
Equatorial Guinea
Eritrea
Eswatini (formerly Swaziland)
Ethiopia
Fiji
Gabon
Gambia
Grenada
Guinea
Guinea-Bissau
Guyana
Haiti
Holy See (Vatican City)
Kiribati
Kyrgyzstan
Lesotho
Liberia
Madagascar
Malawi
Maldives
Mali
Marshall Islands
Mauritania
Mauritius
Micronesia
Moldova
Monaco
Mongolia
Mozambique
Myanmar (formerly Burma)
Namibia
Nauru
Niger
North Korea
Palau
Palestine State
Papua New Guinea
Rwanda
Saint Kitts and Nevis
Saint Lucia
Saint Vincent and the Grenadines
Samoa
San Marino
Sao Tome and Principe
Seychelles
Sierra Leone
Solomon Islands
Suriname
Syria
Tajikistan
Timor-Leste
Togo
Tonga
Turkmenistan
Tuvalu
Uganda
Uzbekistan
Vanuatu
Venezuela
Western Sahara
Yemen
Zambia
Zimbabwe
Я думаю, многие их жители и рады бы "не жлобить 200р в месяц", да, вот паспортом не вышли. Так, что, эта ситуация не всегда о "жлобстве".
Daddy_Cool
Очень интересно! Я так понимаю в "Корпорации добра" очень неодобрительно смотрят на сторонние клиенты.
https://www.ixbt.com/live/sw/v-youtube-opolchilis-na-prilozheniya-klienty-blokiruyuschie-reklamu-na-ploschadke-i-pochemu-eto-vazhno-dlya-rossiyskih-polzovateley.html
"сервис представил новое решение — под запрет попадут и сторонние клиенты для YouTube, сами блокирующие рекламные вставки".
Тот же NewPipe у меня через какое-то время переставал работать.
zhirnoov Автор
Мне писали, что у NewPipe особый алгоритм для работы с ютубом и где-то даже на гитхабе есть код. Что касается InnerTube, то это достаточно надежная библиотека, т.к она основана на брутфорсе. Фактически это тот же YouTube API.
ViMusic (клон YouTube Music) работает без обновлений уже два года.
Естественно в Google Play его никто не пустит.
ferosod
А есть подробности по этому пункту? "Надежность" и "брутфорс" звучит как что-то взаимоисключающее
zhirnoov Автор
Всего лишь мои домыслы. Глубокий анализ я не проводил.
Если найдете информацию, то с радостью сам ознакомлюсь.
Я сужу по тому, что библиотека существует уже 3,5 года.
Google легко может грохнуть yt-dlp, на котором держатся вообще все онлайн загрузчики видео. Только почему-то этого не происходит.
Полагаю, если они пофиксят эту лазейку, то похерят просмотр видео на множеств устройств, вероятно на очень старых.
ogost
С yt-dlp гугл вяло, но борется. youtube время от времени меняет апи, или снижает до минимума трафик по user-agent или как-то по другому вставляет им палки в колёса, но ребяты оперативно обновляют. Сам yt-dlp - это форк от youtube-dl, который забросили то ли из-за угроз от гугла, то ли просто устали обновлять при каждом чихе ютуба.
13werwolf13
там всё очень мутно
гугл вроде бы как борется с yt-dlp и youtube-dl, но при этом сотрудники гугла и помогают разрабам и вроде даже коммитят изредка (не фактчекал, знаю только со слов человека имеющего некое отношение к проекту).
там либо левая рука не знает что делает правая, либо "7 пятниц на неделе"..
iqp
Как вариант "не можешь победить, возглавь"
DeskundigeICT
На самом деле, гигантские корпорации, правда, имеют конкурирующие команды разработки, скупают кучу других стартапов и действуют скорее как экосистема, а не единый организм.
Я лично видел как разработчики Гугла участвовали в нелегальном портировании Chrome OS (со всеми плюшками вроде Google Play и Assistant) на обычные ПК (не хромбуки). Проект назывался Croissant, после смены архитектуры- Brunch.
ZetaTetra
Куда уж надёжней брутфорса, главное чтобы времени хватило...
ZetaTetra
Оригинал: https://support.google.com/youtube/thread/269521462/enforcement-on-third-party-apps
Не запрет, а косяки при просмотре.
un1t
С ньюпайпом есть глюк. Он парсит страницу ютюба со ссылками на потоки, но они протухают через 4 часа. Если продолжить смотреть видео позже, то там вываливается ошибка. Но там можно куда-то тыкнуть и оно продолжит играть. Он работает я им пользуюсь. Только этот глюк раздражает.