บทนำสั้นๆ: ฉันต้องการพูดคุยเกี่ยวกับโปรแกรมเล่น YouTube ออนไลน์สำหรับ Android พร้อมเพลย์ลิสต์ ช่อง และคำแนะนำในท้องถิ่น
บทนำเพิ่มเติม:
เมื่อไม่นานมานี้ ฉันพบปัญหาเดียวกันกับผู้เขียนแอปพลิเคชันที่ยอดเยี่ยมนี้
น่าเสียดายที่หลังจากติดตั้งแอปพลิเคชัน Channel Whitelist แล้ว ก็พบข้อบกพร่องที่ธรรมดากว่าอีกประการหนึ่ง แต่ยังคงเป็นอันตรายถึงชีวิต - NIH I (และที่สำคัญที่สุดคือลูกชายของฉัน) พบว่าอินเทอร์เฟซของมันไม่สะดวกนักโดยเฉพาะหลังจากนิสัยชอบใช้เครื่องเล่น YouTube Kids
โดยทั่วไปแล้ว หลังจากผ่านไประยะหนึ่ง ฉันก็พร้อมที่จะดำเนินการด้วยตนเอง หลังจากนั้นไม่นานก็เป็นไปได้ที่จะติดแท็กในการเปิดตัวครั้งแรก
คุณสมบัติหลัก:
- เพิ่มช่องและเพลย์ลิสต์ที่คุณชื่นชอบ - พวกเขาจะถูกบันทึกและจัดทำดัชนีในฐานข้อมูลท้องถิ่น
- ภายในเพลย์ลิสต์ที่เพิ่ม ให้ปิดวิดีโอที่ไม่จำเป็นหากคุณไม่ต้องการ
- รายการแนะนำจะถูกสร้างขึ้นแบบสุ่มจากช่องและเพลย์ลิสต์ที่เพิ่มลงในแอปพลิเคชันเท่านั้น
โอเพ่นซอร์ส, ใบอนุญาต GPLv3:
ด้านล่างนี้คือภาพรวมของคุณสมบัติหลักโดยละเอียด รวมถึงรายละเอียดทางเทคนิคบางประการเกี่ยวกับวิธีเล่นวิดีโอ YouTube ในแอปพลิเคชัน Android ของคุณโดยไม่ต้องใช้ Google API และ Web Wrapper
บนหน้าจอหลักและบนหน้าจอเครื่องเล่น: คำแนะนำแบบสุ่มจากช่องที่ไม่สุ่ม
ค้นหาทันทีในฐานข้อมูลท้องถิ่น
เพิ่มช่องหรือเพลย์ลิสต์ใหม่
ค้นหาตามชื่อออนไลน์หรือใส่ที่อยู่ที่รู้จัก รายการวิดีโอของช่องหรือเพลย์ลิสต์จะถูกบันทึกไว้ในฐานข้อมูลท้องถิ่น ไอคอนจะไม่ถูกแคช
เพลย์ลิสต์แบบไดนามิก - เล่นผลการค้นหา
ในวิดีโอแนะนำจะมีเฉพาะวิดีโอที่ตรงกับคำค้นหาเท่านั้น
ในทำนองเดียวกัน หากคุณเปิดวิดีโอจากการตั้งค่าเพลย์ลิสต์ เฉพาะวิดีโอจากเพลย์ลิสต์เดียวกันเท่านั้นที่จะปรากฏในรายการแนะนำ
เพลย์ลิสต์และช่องสามารถปิดและเปิดใหม่ได้ชั่วคราว
โปรดทราบ: วิดีโอจากเพลย์ลิสต์ที่ถูกปิดใช้งานจะหายไปจากผลการค้นหา ประวัติการดู และจากรายการโปรด แต่ไม่ต้องกังวล รายการเหล่านั้นจะปรากฏที่นั่นอีกครั้งทันทีหลังจากเปิดเพลย์ลิสต์อีกครั้ง
เพิ่มวิดีโอลงในบัญชีดำ
วิดีโอที่ถูกบล็อกจะไม่แสดงในคำแนะนำ ในผลการค้นหา และจะหายไปจากรายการโปรดและจากประวัติการดู วิดีโอจะยังคงมองเห็นได้ในการตั้งค่าเพลย์ลิสต์
ดูบัญชีดำและเปิดใช้งานรายการที่ถูกบล็อกโดยไม่ได้ตั้งใจอีกครั้ง:
การตั้งค่า > เมนูส่วนหัว > บัญชีดำ
วิดีโอโปรดและประวัติการดู
วิดีโอโปรดบนหน้าจอเครื่องเล่นจะมีเครื่องหมายดอกจันอยู่ที่มุมขวาบน
เมนูบริบทในชื่อหน้าจอและคลิกยาวในแกลเลอรีและรายการ
คัดลอกชื่อหรือที่อยู่ของวิดีโอหรือเพลย์ลิสต์ในหน้าจอรับชมหรือในรายการใดๆ
เริ่มต้นอย่างรวดเร็ว - เพิ่มช่องและเพลย์ลิสต์ที่แนะนำ
แอปพลิเคชันจะมีลักษณะเหมือนภาพหน้าจอด้านบนทันที
ช่องและเพลย์ลิสต์ที่ไม่จำเป็นสามารถปิดหรือลบได้ในการตั้งค่า
การติดตั้ง
หน้าโครงการ:
เป็นภาษาอังกฤษ:
เผยแพร่:
- มันไม่ได้อยู่ใน Google Play และจะไม่เกิดขึ้นในอนาคตอันใกล้นี้ (Google ห้ามแอปพลิเคชันที่ข้าม API และแยกวิเคราะห์เว็บไซต์ของพวกเขา รวมถึงรายการช่องที่อนุญาตหรือเครื่องเล่น NewPipe ที่กล่าวถึง)
- สร้างจากแหล่งที่มา:
https://github.com/sadr0b0t/yashlang/ - ดาวน์โหลด APK จากส่วนเผยแพร่:
https://github.com/sadr0b0t/yashlang/releases - ฉันหวังว่ามันจะปรากฏในแค็ตตาล็อกในภายหลัง
F-ดรอยด์ (ดูเหมือนว่าคำขอเพิ่มเติมจะได้รับการอนุมัติแล้ว แต่ไม่ได้ย้ายไปอีกเกือบเดือนแล้ว) แต่ยังไม่ถึง
โปรดทราบว่าการสลับระหว่างเวอร์ชันต่างๆ จากแหล่งต่างๆ บนอุปกรณ์เดียวกันจะไม่ทำงานเนื่องจากลายเซ็นของไฟล์ APK ต่างกัน ก่อนที่จะติดตั้งเวอร์ชันจากแหล่งใหม่ คุณจะต้องลบเวอร์ชันที่ติดตั้งพร้อมกับข้อมูลก่อน - แคชเพลย์ลิสต์และประวัติการเรียกดู (หรือค้นหาวิธีถ่ายโอนข้อมูล)
รายละเอียดทางเทคนิค
ไม่จำเป็นต้องมีบัญชี Google/YouTube คุณเพียงต้องการอินเทอร์เน็ต ใช้ไลบรารีต่อไปนี้:
ใหม่PipeExtractor เพื่อรับข้อมูลจากบริการ YouTube และเอ็กโซเพลเยอร์ เพื่อเล่นวิดีโอ
โอเพ่นซอร์ส ใบอนุญาต GPLv3 ฟรี
คำถาม: โดยทั่วไปแล้วการขูดเว็บไซต์โดยไม่ได้รับอนุญาต (หรือถูกแบนอย่างชัดแจ้ง) จากผู้เขียนนั้นถูกกฎหมายหรือไม่
คำตอบ: แน่นอนว่าถูกกฎหมาย ขึ้นอยู่กับคุณว่าจะใช้เครื่องมือใดในการอ่านข้อมูลที่เปิดเผยต่อสาธารณะ นอกจากนี้:
รหัสบางส่วน
ห้องสมุด
รหัสในการโหลดเพลย์ลิสต์นั้นยุ่งยากนิดหน่อยดังนั้นฉันจึงไม่ให้ที่นี่สำหรับผู้ที่สนใจลองดูซอร์สโค้ดโดยพื้นฐานแล้วมันเป็นคลาส
เรามาดูวิธีรับที่อยู่ของสตรีมวิดีโอจากที่อยู่ของหน้าวิดีโอสาธารณะและเล่นในเครื่องเล่น
เชื่อมต่อห้องสมุดเข้ากับ
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}
สงสัยว่าหลังจากนี้คุณจะยังใช้มันไม่ได้เพราะ... ตัวอย่างจะบ่นเกี่ยวกับคลาส Downloader ที่หายไป สามารถคัดลอกไปยังโปรเจ็กต์ได้จากไดเร็กทอรีการทดสอบอัตโนมัติ
รับที่อยู่ของสตรีมวิดีโอตามที่อยู่ของหน้าวิดีโอบนเว็บไซต์ 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;
}
ที่อยู่วิดีโอ ytVidUrl อาจเป็นที่อยู่สาธารณะของหน้าวิดีโอใดก็ได้บนเว็บไซต์ YouTube เป็นต้น
ผู้เล่นก็จะได้
เชื่อมต่อห้องสมุดเข้ากับโครงการ
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}
เราจะไม่พิจารณาถึงความแตกต่างทั้งหมดของการวางส่วนประกอบเครื่องเล่นบนหน้าจอแอปพลิเคชัน (คุณสามารถดูตัวอย่างบนเว็บไซต์โครงการหรือในโค้ด) เราจะดูเฉพาะวิธีเริ่มเล่นวิดีโอจาก YouTube ในเครื่องเล่นที่ ที่อยู่ที่ได้รับด้านบน:
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 ของคุณ
ตัวอย่างเช่น
คำแนะนำ: เพิ่มวิดีโอดังกล่าวลงในบัญชีดำหรือขอให้ผู้เขียนวิดีโอลบข้อจำกัดที่ตั้งไว้โดยไม่ได้ตั้งใจ
- วิดีโอออกอากาศบางรายการซึ่งบริการส่งคืนความยาวเป็นศูนย์จะไม่เล่น (สำหรับวิดีโอดังกล่าว ระยะเวลาในรายการและแกลเลอรีจะถูกทำเครื่องหมายเป็น "[dur undef]")
ตัวอย่างเช่น
คำแนะนำ: เพิ่มวิดีโอดังกล่าวลงในบัญชีดำ
- วิดีโอที่มีเฉพาะผ่านลิงก์โดยตรงอาจไม่รวมอยู่ในเพลย์ลิสต์ท้องถิ่น แม้ว่าคุณจะดาวน์โหลดวิดีโอทั้งหมดของผู้ใช้ก็ตาม
ตัวอย่างเช่น
-
หากคุณพบวิดีโอสาธารณะที่ไม่จำเป็นต้องเข้าสู่ระบบ เล่นในเบราว์เซอร์ แต่ไม่เล่นในโปรแกรมเล่น ให้ส่งรายงานข้อบกพร่อง (ค่อนข้างเป็นไปได้ที่ปัญหาได้รับการแก้ไขแล้วในเวอร์ชันใหม่ ใหม่PipeExtractor และคุณจะต้องอัปเดตชุดประกอบด้วยเวอร์ชันนี้เท่านั้น
เช่น ). -
อินเทอร์เฟซอาจช้าลงหากอินเทอร์เน็ตช้า (แต่ไม่ได้ปิด)
เป็นผลให้
ลูกชายของฉันย้ายจากแท็บเล็ตไปใช้สมาร์ททีวี Samsung ซึ่งไม่สามารถใช้งานแอปพลิเคชัน Android ได้ ดังนั้นการควบคุมโดยผู้ปกครองที่ดีที่สุดจึงยังคงเป็นเรื่องส่วนตัว
แต่แอปพลิเคชันกลับกลายเป็นว่าสะดวกเพียงพอสำหรับฉันที่จะเริ่มใช้งานด้วยตัวเอง ความประทับใจแรกจากการทำงานเวอร์ชันแรกๆ คือการได้อยู่ในอีกโลกหนึ่ง เนื้อหาทั้งหมดถูกดาวน์โหลดจาก YouTube แต่นี่ไม่ใช่ YouTube อีกต่อไป แต่เป็นอย่างอื่น ปลอดภัยและควบคุมได้ ราวกับว่าคุณเอาตะขาบออกจากตาแล้วใส่ไว้ในขวดแก้ว และมันคือทั้งหมดที่เกี่ยวกับคำแนะนำ
ที่มา: will.com