aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/src/lib.rs12
-rw-r--r--import/src/infojson.rs31
-rw-r--r--import/src/main.rs36
3 files changed, 56 insertions, 23 deletions
diff --git a/common/src/lib.rs b/common/src/lib.rs
index 1da312f..be0528f 100644
--- a/common/src/lib.rs
+++ b/common/src/lib.rs
@@ -36,6 +36,7 @@ pub struct NodePublic {
#[serde(default)] pub description: Option<String>,
#[serde(default)] pub index: Option<usize>,
#[serde(default)] pub media: Option<MediaInfo>,
+ #[serde(default)] pub ratings: Vec<Rating>,
#[serde(default)] pub federated: Option<String>,
}
@@ -103,6 +104,17 @@ pub struct SourceTrack {
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
+pub enum Rating {
+ RottenTomatoes(u8),
+ Metacritic(u8),
+ Imdb(f32),
+ YoutubeViews(usize),
+ YoutubeLikes(usize),
+ YoutubeFollowers(usize),
+}
+
+#[derive(Debug, Clone, Deserialize, Serialize)]
+#[serde(rename_all = "snake_case")]
pub enum SourceTrackKind {
Video {
width: u64,
diff --git a/import/src/infojson.rs b/import/src/infojson.rs
index 6f98eaa..0ed496c 100644
--- a/import/src/infojson.rs
+++ b/import/src/infojson.rs
@@ -37,7 +37,7 @@ pub struct YVideo {
pub uploader_url: String,
pub upload_date: String,
pub availability: String, // "public" | "private" | "unlisted",
- pub original_url: String,
+ pub original_url: Option<String>,
pub webpage_url_basename: String,
pub webpage_url_domain: String,
pub extractor: String,
@@ -50,7 +50,6 @@ pub struct YVideo {
pub playlist_uploader_id: String,
pub n_entries: usize,
pub playlist_index: usize,
- pub playlist_autonumber: usize,
pub display_id: String,
pub fulltitle: String,
pub duration_string: String,
@@ -64,31 +63,31 @@ pub struct YCaption {
pub url: String,
pub ext: String, //"vtt" | "json3" | "srv1" | "srv2" | "srv3" | "ttml",
pub protocol: Option<String>,
- pub name: String,
+ pub name: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct YFormat {
pub format_id: String,
- pub format_note: String,
+ pub format_note: Option<String>,
pub ext: String,
pub protocol: String,
- pub acodec: String,
- pub vcodec: String,
+ pub acodec: Option<String>,
+ pub vcodec: Option<String>,
pub url: String,
- pub width: u32,
- pub height: u32,
- pub fps: f64,
- pub columns: u32,
- pub fragments: Vec<YFragment>,
- pub resolution: Vec<String>,
+ pub width: Option<u32>,
+ pub height: Option<u32>,
+ pub fps: Option<f64>,
+ pub columns: Option<u32>,
+ pub fragments: Option<Vec<YFragment>>,
+ pub resolution: String,
pub dynamic_range: Option<String>,
- pub aspect_ratio: f64,
+ pub aspect_ratio: Option<f64>,
pub http_headers: HashMap<String, String>,
pub audio_ext: String,
pub video_ext: String,
- pub vbr: usize,
- pub abr: usize,
+ pub vbr: Option<f64>,
+ pub abr: Option<f64>,
pub format: String,
}
@@ -118,6 +117,6 @@ pub struct YChapter {
#[derive(Debug, Serialize, Deserialize)]
pub struct YHeatmapSample {
pub start_time: f64,
- pub end_time: String,
+ pub end_time: f64,
pub value: f64,
}
diff --git a/import/src/main.rs b/import/src/main.rs
index bf5c49c..71c3c1e 100644
--- a/import/src/main.rs
+++ b/import/src/main.rs
@@ -3,13 +3,15 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
-pub mod tmdb;
pub mod infojson;
+pub mod tmdb;
use anyhow::Context;
use clap::{Parser, Subcommand};
+use infojson::YVideo;
use jellycommon::{
AssetLocation, LocalTrack, MediaInfo, MediaSource, Node, NodeKind, NodePrivate, NodePublic,
+ Rating,
};
use jellymatroska::read::EbmlReader;
use jellyremuxer::import::{import_metadata, seek_index};
@@ -118,17 +120,21 @@ fn main() -> anyhow::Result<()> {
.transpose()?;
let mut kind = NodeKind::Series;
- let (mut file_meta, mut source_path_e) = Default::default();
+ let mut file_meta = None;
+ let mut infojson = None;
if let Some(input_path) = &input {
- source_path_e = Some(path.join(format!("source.mkv")));
-
file_meta = Some({
let input = File::open(&input_path).unwrap();
let mut input = EbmlReader::new(input);
import_metadata(&mut input)?
});
+ if let Some(ij) = &file_meta.as_ref().unwrap().infojson {
+ infojson =
+ Some(serde_json::from_str::<YVideo>(ij).context("parsing info.json")?);
+ }
+
kind = if video {
NodeKind::Video
} else {
@@ -147,6 +153,7 @@ fn main() -> anyhow::Result<()> {
.unwrap();
let ident = make_ident(&title);
let path = path.join(&ident);
+ let source_path = input.as_ref().map(|_| path.join(format!("source.mkv")));
let (mut poster, mut backdrop) = (None, None);
if !args.dry {
@@ -211,6 +218,19 @@ fn main() -> anyhow::Result<()> {
.flatten();
}
+ let mut ratings = Vec::new();
+
+ ratings.extend(
+ infojson
+ .as_ref()
+ .map(|i| Rating::YoutubeViews(i.view_count)),
+ );
+ ratings.extend(
+ infojson
+ .as_ref()
+ .map(|i| Rating::YoutubeLikes(i.like_count)),
+ );
+
let node = Node {
private: NodePrivate {
import: None,
@@ -222,7 +242,7 @@ fn main() -> anyhow::Result<()> {
.clone()
.into_iter()
.map(|t| LocalTrack {
- path: source_path_e.clone().unwrap(),
+ path: source_path.clone().unwrap(),
..t
})
.collect(),
@@ -231,6 +251,7 @@ fn main() -> anyhow::Result<()> {
public: NodePublic {
parent: None,
federated: None,
+ ratings,
description: file_meta
.as_ref()
.map(|m| m.description.clone())
@@ -254,9 +275,10 @@ fn main() -> anyhow::Result<()> {
};
if args.dry {
- println!("{}", serde_json::to_string_pretty(&node)?)
+ println!("{}", serde_json::to_string_pretty(&infojson)?);
+ println!("{}", serde_json::to_string_pretty(&node)?);
} else {
- if let Some(source_path) = source_path_e {
+ if let Some(source_path) = source_path {
let input = input.clone().unwrap();
if r#move {
std::fs::rename(&input, &source_path)?;