Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Уступленне коратка: хачу распавесці пра анлайн плэер Ютюб для Андроіда з лакальнымі плэйлістамі, каналамі і рэкамендацыямі.

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Уступ разгорнутае:
Некаторы час таму я сутыкнуўся роўна з такой праблемай, як і аўтар выдатнага прыкладання Channel Whitelist, І вызначыў для сябе да яе роўна такое ж стаўленне: я хачу мець магчымасць час ад часу даваць дзіцяці планшэт ці смартфон з мульцікамі, але мяне зусім не задавальняе, куды праз 2-3 клікі заводзіць дзіця спіс рэкамендацый у стандартных прыкладаннях - кліентах Ютюб.

Нажаль, пасля ўсталёўкі прыкладання Channel Whitelist ужо ў яго быў выяўлены іншы больш празаічны, але ўсё роўна фатальны недахоп – NIH мне (і, галоўнае, сыну) здаўся не вельмі зручным яго інтэрфейс, асабліва пасля звычкі выкарыстоўваць плэер YouTube Kids.

Увогуле, яшчэ праз некаторы час я саспеў, каб зрабіць сваю рэалізацыю. Яшчэ праз некаторы час стала магчымым паставіць тэг на першы рэліз.

Асноўныя магчымасці:

  • Дадавайце любімыя каналы і плэйлісты - яны будуць захаваны і праіндэксаваны ў лакальнай базе
  • Усярэдзіне дададзеных плэйлістоў выключайце лішнія ролікі, калі яны вам не патрэбныя
  • Спіс рэкамендацый генеруецца выпадкова толькі з дададзеных у дадатак каналаў і плэйлістоў

Зыходнікі адкрыты, ліцэнзія GPLv3: https://github.com/sadr0b0t/yashlang/

Далей агляд асноўных магчымасцяў больш падрабязна, плюс крыху тэхнічных падрабязнасцяў аб тым, як гуляць відэа з Ютюб ў вашым дадатку на андроіда без выкарыстання АПА Google і вэб-абарток.

На галоўным экране і на экране плэера: выпадковыя рэкамендацыі з невыпадковых каналаў

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Імгненны пошук па лакальнай базе

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) => Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Дадаць новы канал або плэйліст

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Шукаць па імені анлайн або ўставіць вядомы адрас. Спіс ролікаў канала або плэйліста захоўваецца ў лакальную базу, абразкі не кэшуюцца.

Дынамічны плэйліст - гуляць вынікі пошуку

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) => Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

У рэкамендацыях пад відэа будуць толькі ролікі, якія задавальняюць пошукаваму запыце.

Аналагічным чынам, калі адкрыць відэа з налад плэйліста, у спісе рэкамендацый будуць толькі ролікі з гэтага ж плэйліста.

Плэйлісты і каналы можна часова выключаць і зноў уключаць

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Звярніце ўвагу: ролікі з выключанага плэйліста знікнуць таксама з вынікаў пошуку, гісторыі праглядаў і са спісу каханых. Але не варта перажываць, яны зноў з'явяцца там адразу пасля таго, як плэйліст будзе зноў уключаны.

Унесці ролік у чорны спіс

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Заблакаваны ролік не будзе адлюстроўвацца ў рэкамендацыях, у выніках пошуку, знікне са спісу каханых і з гісторыі праглядаў. Ролік усё яшчэ будзе бачны ў наладах плэйліста.

Прагледзець чорны спіс і зноў уключыць элементы, заблакаваныя па памылцы:
Налады > меню ў загалоўку > Чорны спіс

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Любімыя ролікі і гісторыя праглядаў

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Любімыя ролікі на экране плэера адзначаюцца зорачкай у правым верхнім куце.

Кантэкстныя меню ў загалоўку экрана і па доўгім кліку ў галерэях і спісах

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Капіяваць імя або адрас відэа ці плэйліста ў экране прагляду або ў любым спісе.

