Usa ka mubo nga pasiuna: Gusto nakong isulti kanimo ang bahin sa usa ka online nga YouTube player para sa Android nga adunay lokal nga mga playlist, mga channel, ug mga rekomendasyon.

Dugang nga pasiuna:
Pipila ka panahon ang milabay, nakasugat ko sa parehas nga problema sa tagsulat niining maayo kaayo nga aplikasyon. , ug parehas ra gihapon ang akong konklusyon: Gusto nakong mahatagan ang akong anak og tablet o smartphone nga adunay mga cartoons matag karon ug unya, apan wala gyud ako matagbaw kung asa dad-on sa lista sa mga rekomendasyon sa standard nga mga YouTube client apps ang akong anak pagkahuman sa 2-3 ka pag-klik.
Ikasubo, human nako ma-install ang Channel Whitelist app, nakadiskubre ko og lain, mas ordinaryo, apan makamatay gihapon nga depekto: Ako (ug, labing importante, ang akong anak) nakakita nga ang interface niini dili kombenyente, labi na human sa akong naandan nga paggamit sa YouTube Kids player.
Mao nga, paglabay sa pipila ka panahon, andam na ko nga mohimo sa akong kaugalingong implementasyon. Paglabay sa pipila ka panahon, nahimo nang posible ang pag-tag sa unang release.
Pangunang mga bahin:
- Idugang ang imong paboritong mga channel ug mga playlist—kini ma-save ug ma-index sa lokal nga database.
- Patya ang mga dili kinahanglan nga video sulod sa gidugang nga mga playlist kung dili nimo kini kinahanglan.
- Ang lista sa mga rekomendasyon gihimo nga random gikan lamang sa mga channel ug playlist nga gidugang sa aplikasyon.
Bukas nga tinubdan, lisensya sa GPLv3:
Sa ubos mao ang mas detalyado nga kinatibuk-ang pagtan-aw sa mga nag-unang bahin, dugang ang pipila ka teknikal nga detalye kung unsaon pagpatugtog ang mga video sa YouTube sa imong Android app nga dili mogamit sa Google API o web wrapper.
Sa main screen ug sa player screen: mga random nga rekomendasyon gikan sa dili-random nga mga channel
Dali nga pagpangita sa lokal nga database
=>
Pagdugang og bag-ong channel o playlist
Pangitaa pinaagi sa ngalan online o i-paste ang nailhan nga URL. Ang lista sa video sa channel o playlist ma-save sa usa ka lokal nga database; ang mga thumbnail dili ma-cache.
Dinamikong playlist - mga resulta sa pagpangita sa pagdula
=>
Ang mga rekomendasyon ubos sa video magpakita lang sa mga video nga mohaom sa gipangita nga pangutana.
Susama, kon magbukas ka og video gikan sa mga setting sa playlist, ang listahan sa mga rekomendasyon magpakita lang og mga video gikan sa mao gihapong playlist.
Ang mga playlist ug mga channel mahimong temporaryong i-off ug i-on pag-usab
Palihug timan-i: ang mga video gikan sa usa ka gi-disable nga playlist mawala usab sa mga resulta sa pagpangita, kasaysayan sa pagtan-aw, ug sa imong lista sa mga paborito. Apan ayaw kabalaka, kini makita dayon human ma-enable pag-usab ang playlist.
Idugang ang video sa blacklist
Ang gibabagan nga video dili na makita sa mga rekomendasyon o resulta sa pagpangita, ug mawala kini sa imong listahan sa mga paborito ug kasaysayan sa pagtan-aw. Makita gihapon ang video sa mga setting sa playlist.
Tan-awa ang imong blocklist ug i-enable pag-usab ang mga butang nga aksidenteng nababagan:
Mga Setting > menu sa header > Blacklist
Paborito nga mga video ug kasaysayan sa pagtan-aw
Ang paborito nga mga video sa screen sa player gimarkahan og bituon sa taas nga tuo nga suok.
Mga menu sa konteksto sa header sa screen ug sa dugay nga pag-klik sa mga gallery ug lista
Kopyaha ang ngalan o adres sa usa ka video o playlist sa screen sa pagtan-aw o bisan unsang lista.
Dali nga Pagsugod - Idugang ang Girekomendar nga mga Channel ug mga Playlist
=>
Ang aplikasyon makita dayon sama sa mga screenshot sa ibabaw.
Ang dili kinahanglan nga mga channel ug playlist mahimong i-off o mapapas sa mga setting.
Pag-instalar
panid sa proyekto:
sa Iningles:
mga pagpagawas:
- Wala kini sa Google Play ug dili kini makita sa umaabot nga panahon (gidili sa Google ang mga app nga molaktaw sa ilang API ug mo-parse sa ilang site, lakip na ang nahisgutang Channel Whitelist o ang NewPipe player).
- Pagtukod gikan sa tinubdan:
- I-download ang APK gikan sa seksyon sa mga pagpagawas:
- Nanghinaut ko nga makita kini sa katalogo sa umaabot nga panahon. (, apan wala pa kini mouswag sulod sa halos usa ka bulan), apan wala pa
Palihug timan-i nga ang pagbalhin-balhin tali sa lain-laing mga bersyon gikan sa lain-laing mga tinubdan sa parehas nga device dili mogana tungod sa lain-laing mga pirma sa APK file. Sa dili pa mag-install og bersyon gikan sa bag-ong tinubdan, kinahanglan una nimong papason ang kasamtangang bersyon uban sa datos niini—cache sa playlist ug kasaysayan sa pagtan-aw—(o mahibal-an kung giunsa pagbalhin kini nga datos).
Mga detalye sa teknikal
Dili kinahanglan og Google/YouTube account, internet access lang, naggamit og mga librarya:
- aron makakuha og datos gikan sa serbisyo sa YouTube ug
- para magpatugtog og mga video.
Bukas nga tinubdan, libre nga lisensya nga GPLv3.
Pangutana: Legal ba ang pag-scrape sa mga website nga walay pagtugot (o klaro nga pagdili) gikan sa mga tagsulat? , kinsa wala mogamit sa ilang API, apan nag-parse sa ilang mga site, tungod kay ilang gilapas ang ilang kasabutan sa tiggamit.
Tubag: Siyempre legal kini, naa ra nimo ang pagpili kung unsang himan ang imong gamiton sa pagbasa sa impormasyon nga magamit sa publiko. Dugang pa: , pero basin lahi ang opinyon ni Gul, sa personal, wala pa koy tinguha nga moadto sa korte sa Amerika aron kombinsihon sila nga dili.
Usa ka gamay nga kodigo
librarya — proyekto sa auxiliary player , nagtugot kanimo sa pag-download og lista sa mga video para sa usa ka piho nga channel o playlist, pag-download og detalyadong impormasyon bahin sa usa ka nailhan nga video (unsay makita sa web page sa video), pagkuha sa address sa thumbnail sa video, ug pagkuha usab sa address sa usa ka video stream.
Medyo lisod ang code para sa pagkarga sa playlist, busa dili nako kini ihatag dinhi. Kon interesado ka, tan-awa ang source code; usa ra kini ka klase. .
Atong tan-awon kon unsaon pagkuha sa video stream address gikan sa public page address sa video ug pagpatukar niini sa player.
Ikonektar ang librarya ngadto sa
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Makapainteres nga dili gihapon kini magamit human niini, tungod kay ang mga ehemplo moreklamo bahin sa nawala nga klase sa Downloader. Mahimo kining kopyahon ngadto sa proyekto gikan sa direktoryo sa automated tests. — mogana para sa bersyon 0.17.4 (murag giusab kini nga bahin sa mas bag-ong bersyon sa librarya, apan kinahanglan pa kini nga susihon).
Kuhaa ang adres sa video stream gamit ang adres sa panid sa video sa YouTube:
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;
}Ang adres sa video nga ytVidUrl mahimong publikong adres sa bisan unsang panid sa video sa website sa YouTube, pananglitan
Ang magdudula mahimong Gikan mismo sa Google. Dili kini web wrapper para sa YouTube, apan usa ka tinuod, embeddable player para sa pagpatugtog og bisan unsang video, flexible ug mapasibo. Mahimo pa gani kini nga magpatugtog og mga video stream sa YouTube kung imong ihatag ang saktong URL. Nadawat na namo ang stream URL, busa atong tan-awon kung unsaon kini ipadala sa player.
Ilakip ang usa ka librarya sa usa ka proyekto :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Dili nato hisgutan ang tanang detalye sa pagbutang sa player component sa app screen (makita nimo kini sa mga ehemplo sa website sa proyekto o sa code). Atong tan-awon kon unsaon pagsugod sa pagpatugtog og YouTube video sa player gamit ang address nga nakuha sa ibabaw:
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);
}
}Nahibal-an nga Mga Isyu
- Dili ma-play ang mga video nga may limitasyon sa edad nga nanginahanglan og Google/YouTube account login.
sama pananglit: ,
Tambag: idugang ang maong mga video sa imong blacklist o hangyoa ang tagsulat sa video nga tangtangon ang restriksyon nga sayop nga gibutang.
- Ang ubang mga streaming video diin ang serbisyo nagbalik og zero nga gitas-on dili mo-play (para sa maong mga video, ang gidugayon sa mga lista ug mga gallery gimarkahan nga "[dur undef]")
sama pananglit: ,
Tambag: idugang ang ingon nga mga video sa imong blacklist.
- Ang mga video nga makita lang pinaagi sa direktang mga link mahimong dili makita sa imong lokal nga playlist, bisan pa kon imong i-download ang tanang video sa tiggamit.
sama pananglit:
Kon makakita ka og pampublikong video nga dili kinahanglan og login ug mo-play sa browser apan dili mo-play sa player, palihog pagpadala og bug report (posible nga naayo na ang problema sa bag-ong bersyon). Bag-ongPipoExtractor ug kinahanglan ra nimo nga i-update ang assembly gamit kini nga bersyon, ).
Ang interface mahimong maglangan kon hinay ang koneksyon sa internet (apan dili mapalong)
Ingon sa usa ka resulta,
Nibalhin ang akong anak gikan sa tablet ngadto sa Samsung smart TV, nga dili makadagan og Android apps. Mao nga, ang pinakamaayong parental control kay personal gihapon.
Apan ang app nahimo nga sayon ra gamiton mao nga nagsugod ko sa paggamit niini mismo. Ang akong unang impresyon gikan sa unang mga bersyon kay nisulod ko sa laing kalibutan. Ang tanang sulod gi-download gikan sa YouTube, apan dili na kini YouTube, lahi na kini, luwas ug kontrolado, sama sa pagkuha nako og alupihan gikan sa akong mata ug gibutang kini sa usa ka garapon nga bildo. Ug ang tanan mahitungod sa mga rekomendasyon.
Source: www.habr.com
