ProHoster > блог > Навіны інтэрнэту > Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)
Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)
Уступленне коратка: хачу распавесці пра анлайн плэер Ютюб для Андроіда з лакальнымі плэйлістамі, каналамі і рэкамендацыямі.
Уступ разгорнутае:
Некаторы час таму я сутыкнуўся роўна з такой праблемай, як і аўтар выдатнага прыкладання Channel Whitelist, І вызначыў для сябе да яе роўна такое ж стаўленне: я хачу мець магчымасць час ад часу даваць дзіцяці планшэт ці смартфон з мульцікамі, але мяне зусім не задавальняе, куды праз 2-3 клікі заводзіць дзіця спіс рэкамендацый у стандартных прыкладаннях - кліентах Ютюб.
Нажаль, пасля ўсталёўкі прыкладання Channel Whitelist ужо ў яго быў выяўлены іншы больш празаічны, але ўсё роўна фатальны недахоп – NIH мне (і, галоўнае, сыну) здаўся не вельмі зручным яго інтэрфейс, асабліва пасля звычкі выкарыстоўваць плэер YouTube Kids.
Увогуле, яшчэ праз некаторы час я саспеў, каб зрабіць сваю рэалізацыю. Яшчэ праз некаторы час стала магчымым паставіць тэг на першы рэліз.
Асноўныя магчымасці:
Дадавайце любімыя каналы і плэйлісты - яны будуць захаваны і праіндэксаваны ў лакальнай базе
Усярэдзіне дададзеных плэйлістоў выключайце лішнія ролікі, калі яны вам не патрэбныя
Спіс рэкамендацый генеруецца выпадкова толькі з дададзеных у дадатак каналаў і плэйлістоў
Далей агляд асноўных магчымасцяў больш падрабязна, плюс крыху тэхнічных падрабязнасцяў аб тым, як гуляць відэа з Ютюб ў вашым дадатку на андроіда без выкарыстання АПА Google і вэб-абарток.
На галоўным экране і на экране плэера: выпадковыя рэкамендацыі з невыпадковых каналаў
Імгненны пошук па лакальнай базе
=>
Дадаць новы канал або плэйліст
Шукаць па імені анлайн або ўставіць вядомы адрас. Спіс ролікаў канала або плэйліста захоўваецца ў лакальную базу, абразкі не кэшуюцца.
Дынамічны плэйліст - гуляць вынікі пошуку
=>
У рэкамендацыях пад відэа будуць толькі ролікі, якія задавальняюць пошукаваму запыце.
Аналагічным чынам, калі адкрыць відэа з налад плэйліста, у спісе рэкамендацый будуць толькі ролікі з гэтага ж плэйліста.
Плэйлісты і каналы можна часова выключаць і зноў уключаць
Звярніце ўвагу: ролікі з выключанага плэйліста знікнуць таксама з вынікаў пошуку, гісторыі праглядаў і са спісу каханых. Але не варта перажываць, яны зноў з'явяцца там адразу пасля таго, як плэйліст будзе зноў уключаны.
Унесці ролік у чорны спіс
Заблакаваны ролік не будзе адлюстроўвацца ў рэкамендацыях, у выніках пошуку, знікне са спісу каханых і з гісторыі праглядаў. Ролік усё яшчэ будзе бачны ў наладах плэйліста.
Прагледзець чорны спіс і зноў уключыць элементы, заблакаваныя па памылцы: Налады > меню ў загалоўку > Чорны спіс
Любімыя ролікі і гісторыя праглядаў
Любімыя ролікі на экране плэера адзначаюцца зорачкай у правым верхнім куце.
Кантэкстныя меню ў загалоўку экрана і па доўгім кліку ў галерэях і спісах
Капіяваць імя або адрас відэа ці плэйліста ў экране прагляду або ў любым спісе.
Хуткі старт - дадаць рэкамендаваныя каналы і плэйлісты
=>
Прыкладанне адразу стане выглядаць так, як на скрыншотах вышэй.
Непатрэбныя каналы і плэйлісты можна выключыць ці выдаліць у наладах.
На Гуглплеі няма і бліжэйшы час не будзе (Гугл баніць прыкладанні, якія ў абыход API парсят іх сайт, у т.л. згаданы Channel Whitelist або плэер NewPipe)
Майце на ўвазе, што перамыкацца паміж рознымі версіямі з розных крыніц на адной прыладзе не атрымаецца з-за розных подпісаў файла apk, перад усталёўкай версіі з новай крыніцы прыйдзецца ўсталяваную версію спачатку выдаліць разам з дадзенымі - кэшам плэйлістоў і гісторыяй праглядаў (ці прыдумаць, як гэтыя дадзеныя перанесці).
тэхнічныя дэталі
Не патрабуе акаўнт Гугл/Юцюб, патрэбен толькі інтэрнэт, выкарыстоўвае бібліятэкі:
пытанне: Парсіць сайты без дазволу (ці з відавочнай забаронай) аўтараў наогул законна? Google выдаляе з Google плея прыкладання, якія не выкарыстоўваюць іх API, а парсяць іх сайты, т.я. яны парушаюць іх карыстацкую дамову. адказ: вядома, законна, гэта ваша справа, які інструмент выкарыстоўваць для чытання агульнадаступнай інфармацыі. Больш за тое: Суд ЗША цалкам легалізаваў скрапінг сайтаў і забараніў яму тэхнічна перашкаджаць, Але ў Гула можа быць іншае меркаванне, асабіста ў мяне пакуль няма жадання адпраўляцца ў амерыканскі суд іх пераконваць.
Трохі кода
Бібліятэка NewPipeExtractor - дапаможны праект плэера Newpipe, дазваляе загружаць спіс ролікаў для названага канала або плэйліста, загружаць падрабязную інфармацыю аб вядомым відэа (тое, што відаць на вэб-старонцы роліка), атрымліваць адрас абразка відэа, а гэтак жа атрымліваць адрас патоку відэа.
Код для загрузкі плэйліста трохі грувасткі, таму тут прыводзіць яго не буду, каму цікава - зазірніце ў зыходнікі, у асноўным гэта клас ContentLoader.
Паглядзім, як атрымаць адрас патоку відэа па адрасе публічнай старонкі відэа і гуляць яго ў плэеры.
Цікаўна, што пасля гэтага яе ўсё роўна не атрымаецца выкарыстаць, т.к. прыклады будуць лаяцца на які адсутнічае клас Downloader. Яго можна скапіяваць у праект з каталога аўтаматычных тэстаў NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java — працуе для версіі 0.17.4 (падобна, што ў навейшай версіі бібліятэкі гэтая частка была перароблена, але трэба яшчэ праверыць).
Атрымаць адрас патоку відэа па адрасе старонкі відэа на сайце Юцюб:
Плэер будзе экзоплэер ад самой Google. Гэта не вэб-абгортка над Ютюб, а самы сапраўдны ўбудаваны плэер для прайгравання любых відэаролікаў, досыць гнуткі і наладжвальны. У тым ліку ўмее гуляць патокі відэа з Юцюба, калі ўказаць яму правільны адрас. Адрас патоку мы атрымалі толькі што, таму паглядзім, як яго адправіць у плэер.
Усе нюансы размяшчэння кампанента плэера на экране прыкладання разглядаць не будзем (можаце паглядзець у прыкладах на сайце праекта або ў кодзе), паглядзім толькі на тое, як запусціць прайграванне відэа з Юцюба ў плэеры па атрыманым вышэй адрасе:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// остановить проигрывание текущего ролика, если был загружен
videoPlayerView.getPlayer().stop(true);
} else {
// https://exoplayer.dev/
// https://github.com/google/ExoPlayer
final Uri mp4VideoUri = Uri.parse(streamUrl);
final MediaSource videoSource = new ProgressiveMediaSource.Factory(videoDataSourceFactory)
.createMediaSource(mp4VideoUri);
// Поставим на паузу старое видео, пока готовим новое
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Если ставить на паузу здесь после того, как плеер встал на паузу сам, закончив
// играть видео, получим здесь второе событие STATE_ENDED, поэтому нам нужна здесь
// специальная проверка.
// При этом значение getPlayWhenReady() останется true, поэтому проверяем именно состояние.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Prepare the player with the source.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Укажем текущую позицию сразу при загрузке видео
// (в коментах что-то пишут что-то про датасорсы, которые поддерживают или не поддерживают
// переходы seek при загрузке, похоже, что это фигня - просто делаем seek сразу после загрузки)
// Exoplayer plays new Playlist from the beginning instead of provided position
// https://github.com/google/ExoPlayer/issues/4375
// How to load stream in the desired position? #2197
// https://github.com/google/ExoPlayer/issues/2197
// в этом месте нормлаьный duration еще не доступен, поэтому его не проверяем
//if(seekTo > 0 && seekTo < videoPlayerView.getPlayer().getDuration()) {
if (seekTo > 0) {
// на 5 секунд раньше
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}
вядомыя праблемы
Не будзе гуляць ролікі з узроставымі абмежаваннямі, якія патрабуюць лагін у рахунак Гугл/Ютюб
рада: дадаваць такія ролікі ў чорны спіс або папрасіць аўтара роліка зняць абмежаванне, выстаўленае па памылцы.
Не будзе гуляць некаторыя ролікі-трансляцыі, для якіх сэрвіс вяртае нулявую даўжыню (для такіх ролікаў працягласць у спісах і галерэі адзначана як "[dur undef]")
Калі сустрэнеце публічны ролік, які не патрабуе лагін, гуляе ў браўзэры, але не гуляе ў плэеры, дасылайце баг-рэпарт (цалкам магчыма, праблема ўжо выпраўлена ў новай версіі. NewPipeExtractor і трэба будзе толькі абнавіць зборку з гэтай версіяй, напрыклад).
Інтэрфейс можа падтармажваць пры павольным (але не выключаным) інтэрнэце
У выніку
Сын пераехаў з планшэта на смарт-тв Самсунг, які не ўмее запускаць прыкладанні Android. Таму лепшы бацькоўскі кантроль - усё роўна асабісты.
Але дадатак атрымалася дастаткова зручным для таго, каб я пачаў яго выкарыстоўваць сам. Першае ўражанне з ранніх працуючых версій - патрапіў у іншы свет. Увесь кантэнт загружаецца з ютюба, але гэта ўжо не ютюб, а нешта іншае, бяспечнае і кантраляванае, як быццам дастаў з вока скалапендру і пасадзіў яе ў шкляны слоік. І справа менавіта ў рэкамендацыях.