Show HN: Kyoo – มีเดียเบราว์เซอร์แบบโฮสต์เอง (ทางเลือกแทน Jellyfin/Plex)
(github.com/zoriya)- Kyoo คือมีเดียเซิร์ฟเวอร์แบบโฮสต์เองที่เน้นคอนเทนต์วิดีโอ เช่น ภาพยนตร์ ซีรีส์ และอนิเมะ และเป็นทางเลือกแทน Jellyfin หรือ Plex
- ตั้งเป้าให้ทำงานได้โดยไม่ต้องบังคับโครงสร้างโฟลเดอร์หรือแก้ไขเมทาดาทาด้วยตนเอง และหากสแกนมีเดียไม่ได้อย่างถูกต้องเพราะชื่อไฟล์ประหลาด จะถือว่าเป็น บั๊ก
- ทิศทางคือไม่ขยายความสามารถด้วยระบบปลั๊กอิน แต่ให้มาเป็น ฟีเจอร์ในตัว รวมถึง dynamic transcoding, พรีวิวภาพขนาดย่อ, การตรวจจับอินโทร/เครดิต, และการรองรับซับไตเติลขั้นสูง
- ตอนนี้ไคลเอนต์รองรับ Web และ Android ยังไม่มีใน v5 ส่วนการรองรับ iOS และ tvOS ยังไม่มีแผนในตอนนี้ เนื่องจากค่าใช้จ่ายในการซื้อฮาร์ดแวร์และค่าธรรมเนียมนักพัฒนารายปีราว $100
- ผู้ดูแลเซิร์ฟเวอร์สามารถใช้ไฟล์จากไดเรกทอรีดาวน์โหลดได้โดยไม่ต้องจัดระเบียบเพิ่ม และ Kyoo จำกัดขอบเขตไว้ที่ การสตรีมวิดีโอ ไม่ใช่เพลง อีบุ๊ก หรือเกม
ปัญหาที่ Kyoo ต้องการแก้
- Kyoo เป็นมีเดียเซิร์ฟเวอร์แบบโฮสต์เองที่ออกแบบมาสำหรับคอนเทนต์วิดีโอโดยเฉพาะ
- คอนเทนต์เป้าหมายคือ Movies, Series และ Anime
- ถูกนำเสนอในฐานะทางเลือกแทน Jellyfin หรือ Plex
- มีเป้าหมายเพื่อลดภาระในการดูแลรักษา
- ไม่ต้องใช้ โครงสร้างโฟลเดอร์ แบบเฉพาะ
- ไม่ต้องแก้ไข เมทาดาทา ด้วยตนเอง
- แม้ชื่อไฟล์จะแปลก ระบบก็ควรสแกนมีเดียได้อย่างถูกต้อง และหากล้มเหลวจะถือว่าเป็นบั๊ก
- ไม่มีระบบปลั๊กอิน
- แนวทางคือใส่ความสามารถต่าง ๆ มาเป็น ฟีเจอร์ในตัว ให้มากที่สุด
ฟีเจอร์หลัก
-
Dynamic Transcoding
- สามารถทรานส์โค้ดมีเดียเป็นคุณภาพตามต้องการได้
- เปลี่ยนคุณภาพระหว่างเล่นได้ด้วยการสลับคุณภาพอัตโนมัติ
- ค้นหาตำแหน่งเล่นได้ทันทีโดยไม่ต้องรอ transcoder
-
Video Preview Thumbnails
- เมื่อเอาเมาส์ไปวางบนแถบความคืบหน้าของวิดีโอ จะเห็นพรีวิววิดีโอได้
-
Intro/Credit detection
- ตรวจจับอินโทรและเครดิตอัตโนมัติด้วย audio fingerprinting
- สามารถใช้การจับคู่ชื่อบทได้ด้วย
-
Enhanced Subtitle Support
- รองรับซับไตเติล PGS/VODSUB และ SSA/ASS
- ใช้ฟอนต์ที่ฝังมากับวิดีโอเมื่อทำได้
-
Anime Name Parsing
- สามารถจับคู่ชื่อไฟล์อนิเมะที่ซับซ้อนได้ เช่น
[Some-Stuffs] Jojo's Bizarre Adventure Stone Ocean 24 (1920x1080 Blu-Ray Opus) [2750810F].mkv
- สามารถจับคู่ชื่อไฟล์อนิเมะที่ซับซ้อนได้ เช่น
-
Helm Chart
- มี Helm chart อย่างเป็นทางการสำหรับนำไป deploy บน Kubernetes cluster
- รองรับหลาย replica กำลังอยู่ระหว่างพัฒนา
-
OIDC Connection
- สามารถล็อกอินผ่านบริการที่รองรับ OIDC เช่น Google, Discord และ Authelia
ฟีเจอร์ที่ยังไม่ถูกนำกลับมาใน v5
-
Watch List Scrubbing Support
- ฟีเจอร์ซิงก์รายการรับชมกับบริการที่เชื่อมต่อแบบอัตโนมัติ ยังไม่ถูกนำกลับมาใน v5
- เป้าหมายคือ SIMKL และบริการอื่น ๆ ในอนาคต
-
Download and Offline Support
- ฟีเจอร์ดาวน์โหลดและการใช้งานออฟไลน์สำหรับดูโดยไม่ใช้อินเทอร์เน็ต ก็ยังไม่ถูกนำกลับมาใน v5
- ระบุว่าจะมีการซิงก์ความคืบหน้าเมื่ออุปกรณ์กลับมาออนไลน์อีกครั้ง
ไคลเอนต์และแพลตฟอร์ม
- ไคลเอนต์ที่รองรับในตอนนี้คือ Web
- ไคลเอนต์ Android ยังไม่มีใน v5 และอยู่ในสถานะ “soon”
- กำลังพิจารณาแพลตฟอร์มเพิ่มเติม
- ฟรอนต์เอนด์สร้างด้วย React-Native และ Expo
- ตอนนี้ยังไม่มีแผนรองรับอุปกรณ์ Apple
- เป้าหมายคือ iOS และ tvOS
- เหตุผลคือค่าใช้จ่ายในการซื้อฮาร์ดแวร์และค่าธรรมเนียมนักพัฒนารายปีราว $100
ความแตกต่างจาก Jellyfin/Plex
- Jellyfin และ Plex ถูกอธิบายว่าในเชิงเทคนิคพึ่งพา SQLite และใช้แนวทางรวมทุกอย่างไว้ในคอนเทนเนอร์เดียว
- Kyoo ใช้แนวทางที่สามารถมีคอนเทนเนอร์เพิ่มเติมได้เมื่อจำเป็น
- ตัวอย่างคือ transcoder
- ปรัชญาการใช้งานคือ “ตั้งครั้งเดียวแล้วลืมได้เลย”
- ไม่บังคับให้เปลี่ยนชื่อไฟล์ด้วยตนเอง
- ไม่บังคับโครงสร้างโฟลเดอร์แบบเฉพาะ
- ตั้งเป้าให้ใช้ไฟล์จากไดเรกทอรีดาวน์โหลดได้ตามเดิม
- ขอบเขตถูกจำกัดไว้ที่การสตรีมภาพยนตร์ รายการทีวี และอนิเมะ
- ไม่ครอบคลุมเพลง อีบุ๊ก หรือเกม
การเริ่มต้นและแหล่งข้อมูลเชื่อมต่อ
- API Documentation: เอกสาร API สำหรับเชื่อม Kyoo เข้ากับบริการอื่น
- Join the discord: Discord สำหรับถามคำถาม พูดคุยการพัฒนา ขอฟีเจอร์ และแชร์บั๊ก
- weblate: สามารถเพิ่มคำแปลสำหรับภาษาที่ Kyoo ยังไม่รองรับได้
- kyoo.zoriya.dev: มีไลฟ์เดโมที่ใช้ภาพยนตร์ปลอดลิขสิทธิ์
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เดโมสวยและทำออกมาได้ดี ในฐานะผู้ใช้ Plex ที่พอใจกับการใช้ Plexamp สำหรับเสียง และแอป Plex บน Apple TV สำหรับวิดีโอ เลยยังไม่คิดจะย้าย แต่เหตุผลที่เริ่มจาก โปรเจกต์แซนด์บ็อกซ์ เพื่อเรียนรู้เทคโนโลยีที่สนใจ แล้วค่อย ๆ โตขึ้นเรื่อย ๆ นั้น ผมมองว่าเป็นแรงจูงใจที่ดีมากในการสร้างอะไรสักอย่าง
ผมตั้งค่า Jellyfin ควบคู่ไว้แล้ว เผื่อวันที่ Plex เข้าสู่ช่วง enshittification สักวัน แต่สมาชิกตลอดชีพที่ซื้อไว้ตั้งแต่ปี 2012 ก็ถือว่าคุ้มค่ามากจนถึงตอนนี้
เคยพยายามย้ายจาก Plex ไป Jellyfin แต่ข้อจำกัดใหญ่ที่สุดคือ Jellyfin ดูไม่ค่อยสนใจเรื่องการจัดการไลบรารี และตั้งสมมติฐานกับโครงสร้างไฟล์แข็งเกินไป
ในวิกิมีส่วนแยกต่างหากอธิบายวิธีตั้งชื่อไฟล์ให้ถูกต้อง ซึ่งเป็นเรื่องที่ใน Plex ไม่ต้องไปใส่ใจ เลยสงสัยว่า Kyoo ใช้แนวทางคล้ายกันหรือเป็นมิตรกับผู้ใช้มากกว่า วิธีหารายได้ของ Plex นั้นชวนงง แต่ Jellyfin ยังให้ความรู้สึกว่ายังไม่พร้อมสำหรับการใช้งานจริงจัง
ตอนนี้ยังมีเคสยกเว้นอยู่ โดยเฉพาะรายการอย่างวิดีโอเสริมที่บางครั้งยังจัดการได้ไม่ดี แต่แม้แต่ชื่อไฟล์อนิเมะแปลก ๆ อย่าง "[SomeGroup] Jojo's bizzare adventure - golden wings 12.mkv" ก็ยังจัดการได้
พูดตรง ๆ ก็อยากเห็น Jellyfin แบบเบาที่ไม่มีโค้ดจัดการสื่อเลย มีแค่สตรีมมิงอย่างเดียว
พอกำหนดครั้งหนึ่งว่าโฟลเดอร์นั้นเป็นทีวีโชว์เรื่องไหน ดูเหมือนตอนต่าง ๆ จะถูกรู้จำโดยอัตโนมัติ สิ่งที่ไม่ทำงานอัตโนมัติก็แค่ขั้นตอนแรกเมื่อชื่อโฟลเดอร์ไม่ได้ตั้งมา "ถูกต้อง" และน่าจะเลี่ยงได้ด้วยการสร้างไฟล์ NFO จำนวนมากด้วย Tiny Media Manager
ดูดี น่าสนใจที่โปรเจกต์มีเดียเซิร์ฟเวอร์ดูเหมือนมีแนวโน้มชอบ C# เป็นพิเศษ สงสัยว่ามีเหตุผลทางเทคนิคหรือเป็นผลจากโปรเจกต์ใหญ่ ๆ สร้างมาตรฐานไว้มากกว่า
Kyoo เองก็ใช้ Python และ Go ในบางคอมโพเนนต์ และใช้ TypeScript สำหรับฟรอนต์เอนด์
การใช้ทั้ง Postgres และ RabbitMQ ดูจะเกินความจำเป็นไปหน่อย สงสัยว่าจะรับ PR ที่รวมให้เหลือ Postgres อย่างเดียวเพื่อลดภาระการดูแลระบบไหม
กลับไปที่เดสก์ท็อปแล้วคงต้องดูว่า RabbitMQ ทำอะไรในมีเดียเซิร์ฟเวอร์กันแน่
แต่ฝั่งการซิงก์บน Kubernetes ยังต้องทำงานเพิ่มอีก
มันให้ระบบคิวที่แข็งแรงมากและพิสูจน์ตัวเองแล้ว ขณะเดียวกันภาระในการรันก็ต่ำ ทำให้คงโครงสร้างให้เรียบง่ายได้
เป็นโปรเจกต์ที่น่าสนใจ แต่สงสัยตรงส่วนที่บอกว่า "เลื่อนหาได้อย่างง่ายดายโดยไม่ต้องรอทรานส์โคดเดอร์"
เรื่องนี้เป็นปัญหาเสมอขึ้นอยู่กับคอนเทนเนอร์และโคเดก อยากรู้ว่าแก้ได้อย่างไร หรือไม่ได้ใช้ libav หรือเปล่า
ส่วนที่ยากคือทำให้ช่วงเหล่านั้นดูต่อเนื่องได้โดยไม่สะดุดหรือมีปัญหา และรับประกันว่าไม่มีช่วงเสียงหรือวิดีโอซ้ำกัน ถ้ามีคนสนใจพอ อาจเขียนบล็อกโพสต์อธิบายละเอียดได้
เสียดายที่ไม่จัดการเพลง เหตุผลหลักที่ใช้ Plex คือ การจัดการไลบรารีเพลง แม้ใน Plex เอง เพลงจะรู้สึกเหมือนเป็นจุดสนใจรอง แต่ก็ยังใช้งานได้ดีพอ
เมื่อไม่กี่วันก่อนผมตั้งค่า Jellyfin กับ tailscale บน n100
ในเครือข่ายโลคัลมันทำงานได้ดี แต่พอแชร์ให้ครอบครัวที่อยู่อีกซีกโลกผ่าน tailscale ก็มีบางอย่างพัง แม้ความเร็วอัปโหลดจะเร็วพอ แต่กว่าสตรีมจะเริ่มใช้เวลาประมาณ 1 นาที อาจเกี่ยวกับ latency ก็ได้ เดี๋ยวจะลองใช้ตัวนี้ดู
แนะนำให้ลองเปลี่ยน congestion control เริ่มต้นของ Linux (
net.ipv4.tcp_congestion_control) บนเซิร์ฟเวอร์ Jellyfin และ reverse proxy เป็นbbrรายละเอียดผมก็ไม่ค่อยรู้ และอาจมีผลข้างเคียง [1] หรืออาจมีอัลกอริทึม congestion control ที่ดีกว่านี้ แต่ในกรณีของผม วิธีนี้แก้ปัญหาได้หมด ก่อนหน้านี้แม้ในสภาพเครือข่ายที่เงียบและเหมาะสม การเชื่อมต่อก็ตันอยู่ที่ต่ำกว่า 10% ของความเร็วสาย บางครั้งเหลือถึง 1%นอกจากนี้ Caddy เปิด HTTP/3 เป็นค่าเริ่มต้น ผมเลยบังคับให้ใช้ HTTP/2 แทน ไว้ภายหลังคงต้องดู bbr เวอร์ชันใหม่กว่านี้ด้วย
[1] https://news.ycombinator.com/item?id=37408406
ดูดีมาก สงสัยว่าสามารถ cast ไปยังทีวีได้ไหม นี่เป็นเหตุผลเดียวที่ทำให้ผมยังติดอยู่กับ Plex นอกนั้นผมไม่ได้ชอบ Plex เลย
ดูทิศทางที่ Plex กำลังไปแล้ว ดีใจที่มีตัวเลือกเพิ่มขึ้น อยากให้ทำ hook ที่เชื่อมกับ SONARR/RADARR ได้โดยตรง เพื่อให้คลิกรายการในปฏิทินแล้วไปยัง player ได้ทันที
อาจไม่อยากทำเองเพราะประเด็นทางกฎหมาย แต่ถ้ารวมสื่อแบบ self-hosted กับฟีเจอร์จัดการสื่อเถื่อนไว้ในอินเทอร์เฟซเดียวก็น่าจะสะดวก
ดูดี ผมลองกดหนังสองสามเรื่องในหน้าเดโมแล้วสุ่มสำรวจดู ทุกอย่างทำงานได้สมบูรณ์
สงสัยเรื่อง scalability อยากรู้ว่าเซิร์ฟเวอร์หนึ่งเครื่องรองรับผู้ใช้ได้ประมาณกี่คน และต้องใช้เซิร์ฟเวอร์แบบไหน หน้าเดโมรันอยู่บนอะไร และถ้าผู้ใช้เพิ่มขึ้นถึงระดับไหนจึงจะโอเวอร์โหลด
ยังไม่เคย benchmark เซิร์ฟเวอร์ แต่คอขวดแทบจะแน่นอนว่าเป็นความเร็วในการเข้ารหัสของเครื่อง ถ้าไคลเอนต์ทุกตัวต้อง transcode หนัง h265 8K คนละเรื่องพร้อมกัน ก็ต้องใช้ประสิทธิภาพ GPU/CPU คนละระดับโดยสิ้นเชิงกับกรณีที่ผู้ใช้จำนวนเท่ากันเล่นแบบ direct play