Хуткі старт - дадаць рэкамендаваныя каналы і плэйлісты

Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?) => Смерць Кашчэя ў спісе рэкамендацый (ці можна зрабіць утульным і бяспечным Юцюб?)

Прыкладанне адразу стане выглядаць так, як на скрыншотах вышэй.

Непатрэбныя каналы і плэйлісты можна выключыць ці выдаліць у наладах.

Ўстаноўка

Старонка праекта: https://github.com/sadr0b0t/yashlang/
на ангельскай мове: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
рэлізы: https://github.com/sadr0b0t/yashlang/releases

Майце на ўвазе, што перамыкацца паміж рознымі версіямі з розных крыніц на адной прыладзе не атрымаецца з-за розных подпісаў файла apk, перад усталёўкай версіі з новай крыніцы прыйдзецца ўсталяваную версію спачатку выдаліць разам з дадзенымі - кэшам плэйлістоў і гісторыяй праглядаў (ці прыдумаць, як гэтыя дадзеныя перанесці).

тэхнічныя дэталі

Не патрабуе акаўнт Гугл/Юцюб, патрэбен толькі інтэрнэт, выкарыстоўвае бібліятэкі:

Адкрыты зыходны код, свабодная ліцэнзія GPLv3.

пытанне: Парсіць сайты без дазволу (ці з відавочнай забаронай) аўтараў наогул законна? Google выдаляе з Google плея прыкладання, якія не выкарыстоўваюць іх API, а парсяць іх сайты, т.я. яны парушаюць іх карыстацкую дамову.
адказ: вядома, законна, гэта ваша справа, які інструмент выкарыстоўваць для чытання агульнадаступнай інфармацыі. Больш за тое: Суд ЗША цалкам легалізаваў скрапінг сайтаў і забараніў яму тэхнічна перашкаджаць, Але ў Гула можа быць іншае меркаванне, асабіста ў мяне пакуль няма жадання адпраўляцца ў амерыканскі суд іх пераконваць.

Трохі кода

Бібліятэка NewPipeExtractor - дапаможны праект плэера Newpipe, дазваляе загружаць спіс ролікаў для названага канала або плэйліста, загружаць падрабязную інфармацыю аб вядомым відэа (тое, што відаць на вэб-старонцы роліка), атрымліваць адрас абразка відэа, а гэтак жа атрымліваць адрас патоку відэа.

Код для загрузкі плэйліста трохі грувасткі, таму тут прыводзіць яго не буду, каму цікава - зазірніце ў зыходнікі, у асноўным гэта клас ContentLoader.

Паглядзім, як атрымаць адрас патоку відэа па адрасе публічнай старонкі відэа і гуляць яго ў плэеры.

Падлучыць бібліятэку ў
app/build.gradle

dependencies {
...
    // NewPipe: youtube parser
    // https://github.com/TeamNewPipe/NewPipeExtractor
    implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}

Цікаўна, што пасля гэтага яе ўсё роўна не атрымаецца выкарыстаць, т.к. прыклады будуць лаяцца на які адсутнічае клас Downloader. Яго можна скапіяваць у праект з каталога аўтаматычных тэстаў NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java — працуе для версіі 0.17.4 (падобна, што ў навейшай версіі бібліятэкі гэтая частка была перароблена, але трэба яшчэ праверыць).

Атрымаць адрас патоку відэа па адрасе старонкі відэа на сайце Юцюб:

app/src/main/java/su/sadrobot/yashlang/controller/ContentLoader.java

    public String extractYtStreamUrl(final String ytVidUrl) throws ExtractionException, IOException {
        // https://github.com/TeamNewPipe/NewPipeExtractor/blob/dev/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorDefaultTest.java
        NewPipe.init(Downloader.getInstance(), new Localization("GB", "en"));
        final YoutubeStreamExtractor extractor = (YoutubeStreamExtractor) YouTube
                .getStreamExtractor(ytVidUrl);
        extractor.fetchPage();
        final String streamUrl = extractor.getVideoStreams().size() > 0 ? extractor.getVideoStreams().get(0).getUrl() : null;
//        for (final VideoStream stream : extractor.getVideoStreams()) {
//            stream.getUrl();
//        }
        return streamUrl;
    }

