Skip to main content

youtube_uploader/
lib.rs

1//! # youtube-uploader
2//!
3//! A Rust library for uploading videos to YouTube via the **Data API v3** resumable upload
4//! endpoint. Run it, it uploads, it exits — no daemon, no background process.
5//!
6//! ## Quick Start
7//!
8//! ```no_run
9//! use std::sync::Arc;
10//! use tokio::sync::Mutex;
11//! use youtube_uploader::{
12//!     CredentialStore, YouTubeUploader, VideoUpload, Visibility, StderrProgressListener,
13//! };
14//!
15//! # #[tokio::main]
16//! # async fn main() -> Result<(), Box<dyn std::error::Error>> {
17//! let store = Arc::new(Mutex::new(CredentialStore::load("my-passphrase")?));
18//! let youtube = YouTubeUploader::new(store, "my-passphrase", "youtube");
19//! let progress = Arc::new(StderrProgressListener::new());
20//!
21//! let video = VideoUpload::new("/path/to/video.mp4", "My Video Title")
22//!     .with_description("Video description")
23//!     .with_tags(vec!["tag1".to_string(), "tag2".to_string()])
24//!     .with_visibility(Visibility::Private);
25//!
26//! let result = youtube.upload(&video, Some(progress)).await?;
27//! println!("Uploaded: {} (ID: {})", result.url, result.video_id);
28//! # Ok(())
29//! # }
30//! ```
31//!
32//! ## Features
33//!
34//! - **Resumable chunked upload** with 308 resume support and crash recovery
35//! - **Multi-channel workspaces** — upload to multiple YouTube accounts from one machine
36//! - **Upload profiles** — TOML-based presets for reusable upload defaults
37//! - **Per-video metadata TOML** — AI-friendly `.meta.toml` files for automation
38//! - **Encrypted credential storage** — AES-256-GCM, PBKDF2 100K, zeroize on drop
39//! - **Default visibility = Private** — uploads never accidentally go public
40//!
41//! ## Architecture
42//!
43//! | Module | Purpose |
44//! |--------|---------|
45//! | [`YouTubeUploader`] | Resumable upload, token refresh, delete, channel info |
46//! | [`VideoUpload`] | Video metadata builder (title, description, tags, visibility, etc.) |
47//! | [`CredentialStore`] | Encrypted on-disk credential storage with workspaces |
48//! | [`UploadProfile`] | Named TOML presets for upload defaults |
49//! | [`VideoMeta`] | Per-video `.meta.toml` metadata |
50//! | [`UploadState`] | Crash recovery state for resumable uploads |
51//! | [`ProgressListener`] | Trait for custom upload progress callbacks |
52//!
53//! ## Resolution Order
54//!
55//! When multiple sources provide the same field:
56//!
57//! ```text
58//! CLI flags > meta TOML > profile TOML > built-in defaults (private)
59//! ```
60//!
61//! Tags are **merged** (profile + video), not replaced.
62
63pub mod auth;
64pub mod config;
65pub mod error;
66pub mod net;
67pub mod profile;
68pub mod progress;
69pub mod resume;
70pub mod upload;
71pub mod validation;
72pub mod youtube;
73
74pub use config::{CredentialStore, PlatformCredentials};
75pub use error::UploadError;
76pub use net::is_private_ip;
77pub use profile::UploadProfile;
78pub use profile::VideoMeta;
79pub use progress::{NoopProgressListener, ProgressListener, StderrProgressListener};
80pub use resume::UploadState;
81pub use upload::{License, UploadResult, VideoUpload, Visibility};
82pub use youtube::YouTubeUploader;
83pub use zeroize::Zeroizing;