[piapro] Add extractor (#2801)

Based on https://github.com/ytdl-org/youtube-dl/pull/25922
Closes #2710, https://github.com/ytdl-org/youtube-dl/issues/5856

Authored by: pycabbage, Lesmiscore
This commit is contained in:
Lesmiscore (Naoya Ozaki) 2022-02-18 02:15:29 +09:00 committed by GitHub
parent ae419aa94f
commit 6bb608d055
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 101 additions and 0 deletions

View file

@ -1162,6 +1162,7 @@ from .periscope import (
from .philharmoniedeparis import PhilharmonieDeParisIE from .philharmoniedeparis import PhilharmonieDeParisIE
from .phoenix import PhoenixIE from .phoenix import PhoenixIE
from .photobucket import PhotobucketIE from .photobucket import PhotobucketIE
from .piapro import PiaproIE
from .picarto import ( from .picarto import (
PicartoIE, PicartoIE,
PicartoVodIE, PicartoVodIE,

100
yt_dlp/extractor/piapro.py Normal file
View file

@ -0,0 +1,100 @@
# coding: utf-8
from __future__ import unicode_literals
from .common import InfoExtractor
from ..compat import compat_urlparse
from ..utils import (
ExtractorError,
parse_duration,
parse_filesize,
str_to_int,
unified_timestamp,
urlencode_postdata,
)
class PiaproIE(InfoExtractor):
_NETRC_MACHINE = 'piapro'
_VALID_URL = r'https?://piapro\.jp/t/(?P<id>\w+)/?'
_TESTS = [{
'url': 'https://piapro.jp/t/NXYR',
'md5': 'a9d52f27d13bafab7ee34116a7dcfa77',
'info_dict': {
'id': 'NXYR',
'ext': 'mp3',
'uploader': 'wowaka',
'uploader_id': 'wowaka',
'title': '裏表ラバーズ',
'thumbnail': r're:^https?://.*\.jpg$',
}
}]
def _real_initialize(self):
self._login_status = self._login()
def _login(self):
username, password = self._get_login_info()
if not username:
return False
login_ok = True
login_form_strs = {
'_username': username,
'_password': password,
'_remember_me': 'on',
'login': 'ログイン'
}
self._request_webpage('https://piapro.jp/login/', None)
urlh = self._request_webpage(
'https://piapro.jp/login/exe', None,
note='Logging in', errnote='Unable to log in',
data=urlencode_postdata(login_form_strs))
if urlh is False:
login_ok = False
else:
parts = compat_urlparse.urlparse(urlh.geturl())
if parts.path != '/':
login_ok = False
if not login_ok:
self.report_warning(
'unable to log in: bad username or password')
return login_ok
def _real_extract(self, url):
video_id = self._match_id(url)
webpage = self._download_webpage(url, video_id)
category_id = self._search_regex(r'categoryId=(.+)">', webpage, 'category ID')
if category_id not in ('1', '2', '21', '22', '23', '24', '25'):
raise ExtractorError('The URL does not contain audio.', expected=True)
str_duration, str_filesize = self._search_regex(
r'サイズ:</span>(.+?)/\(([0-9,]+?[KMG]?B)', webpage, 'duration and size',
group=(1, 2), default=(None, None))
str_viewcount = self._search_regex(r'閲覧数:</span>([0-9,]+)\s+', webpage, 'view count', fatal=False)
uploader_id, uploader = self._search_regex(
r'<a\s+class="cd_user-name"\s+href="/(.*)">([^<]+)さん<', webpage, 'uploader',
group=(1, 2), default=(None, None))
content_id = self._search_regex(r'contentId\:\'(.+)\'', webpage, 'content ID')
create_date = self._search_regex(r'createDate\:\'(.+)\'', webpage, 'timestamp')
player_webpage = self._download_webpage(
f'https://piapro.jp/html5_player_popup/?id={content_id}&cdate={create_date}',
video_id, note='Downloading player webpage')
return {
'id': video_id,
'title': self._html_search_regex(r'<h1\s+class="cd_works-title">(.+?)</h1>', webpage, 'title', fatal=False),
'description': self._html_search_regex(r'<p\s+class="cd_dtl_cap">(.+?)</p>\s*<div', webpage, 'description', fatal=False),
'uploader': uploader,
'uploader_id': uploader_id,
'timestamp': unified_timestamp(create_date, False),
'duration': parse_duration(str_duration),
'view_count': str_to_int(str_viewcount),
'thumbnail': self._html_search_meta('twitter:image', webpage),
'filesize_approx': parse_filesize(str_filesize.replace(',', '')),
'url': self._search_regex(r'mp3:\s*\'(.*?)\'\}', player_webpage, 'url'),
'ext': 'mp3',
'vcodec': 'none',
}