from requests import Session from re import match, search from bs4 import BeautifulSoup as bs from os import system, chdir class Teleplay: def __init__(self, url: str) -> None: '''Initialize a teleplay. `url` be like: `https://www.meijuwo.net/play/5940-1-1/`.''' m = match(r'(https://www.meijuwo.net/play/\d+-\d+-)\d+', url) if m: self.base = m.groups()[0] else: raise RuntimeError('Invalid url!') self.x = Session() self.x.headers.update({ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54', 'referer': 'https://www.meijuwo.net/' }) soup = bs(self.x.get(url).text, features="html.parser") playlist = soup.find('ul', {'id': 'playlist'}) self.count = len(playlist.find_all('li')) def fetch(self, volumn: int) -> str: '''Fetch m3u8 url for given volumn.''' assert (1 <= volumn <= self.count), f"Invalid volumn {volumn}, expected integer between 1 and {self.count}." url = self.base + str(volumn) r = self.x.get(url) m = search(r'"url":"(.+)","url_next":"', r.text) if m: api_id = m.groups()[0] else: raise RuntimeError('Argument `api_id` not found!') r = self.x.get('https://api.apiimg.com/dplay/super.php?id=' + api_id) m = search(r'"url": "(.+)",', r.text) if m: m3u8 = m.groups()[0] else: raise RuntimeError('Argument `m3u8` not found!') return m3u8 if __name__ == '__main__': chdir(r'D:\Download') t = Teleplay('https://www.meijuwo.net/play/5940-1-1/') for i in range(1, t.count + 1): m3u8 = t.fetch(i) cmd = f'.\\N_m3u8DL-RE.exe "{m3u8}" --save-name {i:0>2}' print(f"[{i}]>", cmd) system(cmd)