mirror of
https://codeberg.org/polarisfm/youtube-dl
synced 2024-11-26 10:24:33 +01:00
[putio] Added PutIo extractor
This commit is contained in:
parent
393cc31d5e
commit
16bdaf52c1
@ -894,6 +894,7 @@ from .presstv import PressTVIE
|
|||||||
from .promptfile import PromptFileIE
|
from .promptfile import PromptFileIE
|
||||||
from .prosiebensat1 import ProSiebenSat1IE
|
from .prosiebensat1 import ProSiebenSat1IE
|
||||||
from .puls4 import Puls4IE
|
from .puls4 import Puls4IE
|
||||||
|
from .putio import PutIoIE
|
||||||
from .pyvideo import PyvideoIE
|
from .pyvideo import PyvideoIE
|
||||||
from .qqmusic import (
|
from .qqmusic import (
|
||||||
QQMusicIE,
|
QQMusicIE,
|
||||||
|
69
youtube_dl/extractor/putio.py
Normal file
69
youtube_dl/extractor/putio.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
# coding: utf-8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
from youtube_dl.utils import HEADRequest, UnsupportedError, unified_strdate
|
||||||
|
from .common import InfoExtractor
|
||||||
|
from ..compat import (
|
||||||
|
compat_str,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class PutIoIE(InfoExtractor):
|
||||||
|
_VALID_URL = r'https?://(?:www\.)?api\.put\.io/v[0-9]+/files/(?P<id>[0-9]+)'
|
||||||
|
_TESTS = [{
|
||||||
|
'url': 'https://app.put.io/files/638463831',
|
||||||
|
'only_matching': True,
|
||||||
|
}, {
|
||||||
|
'url': 'https://api.put.io/v2/files/638474942/download',
|
||||||
|
'only_matching': True,
|
||||||
|
}, {
|
||||||
|
'url': 'https://api.put.io/v2/files/638441619/stream',
|
||||||
|
'only_matching': True,
|
||||||
|
}]
|
||||||
|
|
||||||
|
def _real_extract(self, url):
|
||||||
|
video_id = self._match_id(url)
|
||||||
|
self.to_screen('%s: Getting info for file' % video_id)
|
||||||
|
|
||||||
|
head_req = HEADRequest(url)
|
||||||
|
head_response = self._request_webpage(head_req, video_id, fatal=True)
|
||||||
|
resolved_url = compat_str(head_response.geturl())
|
||||||
|
if url == resolved_url:
|
||||||
|
# we expect a redirect, so if there is none, this URL is invalid
|
||||||
|
raise UnsupportedError(url)
|
||||||
|
|
||||||
|
disposition = head_response.headers.get('Content-Disposition')
|
||||||
|
mobj = re.match(r'.*?filename="(?P<title>[^"]+)".*?', disposition)
|
||||||
|
title = mobj.group('title') or video_id
|
||||||
|
|
||||||
|
info_dict = {
|
||||||
|
'id': video_id,
|
||||||
|
'title': title,
|
||||||
|
'upload_date': unified_strdate(head_response.headers.get('Last-Modified'))
|
||||||
|
}
|
||||||
|
|
||||||
|
# match supported types only, since a URL can point to any type of file
|
||||||
|
content_type = head_response.headers.get('Content-Type', '').lower()
|
||||||
|
m = re.match(
|
||||||
|
r'^(?P<type>audio|video|application(?=/(?:ogg$|(?:vnd\.apple\.|x-)?mpegurl)))/(?P<format_id>[^;\s]+)',
|
||||||
|
content_type)
|
||||||
|
if m:
|
||||||
|
format_id = compat_str(m.group('format_id'))
|
||||||
|
if format_id.endswith('mpegurl'):
|
||||||
|
formats = self._extract_m3u8_formats(resolved_url, video_id, 'mp4')
|
||||||
|
elif format_id == 'f4m':
|
||||||
|
formats = self._extract_f4m_formats(resolved_url, video_id)
|
||||||
|
else:
|
||||||
|
formats = [{
|
||||||
|
'format_id': format_id,
|
||||||
|
'url': resolved_url,
|
||||||
|
'vcodec': 'none' if m.group('type') == 'audio' else None
|
||||||
|
}]
|
||||||
|
info_dict['direct'] = True
|
||||||
|
self._sort_formats(formats)
|
||||||
|
info_dict['formats'] = formats
|
||||||
|
return info_dict
|
||||||
|
|
||||||
|
raise UnsupportedError(url)
|
Loading…
Reference in New Issue
Block a user