add youtube-dl upload widget

master
Patrick Cleavelin 2023-08-01 15:44:07 -05:00
parent 4a9f826369
commit b449a900fe
3 changed files with 90 additions and 0 deletions

View File

@ -148,6 +148,7 @@ fn spawn_api(settings: Arc<Mutex<Settings>>) {
"/v2/intros/remove/:guild_id/:channel", "/v2/intros/remove/:guild_id/:channel",
post(routes::v2_remove_intro_from_user), post(routes::v2_remove_intro_from_user),
) )
.route("/v2/intros/:guild/add", get(routes::v2_add_guild_intro))
.route( .route(
"/v2/intros/:guild/upload", "/v2/intros/:guild/upload",
post(routes::v2_upload_guild_intro), post(routes::v2_upload_guild_intro),

View File

@ -145,6 +145,13 @@ pub(crate) async fn guild_dashboard(
.push_builder(upload_form(&state.origin, guild_id)) .push_builder(upload_form(&state.origin, guild_id))
}) })
}) })
.builder(Tag::Div, |b| {
b.attribute("class", "container")
.builder(Tag::Article, |b| {
b.builder_text(Tag::Header, "Upload New Intro from Url")
.push_builder(ytdl_form(&state.origin, guild_id))
})
})
} else { } else {
b b
}; };
@ -231,6 +238,29 @@ fn upload_form(origin: &str, guild_id: u64) -> HtmxBuilder {
}) })
} }
fn ytdl_form(origin: &str, guild_id: u64) -> HtmxBuilder {
HtmxBuilder::new(Tag::Empty).form(|b| {
b.attribute("class", "container")
.hx_get(&format!("{}/v2/intros/{}/add", origin, guild_id))
.builder(Tag::FieldSet, |b| {
b.attribute("class", "container")
.label(|b| {
b.text("Video Url").input(|b| {
b.attribute("placeholder", "enter video url")
.attribute("name", "url")
})
})
.label(|b| {
b.text("Intro Title").input(|b| {
b.attribute("placeholder", "enter intro title")
.attribute("name", "name")
})
})
})
.button(|b| b.attribute("type", "submit").text("Upload"))
})
}
fn moderator_dashboard(state: &ApiState) -> HtmxBuilder { fn moderator_dashboard(state: &ApiState) -> HtmxBuilder {
HtmxBuilder::new(Tag::Empty).link("Go back to old UI", &format!("{}/old", state.origin)) HtmxBuilder::new(Tag::Empty).link("Go back to old UI", &format!("{}/old", state.origin))
} }

View File

@ -747,6 +747,65 @@ pub(crate) async fn add_guild_intro(
Ok(()) Ok(())
} }
pub(crate) async fn v2_add_guild_intro(
State(state): State<ApiState>,
Path(guild): Path<u64>,
Query(mut params): Query<HashMap<String, String>>,
user: User,
) -> Result<HeaderMap, Error> {
let mut settings = state.settings.lock().await;
let Some(url) = params.remove("url") else {
return Err(Error::InvalidRequest);
};
let Some(friendly_name) = params.remove("name") else {
return Err(Error::InvalidRequest);
};
{
let Some(guild) = settings.guilds.get(&guild) else {
return Err(Error::NoGuildFound);
};
let Some(guild_user) = guild.users.get(&user.name) else {
return Err(Error::NoUserFound);
};
if !guild_user.permissions.can(auth::Permission::UploadSounds) {
return Err(Error::InvalidPermission);
}
}
let Some(guild) = settings.guilds.get_mut(&guild) else {
return Err(Error::NoGuildFound);
};
let uuid = Uuid::new_v4().to_string();
let child = tokio::process::Command::new("yt-dlp")
.arg(&url)
.args(["-o", &format!("sounds/{uuid}")])
.args(["-x", "--audio-format", "mp3"])
.spawn()
.map_err(Error::Ytdl)?
.wait()
.await
.map_err(Error::Ytdl)?;
if !child.success() {
return Err(Error::YtdlTerminated);
}
guild.intros.insert(
uuid.clone(),
Intro::File(FileIntro {
filename: format!("{uuid}.mp3"),
friendly_name,
}),
);
let mut headers = HeaderMap::new();
headers.insert("HX-Refresh", HeaderValue::from_static("true"));
Ok(headers)
}
pub(crate) async fn delete_guild_intro( pub(crate) async fn delete_guild_intro(
State(state): State<ApiState>, State(state): State<ApiState>,
Path(guild): Path<u64>, Path(guild): Path<u64>,