Skip to main content

mangofetch_core/models/
media.rs

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    /// Torrent ID within the shared librqbit session (magnet downloads only).
83    #[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}