twitch-hls-client 1.3.4

Minimal CLI client for watching/recording Twitch streams
use std::{
    fs::File,
    io::{self, Write},
};

use anyhow::Result;
use log::info;

use crate::args::{ArgParser, Parser};

#[derive(Default, Debug)]
pub struct Args {
    path: Option<String>,
    overwrite: bool,
}

impl ArgParser for Args {
    fn parse(&mut self, parser: &mut Parser) -> Result<()> {
        parser.parse_fn_cfg(&mut self.path, "-r", "record", Parser::parse_opt_string)?;
        parser.parse_switch(&mut self.overwrite, "--overwrite")?;

        Ok(())
    }
}

pub struct Recorder {
    file: File,
}

impl Write for Recorder {
    fn write(&mut self, _buf: &[u8]) -> io::Result<usize> {
        unimplemented!();
    }

    fn flush(&mut self) -> io::Result<()> {
        unimplemented!();
    }

    fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
        self.file.write_all(buf)
    }
}

impl Recorder {
    pub fn new(args: &Args) -> Result<Option<Self>> {
        let Some(ref path) = args.path else {
            return Ok(None);
        };

        info!("Recording to: {path}");
        if args.overwrite {
            return Ok(Some(Self {
                file: File::create(path)?,
            }));
        }

        Ok(Some(Self {
            file: File::options().write(true).create_new(true).open(path)?,
        }))
    }
}