mangadexrs/src/commands/feed.rs

105 lines
3.9 KiB
Rust

use crate::utils;
use std::io::Cursor;
use std::process::exit;
use clap::ArgMatches;
use quick_xml::Writer;
use quick_xml::events::{Event, BytesStart, BytesText, BytesEnd};
extern crate reqwest;
pub async fn feed(arg_m: &ArgMatches<'_>) {
let client = reqwest::Client::new();
let manga_id = arg_m.value_of("id").unwrap();
let languages: Vec<_> = arg_m.values_of("language").unwrap_or_default().collect();
let manga_info = match utils::get_manga(client, manga_id.parse().unwrap()).await {
Ok(Some(manga_info)) => manga_info,
Ok(None) => {
eprintln!("ID: {}\nError: does not exist", &manga_id);
exit(1);
},
Err(err) => {
eprintln!("ID: {}\nError: {}", &manga_id, err);
exit(1);
}
};
let mut writer = Writer::new(Cursor::new(Vec::new()));
{
let mut elem = BytesStart::owned(b"rss".to_vec(), 3);
elem.push_attribute(("version", "2.0"));
writer.write_event(Event::Start(elem)).unwrap();
let elem = BytesStart::owned(b"channel".to_vec(), 7);
writer.write_event(Event::Start(elem)).unwrap();
let elem = BytesStart::owned(b"title".to_vec(), 5);
writer.write_event(Event::Start(elem)).unwrap();
let elem = BytesText::from_plain_str(&manga_info.data.manga.title).into_owned();
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"link".to_vec(), 4);
writer.write_event(Event::Start(elem)).unwrap();
let elem = BytesText::from_plain_str(&format!("https://mangadex.org/title/{}", &manga_id)).into_owned();
writer.write_event(Event::Text(elem)).unwrap();
let elem = BytesEnd::owned(b"link".to_vec());
writer.write_event(Event::End(elem)).unwrap();
let elem = BytesStart::owned(b"description".to_vec(), 11);
writer.write_event(Event::Start(elem)).unwrap();
let elem = BytesText::from_plain_str(&manga_info.data.manga.description).into_owned();
writer.write_event(Event::Text(elem)).unwrap();
let elem = BytesEnd::owned(b"description".to_vec());
writer.write_event(Event::End(elem)).unwrap();
}
for chapter in manga_info.data.chapters {
if !languages.is_empty() && !languages.contains(&chapter.language.as_str()) {
continue;
}
let link = format!("https://mangadex.org/chapter/{}", &chapter.id);
let elem = BytesStart::owned(b"item".to_vec(), 4);
writer.write_event(Event::Start(elem)).unwrap();
let elem = BytesStart::owned(b"title".to_vec(), 5);
writer.write_event(Event::Start(elem)).unwrap();
let mut title = chapter.to_string();
if Some(chapter.chapter.clone()) == manga_info.data.manga.last_chapter {
title.push_str(" [END]");
}
let elem = BytesText::from_plain_str(&title).into_owned();
writer.write_event(Event::Text(elem)).unwrap();
let elem = BytesEnd::owned(b"title".to_vec());
writer.write_event(Event::End(elem)).unwrap();
let mut elem = BytesStart::owned(b"guid".to_vec(), 4);
elem.push_attribute(("isPermaLink", "true"));
writer.write_event(Event::Start(elem)).unwrap();
let elem = BytesText::from_plain_str(&link).into_owned();
writer.write_event(Event::Text(elem)).unwrap();
let elem = BytesEnd::owned(b"guid".to_vec());
writer.write_event(Event::End(elem)).unwrap();
let elem = BytesEnd::owned(b"item".to_vec());
writer.write_event(Event::End(elem)).unwrap();
}
let elem = BytesEnd::owned(b"channel".to_vec());
writer.write_event(Event::End(elem)).unwrap();
let elem = BytesEnd::owned(b"rss".to_vec());
writer.write_event(Event::End(elem)).unwrap();
println!("{}", String::from_utf8(writer.into_inner().into_inner()).unwrap());
}