|
@ -0,0 +1,49 @@ |
|
|
|
|
|
# coding: utf-8 |
|
|
|
|
|
from __future__ import unicode_literals |
|
|
|
|
|
|
|
|
|
|
|
import calendar |
|
|
|
|
|
import datetime |
|
|
|
|
|
import re |
|
|
|
|
|
|
|
|
|
|
|
from .common import InfoExtractor |
|
|
|
|
|
|
|
|
|
|
|
# audios on fm4.orf.at are only available for 7 days, so we can't |
|
|
|
|
|
# add tests. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FM4IE(InfoExtractor): |
|
|
|
|
|
IE_DESC = 'fm4.orf.at' |
|
|
|
|
|
_VALID_URL = r'http://fm4\.orf\.at/7tage#(?P<date>[0-9]+)/(?P<show>[\w]+)' |
|
|
|
|
|
|
|
|
|
|
|
def _extract_entry_dict(self, info, title, subtitle): |
|
|
|
|
|
result = { |
|
|
|
|
|
'id': info['loopStreamId'].replace('.mp3', ''), |
|
|
|
|
|
'url': 'http://loopstream01.apa.at/?channel=fm4&id=%s' % info['loopStreamId'], |
|
|
|
|
|
'title': title, |
|
|
|
|
|
'description': subtitle, |
|
|
|
|
|
'duration': (info['end'] - info['start']) / 1000, |
|
|
|
|
|
'timestamp': info['start'] / 1000, |
|
|
|
|
|
'ext': 'mp3' |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return result |
|
|
|
|
|
|
|
|
|
|
|
def _real_extract(self, url): |
|
|
|
|
|
mobj = re.match(self._VALID_URL, url) |
|
|
|
|
|
show_date = mobj.group('date') |
|
|
|
|
|
show_id = mobj.group('show') |
|
|
|
|
|
|
|
|
|
|
|
data = self._download_json( |
|
|
|
|
|
'http://audioapi.orf.at/fm4/json/2.0/broadcasts/%s/4%s' % (show_date, show_id), |
|
|
|
|
|
show_id |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
entries = [ self._extract_entry_dict(t, data['title'], data['subtitle']) for t in data['streams']] |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
|
'_type': 'playlist', |
|
|
|
|
|
'id': show_id, |
|
|
|
|
|
'title': data['title'], |
|
|
|
|
|
'description': data['subtitle'], |
|
|
|
|
|
'entries': entries |
|
|
|
|
|
} |