Compare commits
4 Commits
e1fcfd1b22
...
3f804a388a
Author | SHA1 | Date |
---|---|---|
|
3f804a388a | |
|
cd9dd8b34b | |
|
4fadbc2d4b | |
|
23167ae077 |
|
@ -375,7 +375,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "imgurx"
|
name = "imgurx"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quick-xml",
|
"quick-xml",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "imgurx"
|
name = "imgurx"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
authors = ["blank X <theblankx@protonmail.com>"]
|
authors = ["blank X <theblankx@protonmail.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
|
|
14
src/main.rs
14
src/main.rs
|
@ -31,11 +31,21 @@ async fn async_main(port: u16) {
|
||||||
.and(client.clone())
|
.and(client.clone())
|
||||||
.and_then(handle_album);
|
.and_then(handle_album);
|
||||||
let media_path = warp::path!(String).and(client).and_then(handle_media);
|
let media_path = warp::path!(String).and(client).and_then(handle_media);
|
||||||
|
let root_handler = warp::path::end().map(|| warp::reply::html(
|
||||||
|
format!("<html><head><title>ImgurX v{0}</title><style>body {{ background-color: black; color: black; text-align: center; }}\ndiv {{ border: 1px solid #008; background: #eef; padding: 0.5em 1em 0.5em 1em; }}</style></head><body><div><b><a href=\"https://gitlab.com/blankX/imgurx\" style=\"text-decoration: none;\">ImgurX v{0}</a></b><br>An alternative JS-less Imgur frontend</div></body></html>", env!("CARGO_PKG_VERSION"))
|
||||||
|
));
|
||||||
|
let index_handler = warp::path("index.html").and(root_handler);
|
||||||
let not_found_handler = warp::any().map(|| warp::reply::with_status(
|
let not_found_handler = warp::any().map(|| warp::reply::with_status(
|
||||||
warp::reply::html("<html><head><style>body { background-color: black; color: white; text-align: center; }\ndiv { border: 1px solid #fcc; background: #fee; padding: 0.5em 1em 0.5em 1em; color: black; }</style></head><body><div><b>404: Not Found</b></div></body></html>"),
|
warp::reply::html("<html><head><title>404: Not Found</title><style>body { background-color: black; color: white; text-align: center; }\ndiv { border: 1px solid #fcc; background: #fee; padding: 0.5em 1em 0.5em 1em; color: black; }</style></head><body><div><b>404: Not Found</b></div></body></html>"),
|
||||||
404.try_into().unwrap(),
|
404.try_into().unwrap(),
|
||||||
));
|
));
|
||||||
let routes = warp::filters::method::get().and(album_path.or(media_path).or(not_found_handler));
|
let routes = warp::filters::method::get().and(
|
||||||
|
album_path
|
||||||
|
.or(index_handler)
|
||||||
|
.or(media_path)
|
||||||
|
.or(root_handler)
|
||||||
|
.or(not_found_handler),
|
||||||
|
);
|
||||||
eprintln!("Serving on 0.0.0.0:{}", port);
|
eprintln!("Serving on 0.0.0.0:{}", port);
|
||||||
warp::serve(routes).run(([0u8, 0, 0, 0], port)).await;
|
warp::serve(routes).run(([0u8, 0, 0, 0], port)).await;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,16 +46,6 @@ impl From<serde_json::Error> for Error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//impl fmt::Display for Error {
|
|
||||||
// fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
// formatter.write_str(&match self {
|
|
||||||
// Error::Reqwest(err) => format!("reqwest: {}", err),
|
|
||||||
// Error::SerdeJSON(err) => format!("serde_json: {}", err),
|
|
||||||
// Error::ApiErrors(err) =>
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct APIErrors {
|
pub struct APIErrors {
|
||||||
pub errors: Vec<APIError>,
|
pub errors: Vec<APIError>,
|
||||||
|
|
26
src/utils.rs
26
src/utils.rs
|
@ -48,6 +48,24 @@ pub fn generate_html(album: Result<Album, Error>) -> (u16, Vec<u8>) {
|
||||||
let elem = BytesStart::owned(b"head".to_vec(), 4);
|
let elem = BytesStart::owned(b"head".to_vec(), 4);
|
||||||
writer.write_event(Event::Start(elem)).unwrap();
|
writer.write_event(Event::Start(elem)).unwrap();
|
||||||
|
|
||||||
|
let (show_details, title) = match album {
|
||||||
|
Ok(ref album) if !album.title.is_empty() => (false, Some(album.title.clone())),
|
||||||
|
Err(Error::APIErrors(ref err)) if err.errors.len() == 1 && err.errors[0].code == "404" => {
|
||||||
|
(false, Some(format!("404: {}", &err.errors[0].detail)))
|
||||||
|
}
|
||||||
|
_ => (true, None),
|
||||||
|
};
|
||||||
|
if let Some(title) = title {
|
||||||
|
let elem = BytesStart::owned(b"title".to_vec(), 5);
|
||||||
|
writer.write_event(Event::Start(elem)).unwrap();
|
||||||
|
|
||||||
|
let elem = BytesText::from_plain_str(&title);
|
||||||
|
writer.write_event(Event::Text(elem)).unwrap();
|
||||||
|
|
||||||
|
let elem = BytesEnd::owned(b"title".to_vec());
|
||||||
|
writer.write_event(Event::End(elem)).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
let elem = BytesStart::owned(b"style".to_vec(), 5);
|
let elem = BytesStart::owned(b"style".to_vec(), 5);
|
||||||
writer.write_event(Event::Start(elem)).unwrap();
|
writer.write_event(Event::Start(elem)).unwrap();
|
||||||
|
|
||||||
|
@ -155,14 +173,6 @@ pub fn generate_html(album: Result<Album, Error>) -> (u16, Vec<u8>) {
|
||||||
200
|
200
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
let show_details = match err {
|
|
||||||
Error::APIErrors(ref err)
|
|
||||||
if err.errors.len() == 1 && err.errors[0].code == "404" =>
|
|
||||||
{
|
|
||||||
false
|
|
||||||
}
|
|
||||||
_ => true,
|
|
||||||
};
|
|
||||||
let mut elem = BytesStart::owned(b"div".to_vec(), 3);
|
let mut elem = BytesStart::owned(b"div".to_vec(), 3);
|
||||||
if show_details {
|
if show_details {
|
||||||
elem.push_attribute(("style", "text-align: left;"));
|
elem.push_attribute(("style", "text-align: left;"));
|
||||||
|
|
Loading…
Reference in New Issue