Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

簡介很簡短:我想談談 Android 版 YouTube 線上播放器,提供本地播放清單、頻道和推薦。

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

擴充介紹:
前陣子我遇到了與一個精彩應用程式的作者完全相同的問題 頻道白名單,並為自己確定了完全相同的態度:我希望能夠時不時地給我的孩子一台帶有卡通片的平板電腦或智慧型手機,但我對在點擊2-3 次後列表中顯示的內容一點也不滿意標準應用程式(YouTube 用戶端)中的推薦會吸引孩子。

不幸的是,在安裝了頻道白名單應用程式後,另一個更平淡但仍然致命的缺陷被發現了- NIH 我(最重要的是我的兒子)發現它的介面不太方便,尤其是在習慣使用YouTube Kids 播放器之後。

總的來說,過了一段時間我就準備好自己實現了。 一段時間後,可以在第一個版本上新增標籤。

主要特點:

  • 新增您最喜歡的頻道和播放清單 - 它們將被保存並在本地資料庫中建立索引
  • 在新增的播放清單中,如果不需要,請關閉不必要的視頻
  • 推薦清單僅根據添加到應用程式的頻道和播放清單隨機生成

開源,GPLv3 授權: https://github.com/sadr0b0t/yashlang/

以下更詳細地概述了主要功能,以及有關如何在 Android 應用程式中播放 YouTube 影片而不使用 Google API 和 Web 包裝器的一些技術細節。

在主螢幕和播放器螢幕上:來自非隨機管道的隨機推薦

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

本地資料庫即時搜尋

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) => Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

新增頻道或播放列表

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

按姓名線上搜尋或插入已知地址。 頻道或播放清單的影片清單將保存到本機資料庫;不會快取圖示。

動態播放清單 - 播放搜尋結果

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) => Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

在影片推薦中,只會有滿足搜尋查詢的影片。

同樣,如果您從播放列表設定中打開視頻,則只有來自相同播放列表的視頻才會出現在推薦列表中。

播放清單和頻道可以暫時關閉並再次打開

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

請注意:停用播放清單中的影片也將從搜尋結果、觀看記錄和收藏清單中消失。 但不用擔心,它們會在再次打開播放清單後立即再次出現。

將影片加入黑名單

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

被封鎖的影片不會顯示在推薦、搜尋結果中,並且將從收藏清單和觀看歷史記錄中消失。 該影片在播放清單設定中仍然可見。

查看黑名單並重新啟用誤屏蔽的項目:
設定 > 標題選單 > 黑名單

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

最喜歡的影片和觀看歷史記錄

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

播放器螢幕上最喜歡的影片在右上角標有星號。

螢幕標題中的上下文選單以及在圖庫和清單中長按

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?)

複製瀏覽畫面或任何清單中的影片或播放清單的名稱或地址。

快速啟動 - 新增推薦頻道和播放列表

Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) Koshchei 的死在推薦清單中(是否有可能讓 YouTube 變得舒適和安全?) => Koshchei 的死在推薦清單中(是否有可能讓 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,而是解析他們的網站,因為他們違反了用戶協議。
答:當然是合法的,就看你用什麼工具來閱讀公開資訊了。 另外: 美國法院已將網站抓取完全合法化,並禁止對其進行技術幹擾。,但古爾可能有不同的看法;就我個人而言,我還沒有去美國法庭說服他們的願望。

一些程式碼

文庫 新管道提取器 - 玩家支援項目 NewPipe,允許您下載指定頻道或播放列表的視頻列表,下載著名視頻的詳細信息(視頻網頁上可見的內容),獲取視頻圖標的地址,還可以獲得視頻的地址溪流。

載入播放清單的程式碼有點繁瑣,這裡就不給了,有興趣的看一下源碼,基本上就是一個類 內容載入器.

讓我們看看如何從公共視訊頁面的地址中獲取視訊串流的地址並在播放器中播放。

將庫連接到
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(似乎這部分在新版本的庫中重做了,但我們仍然需要檢查)。

透過YouTube網站影片頁面位址取得影片串流位址:

應用程式/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

玩家將 外來玩家 來自谷歌本身。 這不是 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 的影片上面收到的地址:

應用程式/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 帳戶的有年齡限制的視頻

例如: 伊利亞·穆羅梅茲 (Ilya Muromets),Mosfilm 電影關注公司, 魯斯蘭和柳德米拉電影 1,Mosfilm Film Concern

建議:將此類影片新增至黑名單或要求影片作者取消錯誤設定的限制。

  • 服務返回零長度的某些廣播視頻將無法播放(對於此類視頻,列表和圖庫中的持續時間標記為“[dur undef]”)

例如: 等等吧! 所有問題的 Soyuzmultfilm HD(兒童漫畫),來自 Soyuzmultfilm 工作室的漫畫, 頂級漫畫 Soyuzmultfilm,來自 Soyuzmultfilm 工作室的漫畫

建議:將此類影片加入黑名單。

  • 即使您下載了用戶的所有視頻,僅透過直接連結提供的視頻可能不會包含在本地播放列表中

例如: 馴火第一集,Mosfilm 影院關注

  • 如果您遇到不需要登入的公共視頻,在瀏覽器中播放,但在播放器中不播放,請發送錯誤報告(很可能該問題已在新版本中修復) 新管道提取器 您只需要使用此版本更新程式集, 例如).

  • 如果網路速度較慢(但未關閉),介面可能會變慢

其結果是,

我兒子從平板電腦換成了三星智慧電視,但它無法運行 Android 應用程式。 因此,最好的家長控制仍然是個人的。

但事實證明該應用程式非常方便,我自己也開始使用它。 早期工作版本的第一印像是我身處另一個世界。 所有內容都是從YouTube下載的,但這不再是YouTube,而是其他東西,安全且受控,就像你從眼睛裡取出一隻蜈蚣並把它放進玻璃罐裡一樣。 這都是關於建議的。

來源: www.habr.com

添加評論