105 lines
3.9 KiB
Rust
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());
|
|
}
|