コシチェイの死が推奨リストに載っています (YouTube を快適で安全なものにすることは可能でしょうか?)

導入は短いです。ローカル プレイリスト、チャンネル、おすすめを備えた Android 用 YouTube オンライン プレーヤーについて話したいと思います。

コシチェイの死が推奨リストに載っています (YouTube を快適で安全なものにすることは可能でしょうか?)

拡張された紹介:
少し前に、私は素晴らしいアプリケーションの作成者とまったく同じ問題に遭遇しました。 チャンネルのホワイトリストそして、それに対して私自身もまったく同じ態度をとりました。子供に時々漫画が入ったタブレットやスマートフォンを与えられるようにしたいのですが、2、3回クリックした後にリストが表示される場所にまったく満足していません。標準アプリケーション (YouTube クライアント) での推奨事項の多くは、子を取得します。

残念ながら、Channel Whitelist アプリケーションをインストールした後、さらに平凡だが致命的な欠陥がもう XNUMX つ発見されました。NIH の私 (そして最も重要なことに、私の息子) は、特に YouTube Kids プレーヤーを使用する習慣があった後、インターフェースがあまり便利ではないと感じました。

一般に、しばらくすると、独自の実装を作成する準備が整いました。 しばらくして、最初のリリースにタグを付けることができるようになりました。

主な機能:

  • お気に入りのチャンネルとプレイリストを追加します。それらはローカル データベースに保存され、インデックスが付けられます。
  • 追加したプレイリスト内で不要な動画が必要ない場合はオフにします
  • おすすめのリストは、アプリケーションに追加されたチャンネルとプレイリストのみからランダムに生成されます

オープンソース、GPLv3 ライセンス: https://github.com/sadr0b0t/yashlang/

以下に、主な機能の概要と、Google API や Web ラッパーを使用せずに Android アプリケーションで 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 を快適で安全なものにすることは可能でしょうか?) => コシチェイの死が推奨リストに載っています (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 ライセンス。

質問: 作成者からの許可なしに (または明示的な禁止のもとに) Web サイトをスクレイピングすることは一般的に合法ですか? Google、Google Playからアプリを削除、API は使用しませんが、サイトを解析します。 ユーザー契約に違反しているのです。
答え: もちろん、それは合法です。公開されている情報を読むためにどのツールを使用するかはあなた次第です。 さらに: 米国の裁判所はウェブサイトのスクレイピングを完全に合法化し、ウェブサイトへの技術的干渉を禁止した。しかし、Gul 氏は別の意見を持っているかもしれません。個人的には、彼らを説得するためにアメリカの法廷に行く気はまだありません。

いくつかのコード

図書館 NewPipeExtractor - 選手応援プロジェクト NewPipeを使用すると、指定したチャンネルまたはプレイリストのビデオのリストをダウンロードしたり、有名なビデオに関する詳細情報 (ビデオの Web ページに表示される内容) をダウンロードしたり、ビデオ アイコンのアドレスを取得したり、ビデオのアドレスを取得したりできます。ストリーム。

プレイリストをロードするコードは少し面倒なので、ここでは説明しません。興味のある方はソース コードをご覧ください。基本的にはクラスです。 コンテンツローダー.

公開ビデオ ページのアドレスからビデオ ストリームのアドレスを取得し、プレーヤーで再生する方法を見てみましょう。

ライブラリを接続します
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 Web サイトのビデオ ページのアドレスからビデオ ストリームのアドレスを取得します。

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 Web サイト上のビデオ ページのパブリック アドレスです。たとえば、 https://www.youtube.com/watch?v=pd2RlatmNRk

プレイヤーは、 ExoPlayer Google自体から。 これは YouTube の Web ラッパーではなく、あらゆるビデオを再生するための実際の埋め込みプレーヤーであり、非常に柔軟でカスタマイズ可能です。 正しいアドレスを指定すると、YouTube からビデオ ストリームを再生することもできます。 ストリーム アドレスを受け取ったので、それをプレーヤーに送信する方法を見てみましょう。

ライブラリをプロジェクトに接続する app / build.gradle:

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

アプリケーション画面にプレーヤー コンポーネントを配置する際のすべてのニュアンスは考慮しません (プロジェクト Web サイトまたはコード内の例を参照してください)。プレーヤーで 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 アカウントへのログインが必要な年齢制限のある動画は再生されません

例えば: イリヤ・ムーロメッツ、モスフィルム・シネマ・コンツェルン, ルスランとリュドミラの映画 1、Mosfilm Film Concern

アドバイス: そのような動画をブラックリストに追加するか、動画の作成者に誤って設定された制限を削除するよう依頼してください。

  • サービスが長さ XNUMX を返す一部のブロードキャスト ビデオは再生されません (そのようなビデオの場合、リストとギャラリーの期間は「[dur undef]」としてマークされます)。

例えば: それを待つ! Soyuzmultfilm HD の全号 (子供向け漫画)、Soyuzmultfilm スタジオの漫画, ソユーズムルトフィルムのトップ漫画、ソユーズムルトフィルムスタジオの漫画

アドバイス: そのような動画はブラックリストに追加してください。

  • 直接リンク経由でのみ利用できるビデオは、ユーザーのビデオをすべてダウンロードした場合でも、ローカル プレイリストに含まれない場合があります。

例えば: Taming of Fire エピソード 1、モスフィルム映画問題

  • ログインを必要とせず、ブラウザでは再生されるが、プレーヤーでは再生されない公開ビデオを見つけた場合は、バグ レポートを送信してください (問題は新しいバージョンですでに修正されている可能性が十分にあります) NewPipeExtractor このバージョンでアセンブリを更新するだけで済みます。 例えば).

  • インターネットが遅い場合(ただし、オフになっていない場合)、インターフェイスの速度が低下する可能性があります。

結果として、

息子はタブレットから Samsung スマート TV に移行しましたが、Android アプリケーションを実行することはできません。 したがって、最適なペアレントコントロールは依然として個人的なものです。

しかし、このアプリケーションは私自身も使い始めるほど便利であることがわかりました。 初期のバージョンの第一印象は、別の世界にいるということでした。 すべてのコンテンツは YouTube からダウンロードされますが、これはもはや YouTube ではなく、まるでムカデを目から取り出してガラスの瓶に入れたかのように、安全で管理された別のものです。 そしてそれはすべて推奨事項に関するものです。

出所: habr.com

コメントを追加します