106 lines
3.8 KiB
Python
106 lines
3.8 KiB
Python
|
# coding: utf-8
|
|||
|
from __future__ import unicode_literals
|
|||
|
|
|||
|
import datetime
|
|||
|
import os
|
|||
|
|
|||
|
from .common import InfoExtractor
|
|||
|
from ..utils import (
|
|||
|
clean_html,
|
|||
|
ExtractorError,
|
|||
|
strip_bom_utf8,
|
|||
|
RegexNotFoundError,
|
|||
|
UnavailableVideoError,
|
|||
|
update_url_query,
|
|||
|
)
|
|||
|
|
|||
|
class CBAIE(InfoExtractor):
|
|||
|
IE_NAME = 'cba'
|
|||
|
IE_DESC = 'cultural broadcasting archive'
|
|||
|
_VALID_URL = r'https?://(?:www\.)?cba\.fro\.at/(?P<id>[0-9]+)'
|
|||
|
_TEST = {
|
|||
|
'url': 'https://cba.fro.at/320619',
|
|||
|
'md5': 'e40379688fcc5e95d6d8a482bb665b02',
|
|||
|
'info_dict': {
|
|||
|
'id': '320619',
|
|||
|
'ext': 'mp3',
|
|||
|
'title': 'Radio Netwatcher Classics vom 15.7.2016 – Peter Pilz, Sicherheitssprecher Grüne über die nationale Entwicklung zum Überwachungsstaat',
|
|||
|
'url': 'https://cba.fro.at/wp-content/uploads/radio_netwatcher/netwatcher-20160715.mp3',
|
|||
|
}
|
|||
|
}
|
|||
|
_FORMATS = {
|
|||
|
'audio/ogg': {'id': '1', 'ext': 'ogg', 'preference': 100},
|
|||
|
'audio/mpeg': {'id': '2', 'ext': 'mp3', 'preference': 50}
|
|||
|
}
|
|||
|
_API_KEY = None
|
|||
|
|
|||
|
def __init__(self, *args, **kwargs):
|
|||
|
try:
|
|||
|
self._API_KEY = os.environ["CBA_API_KEY"]
|
|||
|
except KeyError:
|
|||
|
pass
|
|||
|
|
|||
|
def _add_optional_parameter(self, formats, name, data, key, convert=None):
|
|||
|
try:
|
|||
|
param = data[key]
|
|||
|
if convert:
|
|||
|
param = convert(param)
|
|||
|
formats[name] = param
|
|||
|
except KeyError:
|
|||
|
pass
|
|||
|
|
|||
|
def _real_extract(self, url):
|
|||
|
video_id = self._match_id(url)
|
|||
|
api_posts_url = "https://cba.fro.at/wp-json/wp/v2/posts/%s" % video_id
|
|||
|
api_media_url = "https://cba.fro.at/wp-json/wp/v2/media?media_type=audio&parent=%s" % video_id
|
|||
|
|
|||
|
title = 'unknown'
|
|||
|
description = ''
|
|||
|
formats = []
|
|||
|
|
|||
|
posts_result = self._download_json(api_posts_url, video_id, 'query posts api-endpoint',
|
|||
|
'unable to query posts api-endpoint', transform_source=strip_bom_utf8)
|
|||
|
try:
|
|||
|
title = clean_html(posts_result['title']['rendered'])
|
|||
|
description = clean_html(posts_result['content']['rendered'])
|
|||
|
except KeyError:
|
|||
|
pass
|
|||
|
|
|||
|
api_key_str = " (without API_KEY)"
|
|||
|
if self._API_KEY:
|
|||
|
api_key_str = " (using API_KEY '%s')" % self._API_KEY
|
|||
|
api_media_url = update_url_query(api_media_url, {'c': self._API_KEY})
|
|||
|
|
|||
|
media_result = self._download_json(api_media_url, video_id, 'query media api-endpoint%s' % api_key_str,
|
|||
|
'unable to qeury media api-endpoint%s' % api_key_str, transform_source=strip_bom_utf8)
|
|||
|
for media in media_result:
|
|||
|
try:
|
|||
|
url = media['source_url']
|
|||
|
if url == "":
|
|||
|
continue
|
|||
|
|
|||
|
ft = media['mime_type']
|
|||
|
f = { 'url': url, 'format': ft, 'format_id': self._FORMATS[ft]['id'], 'preference': self._FORMATS[ft]['preference'] }
|
|||
|
self._add_optional_parameter(f, 'filesize', media['media_details'], 'filesize')
|
|||
|
self._add_optional_parameter(f, 'abr', media['media_details'], 'bitrate', lambda x: x/1000)
|
|||
|
self._add_optional_parameter(f, 'asr', media['media_details'], 'sample_rate')
|
|||
|
|
|||
|
formats.append(f)
|
|||
|
except KeyError:
|
|||
|
pass
|
|||
|
|
|||
|
if len(formats) == 0:
|
|||
|
if self._API_KEY:
|
|||
|
raise ExtractorError('unable to fetch CBA entry')
|
|||
|
else:
|
|||
|
raise UnavailableVideoError('you may need an API key to download copyright protected files')
|
|||
|
|
|||
|
self._sort_formats(formats)
|
|||
|
|
|||
|
return {
|
|||
|
'id': video_id,
|
|||
|
'title': title,
|
|||
|
'description': description,
|
|||
|
'formats': formats,
|
|||
|
}
|