diff options
-rw-r--r-- | common/src/config.rs | 5 | ||||
-rw-r--r-- | common/src/jhls.rs | 20 | ||||
-rw-r--r-- | common/src/lib.rs | 19 | ||||
-rw-r--r-- | stream/src/jhls.rs | 1 | ||||
-rw-r--r-- | transcoder/src/snippet.rs | 2 | ||||
-rw-r--r-- | web/script/player/jhls.d.ts | 46 | ||||
-rw-r--r-- | web/script/player/mod.ts | 35 |
7 files changed, 74 insertions, 54 deletions
diff --git a/common/src/config.rs b/common/src/config.rs index e30e70b..2666d17 100644 --- a/common/src/config.rs +++ b/common/src/config.rs @@ -4,7 +4,7 @@ Copyright (C) 2023 metamuffin <metamuffin.org> */ -use crate::{user::PermissionSet, EncodingProfile}; +use crate::{jhls::EncodingProfile, user::PermissionSet}; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, path::PathBuf}; @@ -30,9 +30,10 @@ pub struct GlobalConfig { } mod default { - use crate::EncodingProfile; use std::path::PathBuf; + use crate::jhls::EncodingProfile; + pub fn admin_username() -> String { "admin".into() } diff --git a/common/src/jhls.rs b/common/src/jhls.rs index 306161f..e3ef23c 100644 --- a/common/src/jhls.rs +++ b/common/src/jhls.rs @@ -5,6 +5,7 @@ use std::ops::Range; #[derive(Debug, Clone, Deserialize, Serialize)] pub struct JhlsMetadata { pub duration: f64, + pub extra_profiles: Vec<EncodingProfile>, pub tracks: Vec<JhlsTrack>, } @@ -13,3 +14,22 @@ pub struct JhlsTrack { pub info: SourceTrack, pub segments: Vec<Range<f64>>, } + +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(rename_all = "snake_case")] +pub enum EncodingProfile { + Video { + codec: String, + preset: u8, + bitrate: usize, + width: usize, + }, + Audio { + codec: String, + bitrate: usize, + sample_rate: Option<f64>, + }, + Subtitles { + codec: String, + }, +} diff --git a/common/src/lib.rs b/common/src/lib.rs index 6d1a78c..c425c21 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -142,22 +142,3 @@ pub enum SourceTrackKind { }, Subtitles, } - -#[derive(Debug, Clone, Deserialize, Serialize)] -#[serde(rename_all = "snake_case")] -pub enum EncodingProfile { - Video { - codec: String, - preset: u8, - bitrate: usize, - width: usize, - }, - Audio { - codec: String, - bitrate: usize, - sample_rate: Option<f64>, - }, - Subtitles { - codec: String, - }, -} diff --git a/stream/src/jhls.rs b/stream/src/jhls.rs index d528c06..5183a26 100644 --- a/stream/src/jhls.rs +++ b/stream/src/jhls.rs @@ -42,6 +42,7 @@ pub async fn jhls_stream( let out = serde_json::to_string(&JhlsMetadata { tracks, + extra_profiles: CONF.transcoding_profiles.clone(), duration: media.duration, })?; tokio::spawn(async move { b.write_all(out.as_bytes()).await }); diff --git a/transcoder/src/snippet.rs b/transcoder/src/snippet.rs index 9253c2c..42847a0 100644 --- a/transcoder/src/snippet.rs +++ b/transcoder/src/snippet.rs @@ -5,7 +5,7 @@ */ use jellybase::cache::async_cache_file; -use jellycommon::{AssetLocation, EncodingProfile}; +use jellycommon::{jhls::EncodingProfile, AssetLocation}; use log::info; use std::process::Stdio; use tokio::{ diff --git a/web/script/player/jhls.d.ts b/web/script/player/jhls.d.ts new file mode 100644 index 0000000..b1b6a57 --- /dev/null +++ b/web/script/player/jhls.d.ts @@ -0,0 +1,46 @@ + +export interface TimeRange { start: number, end: number } +export interface JhlsMetadata { + tracks: JhlsTrack[], + extra_profiles: EncodingProfile[], + duration: number, +} +export interface JhlsTrack { + info: SourceTrack, + segments: TimeRange[], +} +export interface SourceTrack { + kind: SourceTrackKind, + name: string, + codec: string, + language: string, +} +export interface SourceTrackKind { + video?: { + width: number, + height: number, + fps: number, + }, + audio?: { + channels: number, + sample_rate: number, + bit_depth: number, + }, + subtitles?: boolean, +} +export interface EncodingProfile { + video?: { + codec: string, + preset: number, + bitrate: number, + width: number, + }, + audio?: { + codec: string, + bitrate: number, + sample_rate?: number, + }, + subtitles?: { + codec: string, + }, +}
\ No newline at end of file diff --git a/web/script/player/mod.ts b/web/script/player/mod.ts index 52da454..caad781 100644 --- a/web/script/player/mod.ts +++ b/web/script/player/mod.ts @@ -4,35 +4,7 @@ Copyright (C) 2023 metamuffin <metamuffin.org> */ import { OVar, e } from "../jshelper/mod.ts"; - -export interface Range { start: number, end: number } -export interface JhlsMetadata { - tracks: JhlsTrack[], - duration: number, -} -export interface JhlsTrack { - info: SourceTrack, - segments: Range[], -} -export interface SourceTrack { - kind: SourceTrackKind, - name: string, - codec: string, - language: string, -} -export interface SourceTrackKind { - video?: { - width: number, - height: number, - fps: number, - }, - audio?: { - channels: number, - sample_rate: number, - bit_depth: number, - }, - subtitles?: boolean, -} +import { JhlsMetadata, JhlsTrack, TimeRange } from "./jhls.d.ts"; const TARGET_BUFFER_DURATION = 15 const MIN_BUFFER_DURATION = 1 @@ -148,7 +120,7 @@ function display_time(t: number): string { return (h ? h + "h" : "") + (m ? m + "m" : "") + (s ? s + "s" : "") } -interface BufferRange extends Range { status: "buffered" | "loading" | "queued" } +interface BufferRange extends TimeRange { status: "buffered" | "loading" | "queued" } class Player { public video = e("video") private media_source = new MediaSource(); @@ -240,10 +212,9 @@ class Player { await this.update(p) this.video.currentTime = p } - } -interface AppendRange extends Range { buf: ArrayBuffer, index: number, cb: () => void } +interface AppendRange extends TimeRange { buf: ArrayBuffer, index: number, cb: () => void } class PlayerTrack { private source_buffer: SourceBuffer private current_load?: AppendRange |