Pambuka ringkes: Aku pengin ngandhani babagan pamuter YouTube online kanggo Android kanthi dhaptar lagu, saluran lan rekomendasi lokal.

Introduksi lengkap:
Sawetara wektu kepungkur aku nemoni masalah sing padha karo penulis aplikasi sing apik iki , lan aku wis ditetepake dhewe persis sikap padha menyang: Aku pengin bisa kanggo menehi anak tablet utawa smartphone karo kartun saka wektu kanggo wektu, nanging aku rampung wareg karo ngendi dhaftar Rekomendasi ing aplikasi standar - klien YouTube - ndadékaké anak sawise 2-3 klik.
Sayange, sawise nginstal app Channel Whitelist, liyane prosaic, nanging isih cacat fatal ditemokake - NIH I (lan, sing paling penting, anakku) nemokake antarmuka sing ora trep banget, utamane sawise kebiasaan nggunakake pamuter YouTube Kids.
Umumé, sawise sawetara wektu aku matured kanggo nggawe implementasine dhewe. Sawise sawetara wektu dadi bisa kanggo nyelehake tag ing release pisanan.
Fitur utama:
- Tambah saluran lan dhaptar lagu favorit - bakal disimpen lan diindeks ing database lokal
- Pateni video ekstra ing dhaptar lagu sing ditambahake yen sampeyan ora mbutuhake
- Dhaptar rekomendasi digawe kanthi acak mung saka saluran lan dhaptar lagu sing ditambahake menyang aplikasi
Kode sumber mbukak sumber, lisensi GPLv3:
Ing ngisor iki ringkesan sing luwih rinci babagan fitur utama, ditambah sawetara rincian teknis babagan cara muter video YouTube ing aplikasi Android sampeyan tanpa nggunakake Google API lan bungkus web.
Ing layar utama lan ing layar pamuter: Rekomendasi acak saka saluran non-acak
Panelusuran cepet ing database lokal
=>
Tambah saluran utawa dhaptar lagu anyar
Telusuri kanthi jeneng online utawa lebokake alamat sing dikenal. Dhaptar saluran utawa video dhaptar lagu disimpen ing basis data lokal, lambang ora disimpen ing cache.
Dhaptar Lagu Dinamis - Asil Panelusuran Puter
=>
Rekomendasi ing video kasebut mung bakal kalebu video sing cocog karo pitakon telusuran.
Kajaba iku, yen sampeyan mbukak video saka setelan dhaptar lagu, dhaptar rekomendasi mung bakal nuduhake video saka dhaptar lagu sing padha.
Dhaptar lagu lan saluran bisa dipateni lan diuripake maneh
Wigati dimangerteni: video saka dhaptar lagu sing dipateni uga bakal ilang saka asil panelusuran, riwayat tampilan, lan dhaptar favorit sampeyan. Nanging aja padha sumelang, padha bakal katon maneh sanalika sawise dhaptar lagu diaktifake maneh.
Tambah video menyang dhaptar ireng
Video sing diblokir ora bakal ditampilake ing rekomendasi, asil telusuran, bakal ilang saka dhaptar favorit lan saka riwayat tampilan. Video isih bakal katon ing setelan dhaptar lagu.
Deleng dhaptar ireng lan aktifake maneh item sing diblokir kanthi ora sengaja:
Setelan > menu header > Daftar ireng
Video favorit lan riwayat tampilan
Video favorit ing layar pamuter ditandhani karo lintang ing pojok tengen ndhuwur.
Menu konteks ing header layar lan klik dawa ing galeri lan dhaptar
Salin jeneng utawa alamat video utawa dhaptar lagu ing layar tampilan utawa dhaptar apa wae.
Miwiti Cepet - Tambah Saluran lan Dhaptar Lagu sing Disaranake
=>
Aplikasi bakal langsung katon kaya gambar ing ndhuwur.
Saluran lan dhaptar lagu sing ora perlu bisa dipateni utawa dibusak ing setelan.
Instalasi
kaca proyek:
ing basa Inggris:
rilis:
- Ora ana ing GooglePlay lan ora bakal ana ing mangsa ngarep (Google nglarang aplikasi sing ngliwati API lan ngurai situs kasebut, kalebu Daftar Putih Saluran utawa pamuter NewPipe sing kasebut ing ndhuwur)
- Dibangun saka sumber:
- Download apk saka bagean rilis:
- Mugi ing sawetara wektu bakal katon ing katalog (, nanging wis meh sasi durung pindhah luwih), nanging durung
Wigati dimangerteni manawa ngalih ing antarane versi sing beda saka sumber sing beda-beda ing piranti siji ora bakal bisa digunakake amarga teken beda file apk. Sadurunge nginstal versi saka sumber anyar, sampeyan kudu mbusak versi sing wis diinstal bebarengan karo data - cache dhaptar lagu lan riwayat tampilan (utawa ngerti carane nransfer data iki).
Rincian teknis
Ora mbutuhake akun Google/YouTube, mung Internet sing dibutuhake, nggunakake perpustakaan:
- kanggo njupuk data saka layanan YouTube lan
- kanggo muter video.
Open source, lisensi gratis GPLv3.
pitakonan: Apa malah legal kanggo parsing situs web tanpa ijin (utawa karo larangan eksplisit) saka penulis? , sing ora nggunakake API, nanging ngurai situs, amarga nglanggar persetujuan pangguna.
jawaban: mesthi iku legal, iku bisnis apa alat kanggo nggunakake kanggo maca informasi kasedhiya umum. Kajaba iku: , nanging Gul uga duwe pendapat beda, wong aku ora duwe kepinginan kanggo pindhah menyang pengadilan Amérika kanggo gawe uwong yakin wong liya.
Sithik kode
perpustakaan - proyek pemain tambahan , ngidini sampeyan ndownload dhaptar video kanggo saluran utawa dhaptar lagu sing ditemtokake, ndownload informasi rinci babagan video sing dikenal (apa sing katon ing kaca web video), entuk alamat lambang video, lan uga entuk alamat stream video.
Kode loading playlist rada ribet, dadi ora tak wenehi neng kene, nek minat coba didelok source codene, pokoke kelas .
Ayo ndeleng carane njaluk alamat stream video saka alamat kaca video umum lan muter ing pamuter.
Sambungake perpustakaan menyang
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Iku penasaran yen sawise iki isih ora bisa digunakake, amarga conto bakal sambat babagan Downloader kelas sing ilang. Bisa disalin menyang proyek saka direktori tes otomatis - dianggo kanggo versi 0.17.4 (iku misale jek sing ing versi anyar saka perpustakaan bagean iki reworked, nanging isih kudu dicenthang).
Entuk alamat stream video kanthi alamat kaca video ing situs web 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;
}Alamat video ytVidUrl bisa dadi alamat umum kaca video ing situs web YouTube, contone
Pamuter bakal saka Google dhewe. Iki dudu pambungkus web liwat YouTube, nanging pamuter sing dipasang kanthi nyata kanggo muter video apa wae, cukup fleksibel lan bisa disesuaikan. Kalebu kemampuan kanggo muter video stream saka YouTube, yen sampeyan nemtokake alamat sing bener. Kita mung nampa alamat stream, dadi ayo kang ndeleng carane ngirim menyang pamuter.
Sambungake perpustakaan menyang proyek kasebut :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Kita ora bakal nganggep kabeh nuansa nempatake komponen pamuter ing layar aplikasi (sampeyan bisa ndeleng conto ing situs web proyek utawa ing kode), kita mung bakal ndeleng carane miwiti muter video saka YouTube ing pamuter ing alamat sing dipikolehi ing ndhuwur:
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);
}
}Masalah sing Dikenal
- Ora bakal muter video sing diwatesi umur sing mbutuhake login akun Google/YouTube
contone: ,
Saran: tambahake video kasebut menyang dhaptar ireng utawa takon marang penulis video kanggo mbusak watesan sing disetel kanthi ora sengaja.
- Sawetara video streaming ora bakal diputer yen layanan ngasilake dawa nol (kanggo video kasebut, durasi ing dhaptar lan galeri ditandhani minangka "[dur undef]")
contone: ,
Saran: tambahake video kasebut menyang dhaptar ireng.
- Video sing mung kasedhiya liwat pranala langsung bisa uga ora kalebu ing dhaptar lagu lokal, sanajan sampeyan ngundhuh kabeh video pangguna.
contone:
Yen sampeyan nemokake video umum sing ora mbutuhake login, muter ing browser, nanging ora muter ing pamuter, kirim laporan bug (bisa uga masalah kasebut wis diatasi ing versi anyar. NewPipeExtractor lan sampeyan mung kudu nganyari rakitan nganggo versi iki, ).
Antarmuka bisa telat nalika internet alon (nanging ora dipateni)
Ing pungkasan
Anakku pindhah saka tablet menyang TV pinter Samsung, sing ora bisa mbukak aplikasi Android. Dadi kontrol wong tuwa sing paling apik isih pribadi.
Nanging app ternyata cukup trep kanggo miwiti nggunakake dhewe. Kesan pisanan saka versi kerja awal yaiku aku wis mlebu ing jagad liyane. Kabeh isi diundhuh saka YouTube, nanging ora YouTube maneh, nanging mergo, aman lan kontrol, kaya aku wis njupuk lipan metu saka mripat lan sijine iku ing jar kaca. Lan mung rekomendasi sing penting.
Source: www.habr.com
