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 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,而是其他东西,安全且受控,就像你从眼睛里取出一只蜈蚣并把它放进玻璃罐里一样。 这都是关于建议的。

来源: habr.com

添加评论