Merge branch 'tootube2' into 'master'

Moar correction/tweak

See merge request veretcle/tootube!3
This commit is contained in:
VC
2023-10-04 14:44:33 +00:00
6 changed files with 120 additions and 9 deletions

88
Cargo.lock generated
View File

@@ -17,6 +17,15 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "anstream" name = "anstream"
version = "0.6.1" version = "0.6.1"
@@ -189,6 +198,19 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "env_logger"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
dependencies = [
"humantime",
"is-terminal",
"log",
"regex",
"termcolor",
]
[[package]] [[package]]
name = "errno" name = "errno"
version = "0.3.3" version = "0.3.3"
@@ -365,6 +387,12 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "humantime"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "0.14.27" version = "0.14.27"
@@ -428,6 +456,17 @@ version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"
[[package]]
name = "is-terminal"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
dependencies = [
"hermit-abi",
"rustix",
"windows-sys",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.9" version = "1.0.9"
@@ -637,6 +676,35 @@ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
] ]
[[package]]
name = "regex"
version = "1.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.11.20" version = "0.11.20"
@@ -833,6 +901,15 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "termcolor"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64"
dependencies = [
"winapi-util",
]
[[package]] [[package]]
name = "tinyvec" name = "tinyvec"
version = "1.6.0" version = "1.6.0"
@@ -902,6 +979,8 @@ name = "tootube"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"clap", "clap",
"env_logger",
"log",
"reqwest", "reqwest",
"serde", "serde",
"toml", "toml",
@@ -1090,6 +1169,15 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "winapi-x86_64-pc-windows-gnu" name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0" version = "0.4.0"

View File

@@ -11,6 +11,8 @@ reqwest = { version = "^0.11", features = ["blocking", "json"] }
clap = "^4" clap = "^4"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
toml = "^0.5" toml = "^0.5"
log = "^0.4"
env_logger = "^0.10"
[profile.release] [profile.release]
strip = true strip = true

14
LICENSE Normal file
View File

@@ -0,0 +1,14 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.

View File

@@ -64,10 +64,10 @@ pub fn run(config: Config) {
let local_path = dl_video(&dl_url) let local_path = dl_video(&dl_url)
.unwrap_or_else(|e| panic!("Cannot download video at URL {}: {}", dl_url, e)); .unwrap_or_else(|e| panic!("Cannot download video at URL {}: {}", dl_url, e));
let resumable_upload_id = create_resumable_upload(&config.youtube, &latest_vid) let resumable_upload_url = create_resumable_upload(&config.youtube, &latest_vid)
.unwrap_or_else(|e| panic!("Cannot retrieve the uploads resumable id: {e}")); .unwrap_or_else(|e| panic!("Cannot retrieve the uploads resumable id: {e}"));
upload_video(&local_path, &resumable_upload_id, &config.youtube) upload_video(&local_path, &resumable_upload_url, &config.youtube)
.unwrap_or_else(|e| panic!("Cannot resume upload!: {e}")); .unwrap_or_else(|e| panic!("Cannot resume upload!: {e}"));
remove_file(&local_path).unwrap_or_else(|e| panic!("Cannot delete file {}: {}", local_path, e)); remove_file(&local_path).unwrap_or_else(|e| panic!("Cannot delete file {}: {}", local_path, e));

View File

@@ -21,5 +21,7 @@ fn main() {
let config = parse_toml(matches.get_one::<String>("config").unwrap()); let config = parse_toml(matches.get_one::<String>("config").unwrap());
env_logger::init();
run(config); run(config);
} }

View File

@@ -1,6 +1,6 @@
use crate::{config::YoutubeConfig, error::TootubeError, peertube::PeerTubeVideo}; use crate::{config::YoutubeConfig, error::TootubeError, peertube::PeerTubeVideo};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::{error::Error, sync::Mutex}; use std::{error::Error, fs::File, sync::Mutex};
static ACCESS_TOKEN: Mutex<String> = Mutex::new(String::new()); static ACCESS_TOKEN: Mutex<String> = Mutex::new(String::new());
@@ -136,7 +136,7 @@ pub fn create_resumable_upload(
if res.status().is_success() { if res.status().is_success() {
Ok(res Ok(res
.headers() .headers()
.get("x-guploader-uploadid") .get("location")
.ok_or("Cannot find suitable header")? .ok_or("Cannot find suitable header")?
.to_str()? .to_str()?
.to_string()) .to_string())
@@ -147,16 +147,21 @@ pub fn create_resumable_upload(
pub fn upload_video( pub fn upload_video(
f_path: &str, f_path: &str,
r_id: &str, r_url: &str,
config: &YoutubeConfig, config: &YoutubeConfig,
) -> Result<(), Box<dyn Error>> { ) -> Result<(), Box<dyn Error>> {
// Get access token
let access_token = refresh_token(config)?; let access_token = refresh_token(config)?;
// Create client
let client = reqwest::blocking::Client::new(); let client = reqwest::blocking::Client::new();
let res = client.put(format!("https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=snippet%2Cstatus&upload_id={}", r_id)) let file = File::open(f_path)?;
let res = client
.put(r_url)
.header("Authorization", format!("Bearer {}", access_token)) .header("Authorization", format!("Bearer {}", access_token))
.body(f_path.to_string()) .body(file)
.send()?; .send()?;
if res.status().is_success() { if res.status().is_success() {