Hitomi-Downloader/src/extractor/fc2_downloader.py

84 lines
2.5 KiB
Python

import downloader
import ree as re
from utils import urljoin, Downloader, format_filename, Soup, LazyUrl, get_print, Session
from m3u8_tools import M3u8_stream
from io import BytesIO
PATTERN_ID = r'/content/([^/]+)'
class Downloader_fc2(Downloader):
type = 'fc2'
single = True
URLS = ['video.fc2.com']
@classmethod
def fix_url(cls, url):
if not re.match('https?://.+', url, re.IGNORECASE):
url = 'https://video.fc2.com/content/{}'.format(url)
return url
@classmethod
def key_id(cls, url):
return re.find(PATTERN_ID, url) or url
def read(self):
self.session = Session()
self.session.cookies.set('_ac', '1', domain='.video.fc2.com')
info = get_info(self.url, self.session, self.cw)
video = info['videos'][0]
self.urls.append(video.url)
f = BytesIO()
downloader.download(video.url_thumb, referer=self.url, buffer=f)
self.setIcon(f)
self.title = info['title']
class Video:
def __init__(self, url, url_thumb, referer, title, id_, session):
self._url = url
self.url = LazyUrl(referer, self.get, self)
self.filename = format_filename(title, id_, '.mp4')
self.url_thumb = url_thumb
self.session = session
def get(self, referer):
ext = downloader.get_ext(self._url, session=self.session, referer=referer)
if ext == '.m3u8':
video = M3u8_stream(self._url, referer=referer, session=self.session, n_thread=4)
else:
video = self._url
return video
def get_info(url, session, cw=None):
print_ = get_print(cw)
info = {'videos': []}
html = downloader.read_html(url, session=session)
soup = Soup(html)
info['title'] = soup.find('h2', class_='videoCnt_title').text.strip()
id_ = re.find(PATTERN_ID, url, err='no id')
print_('id: {}'.format(id_))
token = re.find(r'''window.FC2VideoObject.push\(\[['"]ae['"], *['"](.+?)['"]''', html, err='no token')
print_('token: {}'.format(token))
url_api = 'https://video.fc2.com/api/v3/videoplaylist/{}?sh=1&fs=0'.format(id_)
hdr = {
'X-FC2-Video-Access-Token': token,
}
data = downloader.read_json(url_api, url, session=session, headers=hdr)
pl = data['playlist']
url_video = urljoin(url, pl.get('hq') or pl.get('nq') or pl['sample']) #3784
url_thumb = soup.find('meta', {'property':'og:image'})['content']
video = Video(url_video, url_thumb, url, info['title'], id_, session)
info['videos'].append(video)
return info