У якасці адрасу відэа ytVidUrl можа быць публічны адрас старонкі любога відэа на сайце Юцюб, напрыклад https://www.youtube.com/watch?v=pd2RlatmNRk

Плэер будзе экзоплэер ад самой Google. Гэта не вэб-абгортка над Ютюб, а самы сапраўдны ўбудаваны плэер для прайгравання любых відэаролікаў, досыць гнуткі і наладжвальны. У тым ліку ўмее гуляць патокі відэа з Юцюба, калі ўказаць яму правільны адрас. Адрас патоку мы атрымалі толькі што, таму паглядзім, як яго адправіць у плэер.

Падлучыць бібліятэку ў праект app/build.gradle:

dependencies {
...
    // google Exoplayer
    // https://github.com/google/ExoPlayer
    // https://exoplayer.dev/
    implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}

Усе нюансы размяшчэння кампанента плэера на экране прыкладання разглядаць не будзем (можаце паглядзець у прыкладах на сайце праекта або ў кодзе), паглядзім толькі на тое, як запусціць прайграванне відэа з Юцюба ў плэеры па атрыманым вышэй адрасе:

app/src/main/java/su/sadrobot/yashlang/WatchVideoActivity.java

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);
    }
}

вядомыя праблемы

  • Не будзе гуляць ролікі з узроставымі абмежаваннямі, якія патрабуюць лагін у рахунак Гугл/Ютюб

напрыклад: Ілля Мурамец, Кінаканцэрн «Масфільм», Руслан і Людміла 1-ая серыя / Ruslan and Lyudmila film 1, Кінаканцэрн «Масфільм»

рада: дадаваць такія ролікі ў чорны спіс або папрасіць аўтара роліка зняць абмежаванне, выстаўленае па памылцы.

  • Не будзе гуляць некаторыя ролікі-трансляцыі, для якіх сэрвіс вяртае нулявую даўжыню (для такіх ролікаў працягласць у спісах і галерэі адзначана як "[dur undef]")

напрыклад: Ну пачакай! Усе Выпускі Союзмультфильм HD (Мульцікі для дзяцей), Мульцікі студыі Союзмультфильм, Топ мульцікаў Саюзмультфільм, Мульцікі студыі Саюзмультфільм

парада: дадаваць такія ролікі ў чорны спіс.

  • Ролікі, даступныя толькі па прамых спасылках, могуць не патрапіць у лакальны плэйліст, нават калі вы загружаеце ўсе ролікі карыстача

напрыклад: Утаймаванне агню 1 серыя, Кінаканцэрн «Масфільм»

  • Калі сустрэнеце публічны ролік, які не патрабуе лагін, гуляе ў браўзэры, але не гуляе ў плэеры, дасылайце баг-рэпарт (цалкам магчыма, праблема ўжо выпраўлена ў новай версіі. NewPipeExtractor і трэба будзе толькі абнавіць зборку з гэтай версіяй, напрыклад).

  • Інтэрфейс можа падтармажваць пры павольным (але не выключаным) інтэрнэце

У выніку

Сын пераехаў з планшэта на смарт-тв Самсунг, які не ўмее запускаць прыкладанні Android. Таму лепшы бацькоўскі кантроль - усё роўна асабісты.

Але дадатак атрымалася дастаткова зручным для таго, каб я пачаў яго выкарыстоўваць сам. Першае ўражанне з ранніх працуючых версій - патрапіў у іншы свет. Увесь кантэнт загружаецца з ютюба, але гэта ўжо не ютюб, а нешта іншае, бяспечнае і кантраляванае, як быццам дастаў з вока скалапендру і пасадзіў яе ў шкляны слоік. І справа менавіта ў рэкамендацыях.

Крыніца: habr.com

Дадаць каментар