|
|
@ -1,5 +1,4 @@
|
|
|
|
import base64
|
|
|
|
import base64
|
|
|
|
import re
|
|
|
|
|
|
|
|
import urllib.parse
|
|
|
|
import urllib.parse
|
|
|
|
|
|
|
|
|
|
|
|
from .common import InfoExtractor
|
|
|
|
from .common import InfoExtractor
|
|
|
@ -15,6 +14,23 @@ from ..utils import (
|
|
|
|
|
|
|
|
|
|
|
|
class RadikoBaseIE(InfoExtractor):
|
|
|
|
class RadikoBaseIE(InfoExtractor):
|
|
|
|
_FULL_KEY = None
|
|
|
|
_FULL_KEY = None
|
|
|
|
|
|
|
|
_HOSTS_FOR_TIME_FREE_FFMPEG_UNSUPPORTED = (
|
|
|
|
|
|
|
|
'https://c-rpaa.smartstream.ne.jp',
|
|
|
|
|
|
|
|
'https://si-c-radiko.smartstream.ne.jp',
|
|
|
|
|
|
|
|
'https://tf-f-rpaa-radiko.smartstream.ne.jp',
|
|
|
|
|
|
|
|
'https://tf-c-rpaa-radiko.smartstream.ne.jp',
|
|
|
|
|
|
|
|
'https://si-f-radiko.smartstream.ne.jp',
|
|
|
|
|
|
|
|
'https://rpaa.smartstream.ne.jp',
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
_HOSTS_FOR_TIME_FREE_FFMPEG_SUPPORTED = (
|
|
|
|
|
|
|
|
'https://rd-wowza-radiko.radiko-cf.com',
|
|
|
|
|
|
|
|
'https://radiko.jp',
|
|
|
|
|
|
|
|
'https://f-radiko.smartstream.ne.jp',
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
# Following URL forcibly connects not Time Free but Live
|
|
|
|
|
|
|
|
_HOSTS_FOR_LIVE = (
|
|
|
|
|
|
|
|
'https://c-radiko.smartstream.ne.jp',
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def _auth_client(self):
|
|
|
|
def _auth_client(self):
|
|
|
|
_, auth1_handle = self._download_webpage_handle(
|
|
|
|
_, auth1_handle = self._download_webpage_handle(
|
|
|
@ -92,9 +108,9 @@ class RadikoBaseIE(InfoExtractor):
|
|
|
|
formats = []
|
|
|
|
formats = []
|
|
|
|
found = set()
|
|
|
|
found = set()
|
|
|
|
for url_tag in m3u8_urls:
|
|
|
|
for url_tag in m3u8_urls:
|
|
|
|
pcu = url_tag.find('playlist_create_url')
|
|
|
|
pcu = url_tag.find('playlist_create_url').text
|
|
|
|
url_attrib = url_tag.attrib
|
|
|
|
url_attrib = url_tag.attrib
|
|
|
|
playlist_url = update_url_query(pcu.text, {
|
|
|
|
playlist_url = update_url_query(pcu, {
|
|
|
|
'station_id': station,
|
|
|
|
'station_id': station,
|
|
|
|
**query,
|
|
|
|
**query,
|
|
|
|
'l': '15',
|
|
|
|
'l': '15',
|
|
|
@ -117,10 +133,11 @@ class RadikoBaseIE(InfoExtractor):
|
|
|
|
'X-Radiko-AreaId': area_id,
|
|
|
|
'X-Radiko-AreaId': area_id,
|
|
|
|
'X-Radiko-AuthToken': auth_token,
|
|
|
|
'X-Radiko-AuthToken': auth_token,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
not_preferred = is_onair and not pcu.startswith(self._HOSTS_FOR_LIVE) or (not is_onair and (pcu.startswith(self._HOSTS_FOR_TIME_FREE_FFMPEG_UNSUPPORTED) or pcu.startswith(self._HOSTS_FOR_LIVE)))
|
|
|
|
for sf in subformats:
|
|
|
|
for sf in subformats:
|
|
|
|
if re.fullmatch(r'[cf]-radiko\.smartstream\.ne\.jp', domain):
|
|
|
|
if not_preferred:
|
|
|
|
# Prioritize live radio vs playback based on extractor
|
|
|
|
sf['preference'] = -100
|
|
|
|
sf['preference'] = 100 if is_onair else -100
|
|
|
|
sf['format_note'] = 'not preferred'
|
|
|
|
if not is_onair and url_attrib['timefree'] == '1' and time_to_skip:
|
|
|
|
if not is_onair and url_attrib['timefree'] == '1' and time_to_skip:
|
|
|
|
sf['downloader_options'] = {'ffmpeg_args': ['-ss', time_to_skip]}
|
|
|
|
sf['downloader_options'] = {'ffmpeg_args': ['-ss', time_to_skip]}
|
|
|
|
formats.extend(subformats)
|
|
|
|
formats.extend(subformats)
|
|
|
|