1
0
mirror of https://github.com/shimunn/aria2xspf.git synced 2023-11-17 09:27:54 +01:00

also convert to html

This commit is contained in:
shimunn
2019-04-14 16:22:58 +02:00
parent 51c1371f46
commit afb1d72700
5 changed files with 221 additions and 23 deletions

View File

@@ -1,6 +1,11 @@
#[macro_use]
extern crate derive_builder;
#[macro_use]
extern crate structopt;
mod opts;
use opts::*;
use std::env;
use std::fs::File;
use std::io::{self, Write};
@@ -16,10 +21,7 @@ struct Track {
impl Track {
fn new(url: String, title: String) -> Track {
Track {
url: url,
title: title,
}
Track { url: url, title: title }
}
fn write_xml<W: Write>(self, w: &mut EventWriter<W>) -> XResult<()> {
w.write(XmlEvent::start_element("track"))?;
@@ -31,15 +33,25 @@ impl Track {
w.write(XmlEvent::end_element())?;
w.write(XmlEvent::end_element())
}
fn write_html<W: Write>(self, w: &mut EventWriter<W>) -> XResult<()> {
w.write(XmlEvent::start_element("p"))?;
w.write(XmlEvent::characters(&self.title))?;
w.write(XmlEvent::end_element())?;
w.write(XmlEvent::start_element("video").attr("controls", ""))?;
w.write(XmlEvent::start_element("source").attr("src", &self.url))?;
w.write(XmlEvent::end_element())?;
w.write(XmlEvent::end_element())
}
}
fn main() {
let file = File::open("VIDs").expect("Failed to open file!");
let mut out = File::create("VIDs.xspf").unwrap();
let mut writer = EmitterConfig::new()
.perform_indent(true)
.create_writer(&mut out);
let opts = Opts::from_args();
let file = File::open(opts.input).expect("Failed to open file!");
let mut out = File::create(opts.output).expect("Failed to open OUTPUT file!");
let mut writer = EmitterConfig::new().perform_indent(true).create_writer(&mut out);
convert(
opts.html,
tracks(
BufReader::new(file)
.lines()
@@ -50,15 +62,24 @@ fn main() {
.expect("Failed to parse");
}
fn convert<I: Iterator<Item = Track>, W: Write>(tracks: I, w: &mut EventWriter<W>) -> XResult<()> {
w.write(
XmlEvent::start_element("playlist")
.ns("", "http://xspf.org/ns/0/")
.ns("vlc", "http://www.videolan.org/vlc/playlist/ns/0/"),
)?;
w.write(XmlEvent::start_element("trackList"))?;
fn convert<I: Iterator<Item = Track>, W: Write>(html: bool, tracks: I, w: &mut EventWriter<W>) -> XResult<()> {
if html {
w.write(XmlEvent::start_element("html"))?;
w.write(XmlEvent::start_element("body"))?;
} else {
w.write(
XmlEvent::start_element("playlist")
.ns("", "http://xspf.org/ns/0/")
.ns("vlc", "http://www.videolan.org/vlc/playlist/ns/0/"),
)?;
w.write(XmlEvent::start_element("trackList"))?;
}
for track in tracks {
track.write_xml(w)?;
if html {
track.write_html(w)?;
} else {
track.write_xml(w)?;
}
}
w.write(XmlEvent::end_element())?;
w.write(XmlEvent::end_element())
@@ -71,12 +92,7 @@ fn tracks<'a, I: Iterator<Item = String> + 'a>(aria: I) -> Box<Iterator<Item = T
builder.url(line);
} else {
if line.starts_with("\tout=") {
builder.title(
line.chars()
.skip_while(|c| c != &'=')
.skip(1)
.collect::<String>(),
);
builder.title(line.chars().skip_while(|c| c != &'=').skip(1).collect::<String>());
let track = Some(builder.build().unwrap());
*builder = TrackBuilder::default();
return Some(track);

18
src/opts.rs Normal file
View File

@@ -0,0 +1,18 @@
pub use std::path::PathBuf;
pub use structopt::StructOpt;
#[derive(StructOpt, Debug)]
#[structopt(name = "aria2xspf")]
pub struct Opts {
/// Emit html instead of xspf
#[structopt(short = "h", long = "html")]
pub html: bool,
/// Aria2 formatted input
#[structopt(name = "IN", parse(from_os_str), default_value = "VIDs")]
pub input: PathBuf,
/// Output
#[structopt(name = "OUT", parse(from_os_str), default_value = "VIDs.xspf")]
pub output: PathBuf,
}