1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3use std::path::PathBuf;
4
5use crate::platforms::Platform;
6use tokio_util::sync::CancellationToken;
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct MediaInfo {
10 pub title: String,
11 pub author: String,
12 pub platform: String,
13 pub duration_seconds: Option<f64>,
14 pub thumbnail_url: Option<String>,
15 pub available_qualities: Vec<VideoQuality>,
16 pub media_type: MediaType,
17 pub file_size_bytes: Option<u64>,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
21pub enum MediaType {
22 Video,
23 Audio,
24 Photo,
25 Gif,
26 Carousel,
27 Playlist,
28 Course,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct VideoQuality {
33 pub label: String,
34 pub width: u32,
35 pub height: u32,
36 pub url: String,
37 pub format: String,
38}
39
40#[derive(Clone)]
41pub struct DownloadOptions {
42 pub quality: Option<String>,
43 pub output_dir: PathBuf,
44 pub filename_template: Option<String>,
45 pub download_subtitles: bool,
46 pub include_auto_subtitles: bool,
47 pub download_mode: Option<String>,
48 pub format_id: Option<String>,
49 pub referer: Option<String>,
50 pub extra_headers: Option<HashMap<String, String>>,
51 pub page_url: Option<String>,
52 pub user_agent: Option<String>,
53 pub cancel_token: CancellationToken,
54 pub concurrent_fragments: u32,
55 pub ytdlp_path: Option<PathBuf>,
56 pub torrent_listen_port: Option<u16>,
57 pub torrent_id_slot: Option<std::sync::Arc<tokio::sync::Mutex<Option<usize>>>>,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct FormatInfo {
62 pub format_id: String,
63 pub ext: String,
64 pub resolution: Option<String>,
65 pub width: Option<u32>,
66 pub height: Option<u32>,
67 pub fps: Option<f64>,
68 pub vcodec: Option<String>,
69 pub acodec: Option<String>,
70 pub filesize: Option<u64>,
71 pub tbr: Option<f64>,
72 pub has_video: bool,
73 pub has_audio: bool,
74 pub format_note: Option<String>,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct DownloadResult {
79 pub file_path: PathBuf,
80 pub file_size_bytes: u64,
81 pub duration_seconds: f64,
82 #[serde(default)]
84 pub torrent_id: Option<usize>,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct MediaItem {
89 pub url: String,
90 pub media_type: MediaType,
91 pub thumbnail_url: Option<String>,
92 pub width: Option<u32>,
93 pub height: Option<u32>,
94 pub duration_seconds: Option<f64>,
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize)]
98pub struct GenericDownloadResult {
99 pub platform: Platform,
100 pub title: String,
101 pub author: String,
102 pub files: Vec<DownloadedFile>,
103 pub total_bytes: u64,
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct DownloadedFile {
108 pub path: PathBuf,
109 pub media_type: MediaType,
110 pub size_bytes: u64,
111}