1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use crate::plugins::{
    afreeca::Afreeca, dlive::DLive, douyin::Douyin, douyu::Douyu, huya::Huya, inke::Inke,
    tiktok::TikTok, twitch::Twitch,
};
use crate::utils::error::RsgetError;
use crate::utils::error::StreamError;
use crate::Streamable;
use regex::Regex;

use reqwest;

pub fn get_site(input: &str) -> Result<Box<dyn Streamable + Send>, StreamError> {
    match _get_site(input) {
        Ok(s) => Ok(s),
        Err(StreamError::Rsget(_)) => {
            let res = reqwest::get(input)?;
            let final_url = res.url().as_str();
            _get_site(final_url)
        }
        Err(why) => Err(why),
    }
}

fn _get_site(input: &str) -> Result<Box<dyn Streamable + Send>, StreamError> {
    let re_douyu: Regex = Regex::new(r"^(?:https?://)?(?:www\.)?douyu\.com/[a-zA-Z0-9]+/?")?;
    let re_afreeca: Regex = Regex::new(
        r"^(?:https?://)?(?:www\.)?(?:play\.)?afreecatv.com/[a-zA-Z0-9]+/?(?:/[0-9]+)?",
    )?;
    let re_inke: Regex = Regex::new(r"^(?:https?://)?(?:www\.)?inke\.cn/live\.html\?uid=[0-9]+")?;
    let re_douyin: Regex = Regex::new(r"^(?:https?://)?(?:www\.)?iesdouyin\.com/.*")?;
    let re_tiktok: Regex =
        Regex::new(r"^(?:https?://)?(?:www\.)?(?:m\.)?tiktok\.com/v/(?:[a-zA-Z0-9]+)(?:\.html)?")?;
    let re_huya: Regex = Regex::new(r"^(?:https?://)?(?:www\.)?huya\.com/[a-zA-Z0-9]+")?;
    let re_dlive: Regex = Regex::new(r"^(?:https?://)?(?:www\.)?dlive\.tv/[a-zA-Z0-9]+")?;
    let re_twitch: Regex = Regex::new(r"^(?:https?://)?(?:www\.)?twitch\.tv/([a-zA-Z0-9]+)")?;
    match input {
        url if re_douyu.is_match(url) => Ok(Douyu::new(String::from(url))?),
        url if re_afreeca.is_match(url) => Ok(Afreeca::new(String::from(url))?),
        url if re_inke.is_match(url) => Ok(Inke::new(String::from(url))?),
        url if re_douyin.is_match(url) => Ok(Douyin::new(String::from(url))?),
        url if re_tiktok.is_match(url) => Ok(TikTok::new(String::from(url))?),
        url if re_huya.is_match(url) => Ok(Huya::new(String::from(url))?),
        url if re_dlive.is_match(url) => Ok(DLive::new(String::from(url))?),
        url if re_twitch.is_match(url) => Ok(Twitch::new(String::from(url))?),
        _ => Err(StreamError::Rsget(RsgetError::new("Site not supported."))),
    }
}