aboutsummaryrefslogtreecommitdiff
path: root/import
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-04-06 15:40:58 +0200
committermetamuffin <metamuffin@disroot.org>2025-04-06 15:40:58 +0200
commit7acb520f552bd1edde5c29fbf5baf6643ec4b14e (patch)
tree222fa1d582d039b00da50735b62573db8bdc1f9d /import
parent80343d02e9e29e4bc55d790b491ce0d0c7bff201 (diff)
downloadjellything-7acb520f552bd1edde5c29fbf5baf6643ec4b14e.tar
jellything-7acb520f552bd1edde5c29fbf5baf6643ec4b14e.tar.bz2
jellything-7acb520f552bd1edde5c29fbf5baf6643ec4b14e.tar.zst
a bit more progress on new streaming api
Diffstat (limited to 'import')
-rw-r--r--import/Cargo.toml5
-rw-r--r--import/src/lib.rs3
-rw-r--r--import/src/matroska.rs116
3 files changed, 2 insertions, 122 deletions
diff --git a/import/Cargo.toml b/import/Cargo.toml
index 645326d..37b5a77 100644
--- a/import/Cargo.toml
+++ b/import/Cargo.toml
@@ -6,10 +6,7 @@ edition = "2021"
[dependencies]
jellybase = { path = "../base" }
jellyclient = { path = "../client" }
-
-ebml-struct = { git = "https://codeberg.org/metamuffin/ebml-struct", features = [
- "bincode",
-] }
+jellyremuxer = { path = "../remuxer" }
rayon = "1.10.0"
crossbeam-channel = "0.5.14"
diff --git a/import/src/lib.rs b/import/src/lib.rs
index 3226a0a..d7f9dd7 100644
--- a/import/src/lib.rs
+++ b/import/src/lib.rs
@@ -15,8 +15,8 @@ use jellybase::{
CONF, SECRETS,
};
use jellyclient::{Appearance, PeopleGroup, TmdbKind, TraktKind, Visibility};
+use jellyremuxer::metadata::matroska_metadata;
use log::info;
-use matroska::matroska_metadata;
use rayon::iter::{ParallelBridge, ParallelIterator};
use regex::Regex;
use std::{
@@ -36,7 +36,6 @@ use tokio::{
use trakt::Trakt;
pub mod infojson;
-pub mod matroska;
pub mod tmdb;
pub mod trakt;
diff --git a/import/src/matroska.rs b/import/src/matroska.rs
deleted file mode 100644
index 1593463..0000000
--- a/import/src/matroska.rs
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- This file is part of jellything (https://codeberg.org/metamuffin/jellything)
- which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
- Copyright (C) 2025 metamuffin <metamuffin.org>
-*/
-use anyhow::{Context, Result};
-use bincode::{Decode, Encode};
-use ebml_struct::{
- ids::*,
- matroska::*,
- read::{EbmlReadExt, TagRead},
-};
-use jellybase::{
- assetfed::AssetInner,
- cache::{cache_file, cache_memory},
- common::Asset,
-};
-use log::{info, warn};
-use std::{
- fs::File,
- io::{BufReader, ErrorKind, Read, Write},
- path::Path,
- sync::Arc,
-};
-
-#[derive(Encode, Decode, Clone)]
-pub(crate) struct MatroskaMetadata {
- pub info: Option<Info>,
- pub tracks: Option<Tracks>,
- pub cover: Option<Asset>,
- pub chapters: Option<Chapters>,
- pub tags: Option<Tags>,
- pub infojson: Option<Vec<u8>>,
-}
-pub(crate) fn matroska_metadata(path: &Path) -> Result<Arc<Option<MatroskaMetadata>>> {
- cache_memory(&["mkmeta-v2", path.to_string_lossy().as_ref()], || {
- let mut magic = [0; 4];
- File::open(path)?.read_exact(&mut magic).ok();
- if !matches!(magic, [0x1A, 0x45, 0xDF, 0xA3]) {
- return Ok(None);
- }
-
- info!("reading {path:?}");
- let mut file = BufReader::new(File::open(path)?);
- let mut file = file.by_ref().take(u64::MAX);
-
- let (x, mut ebml) = file.read_tag()?;
- assert_eq!(x, EL_EBML);
- let ebml = Ebml::read(&mut ebml).unwrap();
- assert!(ebml.doc_type == "matroska" || ebml.doc_type == "webm");
- let (x, mut segment) = file.read_tag()?;
- assert_eq!(x, EL_SEGMENT);
-
- let mut info = None;
- let mut infojson = None;
- let mut tracks = None;
- let mut cover = None;
- let mut chapters = None;
- let mut tags = None;
- loop {
- let (x, mut seg) = match segment.read_tag() {
- Ok(o) => o,
- Err(e) if e.kind() == ErrorKind::UnexpectedEof => break,
- Err(e) => return Err(e.into()),
- };
- match x {
- EL_INFO => info = Some(Info::read(&mut seg).context("info")?),
- EL_TRACKS => tracks = Some(Tracks::read(&mut seg).context("tracks")?),
- EL_CHAPTERS => chapters = Some(Chapters::read(&mut seg).context("chapters")?),
- EL_TAGS => tags = Some(Tags::read(&mut seg).context("tags")?),
- EL_ATTACHMENTS => {
- let attachments = Attachments::read(&mut seg).context("attachments")?;
- for f in attachments.files {
- match f.name.as_str() {
- "info.json" => {
- infojson = Some(f.data);
- }
- "cover.webp" | "cover.png" | "cover.jpg" | "cover.jpeg"
- | "cover.avif" => {
- cover = Some(
- AssetInner::Cache(cache_file(
- &["att-cover", path.to_string_lossy().as_ref()],
- move |mut file| {
- file.write_all(&f.data)?;
- Ok(())
- },
- )?)
- .ser(),
- )
- }
- _ => (),
- }
- }
- }
- EL_VOID | EL_CRC32 | EL_CUES | EL_SEEKHEAD => {
- seg.consume()?;
- }
- EL_CLUSTER => {
- break;
- }
- id => {
- warn!("unknown top-level element {id:x}");
- seg.consume()?;
- }
- }
- }
- Ok(Some(MatroskaMetadata {
- chapters,
- cover,
- info,
- infojson,
- tags,
- tracks,
- }))
- })
-}