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

Въведението е кратко: искам да говоря за онлайн плейъра YouTube за Android с локални плейлисти, канали и препоръки.

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

Разширено въведение:
Преди време се сблъсках със същия проблем като автора на едно чудесно приложение Белият списък на каналите, и определих за себе си абсолютно същото отношение към нея: Искам да мога да давам на детето таблет или смартфон с анимационни филми от време на време, но никак не съм доволен от това, къде след 2-3 клика списък с препоръки води детето в стандартни приложения - клиенти на YouTube.

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

Като цяло след известно време узрях да направя собствена реализация. След известно време стана възможно да поставите етикет на първото издание.

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

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

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

Това, което следва, е по-подробен преглед на основните функции, плюс някои технически подробности за това как да възпроизвеждате видеоклипове в YouTube във вашето приложение за Android, без да използвате API на Google и уеб обвивки.

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

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

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

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

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

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

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

Незабавно търсене в локалната база данни

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

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

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

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

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

Динамичен плейлист - възпроизвеждане на резултати от търсене

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

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

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

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

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

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

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

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

Видео в черния списък

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Инсталация

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

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

Технически подробности

Не изисква акаунт в Google / YouTube, необходим е само интернет, използва библиотеки:

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

Въпрос: Като цяло законно ли е изтриването на сайтове без разрешение (или с изрична забрана) на авторите? Google премахва приложения от Google Play, които не използват своя API, но анализират сайтовете си, т.к. те нарушават своето потребителско споразумение.
Отговор: Разбира се, правно, зависи от вас кой инструмент да използвате за четене на публична информация. Освен това: Американски съд напълно легализира скрейпинга на уебсайтове и забрани техническата намеса в него., но Гюл може да е на друго мнение, лично аз нямам желание да ходя в американски съд да ги убеждавам.

Някакъв код

Библиотека NewPipeExtractor - проект за помощник на играча NewPipe, ви позволява да изтеглите списък с видеоклипове за посочения канал или плейлист, да изтеглите подробна информация за известен видеоклип (какво се вижда на уеб страницата на видеоклипа), да получите адреса на иконата на видеото, както и да получите адреса на видео потока.

Кодът за зареждане на плейлиста е малко тромав, така че няма да го представя тук, за тези, които се интересуват - погледнете източника, това е основно клас ContentLoader.

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

Свържете библиотеката към
приложение/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 (изглежда, че тази част е преработена в по-нова версия на библиотеката, но все още трябва да се провери).

Вземете адреса на видео потока от адреса на видео страницата на уебсайта на YouTube:

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 може да бъде публичният адрес на страницата на всеки видеоклип на сайта YouTube, например https://www.youtube.com/watch?v=pd2RlatmNRk

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

Свържете библиотеката с проекта приложение/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);
        }

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

вече известни проблеми

  • Няма да възпроизвежда видеоклипове с възрастови ограничения, които изискват влизане в акаунта ви в Google/YouTube

например: Иля Муромец, концерн Mosfilm Cinema, Руслан и Людмила филм 1, филмов концерн Мосфилм

съвет: добавете такива видеоклипове в черния списък или помолете автора на видеоклипа да премахне ограничението, зададено по погрешка.

  • Някои излъчвани видеоклипове, за които услугата връща нулева дължина, няма да се възпроизведат (за такива видеоклипове продължителността в списъците и галерията е маркирана като „[dur undef]“)

например: Почакай! Всички издания на Союзмултфилм HD (Анимационни филми за деца), Анимационни филми от студио Союзмултфилм, Топ анимационни филми Союзмултфилм, Карикатурно студио Союзмултфилм

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

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

например: Укротяване на огъня Епизод 1, Концерн Mosfilm Cinema

  • Ако попаднете на публичен видеоклип, който не изисква влизане, възпроизвежда се в браузъра, но не се възпроизвежда в плейъра, изпратете доклад за грешка (напълно възможно е, проблемът вече е отстранен в новата версия NewPipeExtractor и ще трябва само да актуализирате сборката с тази версия, например).

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

В резултат на това

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

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

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

Добавяне на нов коментар