[extractor] added info extractor for CBA (https://cba.fro.at)
This commit is contained in:
parent
f8fd510eb4
commit
ed10b1cfea
105
youtube_dl/extractor/cba.py
Normal file
105
youtube_dl/extractor/cba.py
Normal file
@ -0,0 +1,105 @@
|
||||
# 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,
|
||||
}
|
@ -128,6 +128,7 @@ from .carambatv import (
|
||||
CarambaTVPageIE,
|
||||
)
|
||||
from .cartoonnetwork import CartoonNetworkIE
|
||||
from .cba import CBAIE
|
||||
from .cbc import (
|
||||
CBCIE,
|
||||
CBCPlayerIE,
|
||||
|
@ -3121,3 +3121,11 @@ def decode_png(png_data):
|
||||
current_row.append(color)
|
||||
|
||||
return width, height, pixels
|
||||
|
||||
|
||||
def strip_bom_utf8(s):
|
||||
BOM_UTF8 = u'\ufeff'
|
||||
if s.startswith(BOM_UTF8):
|
||||
return s[len(BOM_UTF8):]
|
||||
|
||||
return s
|
||||
|
Loading…
x
Reference in New Issue
Block a user