推荐列表中的科什切伊之死(您能使YouTube变得舒适又安全吗?)

简介很简短:我想谈谈适用于Android的YouTube在线播放器,以及本地播放列表,频道和推荐。



详细介绍


不久前,我遇到了与出色的Channel Whitelist应用程序的作者完全相同的问题,并且我对此持完全相同的态度:我希望能够不时给我的孩子一款平板电脑或智能手机,并带有卡通,但是我完全不高兴,在2-3次点击中,孩子会获得标准应用程序-YouTube客户的推荐列表。


不幸的是,在安装Channel Whitelist应用程序后,他已经发现了另一个更平淡无奇但仍然致命的缺陷-NIH (最重要的是他的儿子)觉得它的界面不太方便,尤其是在习惯了使用YouTube Kids Player之后。


通常,经过一段时间后,我逐渐成熟起来进行实现。 一段时间后,可以将标签放置在第一个版本中。


主要特点:


  • 添加您喜欢的频道和播放列表-它们将被保存并在本地数据库中建立索引
  • 如果不需要,请关闭添加的播放列表中的其他视频
  • 仅从添加到应用程序的频道和播放列表中随机生成推荐列表。

开源是开放的,GPLv3许可证是: https : //github.com/sadr0b0t/yashlang/


进一步详细介绍了主要功能,并提供了一些有关如何在不使用Google API和网络包装程序的情况下在Android应用程序中播放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帐户,只需要Internet,就可以使用库:



开源,免费的GPLv3许可证。


问题:未经作者许可(或明确禁止)解析网站是否合法? Google会从Google删除不使用其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 /控制器/ 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本身的ExoPlayer 。 这不是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); } // 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的电影Ruslan和Lyudmila的电影系列1 / Ruslan和Lyudmila的电影1,关注Mosfilm的电影


提示:将此类视频添加到黑名单,或要求视频的作者错误地删除限制设置。


  • 服务将返回零长度的某些广播视频将无法播放(对于此类视频,列表和库中的持续时间标记为“ [dur undef]”)

例如: 等一下! 所有发行版的Soyuzmultfilm HD(儿童卡通),卡通Soyuzmultfilm Studios顶级卡通Soyuzmultfilm,卡通Studios Soyuzmultfilm


提示:将这些视频添加到黑名单。


  • 即使您下载了所有用户的视频,也只能通过直接链接访问的视频可能不会进入本地播放列表

例如:《 驯服烈火1》系列,有关Mosfilm的电影


  • 如果您看到不需要登录,可以在浏览器中播放但不能在播放器中播放的公共视频,请发送错误报告(很有可能问题已经在新版本的NewPipeExtractor中得到修复, 例如 ,您只需要使用此版本更新程序集即可)。


  • Internet速度较慢(但未关闭)时,接口可能会变慢



最后


儿子从平板电脑搬到了三星智能电视,后者不知道如何运行Android应用程序。 因此,最佳的父母控制仍然是个人的。


但是事实证明该应用程序很方便我自己开始使用它。 早期工作版本的第一印象-进入了另一个世界。 所有内容都是从YouTube下载的,但现在不再是YouTube了,而是其他安全且可控的东西,就好像是将scolopendra移到了玻璃罐中一样。 它在建议中。

Source: https://habr.com/ru/post/zh-CN482874/


All Articles