84 lines
2.5 KiB
Python
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
|