Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Въведение накратко: искам да разкажа за онлайн плеера Ютюб за Андроид с локални плейлисти, канали и препоръки.

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Въведение в детайли:
Преди известно време се сблъсках точно с такава проблема, каквато има авторът на прекрасно приложение. Channel Whitelist, и установих, че имам същото отношение: искам от време на време да дам на детето таблет или смартфон с мултиците, но съвсем не ме устройва къде след 2-3 кликвания заведат детето списъка с препоръки в стандартните приложения — клиентите на Ютюб.

За съжаление, след инсталирането на приложението Channel Whitelist вече бе открит друг, по-прозаичен, но все пак фатален недостатък — NIH ми (и, най-важното, на сина ми) се стори не особено удобен интерфейс, особено след навика да ползвам плеера YouTube Kids.

Общо взето, след известно време реших да направя своя реализация. След време стана възможно да се постави таг на първия рилийз.

Основни възможности:

  • Добавяйте любимите си канали и плейлисти — те ще бъдат запазени и индексирани в локалната база.
  • Вътре в добавените плейлисти изключвайте ненужните видеа, ако не са ви потребни.
  • Списъкът с препоръки се генерира случайно само от добавените в приложението канали и плейлисти.

Източниците са отворени, лицензия GPLv3: https://github.com/sadr0b0t/yashlang/

По-нататък преглед на основните възможности по-подробно, плюс малко технически детайли за това как да пуснете видео от Ютюб в приложението си на Андроид без използване на Гугл АПИ и уеб обвивки.

На главния екран и на екрана на плеера: случайни препоръки от неслучайни канали.

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Мгновено търсене в локалната база.

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) => Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Добави нов канал или плейлист.

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Търсене по име онлайн или поставяне на известен адрес. Списъкът с видеа от канала или плейлиста се запазва в локалната база, иконките не се кешират.

Динамичен плейлист — пускай резултати от търсенето.

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) => Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

В препоръките под видеото ще бъдат само видеа, отговарящи на търсенето.

По аналогичен начин, ако отворите видео от настройките на плейлиста, в списъка с препоръки ще бъдат само видеа от същия плейлист.

Плейлистите и каналите могат временно да се изключват и отново да се включват.

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Обърнете внимание: видеата от изключения плейлист ще изчезнат и от резултатите от търсенето, историята на гледанията и списъка с любими. Но не се тревожете, те отново ще се появят веднага след като плейлистът бъде включен отново.

Добавете видеото в черния списък

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Блокираното видео няма да се показва в препоръките, в резултатите от търсенето, ще изчезне от списъка с любими и от историята на гледанията. Видеото все още ще бъде видно в настройките на плейлиста.

Прегледайте черния списък и отново активирайте елементите, блокирани по грешка:
Настройки > меню в заглавката > Черен списък

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Любими видеа и история на гледанията

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Любимите видеа на екрана на плеера са отбелязани със звезда в горния десен ъгъл.

Контекстни менюта в заглавката на екрана и при продължително натискане в галерии и списъци

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Копирайте името или адреса на видеото или плейлиста в екрана на гледане или в който и да е списък.

Бързо начало — добавете препоръчани канали и плейлисти

Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?) => Смъртта на Кощей в списъка с препоръки (може ли Ютюб да бъде уютен и безопасен?)

Приложението незабавно ще изглежда така, както е на екранните снимки по-горе.

Ненужните канали и плейлисти могат да бъдат изключени или изтрити в настройките.

Инсталиране

Страница на проекта: https://github.com/sadr0b0t/yashlang/
на английски език: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
релизи: https://github.com/sadr0b0t/yashlang/releases

Имайте предвид, че не можете да превключвате между различни версии от различни източници на едно устройство поради различни подписни файлове apk; преди инсталирането на версия от нов източник първо трябва да изтриете инсталираната версия заедно с данните — кеша на плейлистите и историята на гледанията (или да измислите как да преместите тези данни).

Технически детайли

Не изисква акаунт в Гугъл/Ютюб, нужен е само интернет, използва библиотеки:

  • NewPipeExtractor за получаване на данни от услугата YouTube и
  • ExoPlayer за възпроизвеждане на видеа.

Отворен изходен код, свободна лицензия GPLv3.

въпрос: Законно ли е да се парсят сайтове без разрешение (или с явно забавяне) на авторите? Гугъл премахва приложения от Гугъл Плей, които не използват тяхното 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

Плеерът ще бъде ExoPlayer от самата Google. Това не е уеб обвивка над YouTube, а истински вграден плейър за възпроизвеждане на всякакви видеа, достатъчно гъвкав и настраиваем. Включително може да възпроизвежда видео потоци от YouTube, ако му зададете правилния адрес. Адресът на потока получихме току-що, така че да видим как да го изпратим в плейъра.

Свържете библиотеката с проекта app/build.gradle:

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

Няма да разглеждаме всички нюанси при разполагането на компонента на екрана на приложението (можете да ги видите в примерите на сайта на проекта или в кода), а само ще обърнем внимание на това как да стартираме възпроизвеждането на видео от YouTube в плейъра по получения по-горе адрес:

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

        // Подготвяме плейъра със.source.
        ((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);

        // Указваме текущата позиция веднага при зареждане на видеото
        // (в коментарите пишат нещо за източници, които поддържат или не поддържат
        // преходи seek при зареждане, изглежда, че е лъжа - просто правим seek веднага след зареждане)
        // Exoplayer възпроизвежда новия плейлист отначало вместо от зададена позиция
        // https://github.com/google/ExoPlayer/issues/4375
        // Как да заредим стрийм в желаната позиция? #2197
        // https://github.com/google/ExoPlayer/issues/2197
        // в този момент нормалната продължителност все още не е налична, затова не я проверяваме
        //if(seekTo > 0 && 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 и просто трябва да обновите сборката с тази версия, например).

  • Интерфейсът може да забавя при бавен (но не изключен) интернет.

В крайна сметка

Синът ми премина от таблет на смарт телевизор Samsung, който не може да стартира приложения на Android. Следователно най-добрият родителски контрол все пак е личният.

Но приложението се оказа достатъчно удобно, за да започна да го използвам сам. Първото впечатление от ранните работещи версии — сякаш попаднах в друг свят. Цялото съдържание се зарежда от YouTube, но това вече не е YouTube, а нещо различно, безопасно и контролирано, сякаш извадих сколопендра от окото и я сложих в стъклен буркан. И всичко опира до препоръките.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster