]> jfr.im git - yt-dlp.git/blame - yt_dlp/extractor/palcomp3.py
[ie/youtube] Extract upload timestamp if available (#9856)
[yt-dlp.git] / yt_dlp / extractor / palcomp3.py
CommitLineData
39ed931e 1from .common import InfoExtractor
2from ..compat import compat_str
3from ..utils import (
4 int_or_none,
5 str_or_none,
6 try_get,
7)
8
9
10class PalcoMP3BaseIE(InfoExtractor):
11 _GQL_QUERY_TMPL = '''{
12 artist(slug: "%s") {
13 %s
14 }
15}'''
16 _ARTIST_FIELDS_TMPL = '''music(slug: "%%s") {
17 %s
18 }'''
19 _MUSIC_FIELDS = '''duration
20 hls
21 mp3File
22 musicID
23 plays
24 title'''
25
26 def _call_api(self, artist_slug, artist_fields):
27 return self._download_json(
28 'https://www.palcomp3.com.br/graphql/', artist_slug, query={
29 'query': self._GQL_QUERY_TMPL % (artist_slug, artist_fields),
30 })['data']
31
32 def _parse_music(self, music):
33 music_id = compat_str(music['musicID'])
34 title = music['title']
35
36 formats = []
37 hls_url = music.get('hls')
38 if hls_url:
39 formats.append({
40 'url': hls_url,
41 'protocol': 'm3u8_native',
42 'ext': 'mp4',
43 })
44 mp3_file = music.get('mp3File')
45 if mp3_file:
46 formats.append({
47 'url': mp3_file,
48 })
49
50 return {
51 'id': music_id,
52 'title': title,
53 'formats': formats,
54 'duration': int_or_none(music.get('duration')),
55 'view_count': int_or_none(music.get('plays')),
56 }
57
58 def _real_initialize(self):
59 self._ARTIST_FIELDS_TMPL = self._ARTIST_FIELDS_TMPL % self._MUSIC_FIELDS
60
61 def _real_extract(self, url):
5ad28e7f 62 artist_slug, music_slug = self._match_valid_url(url).groups()
39ed931e 63 artist_fields = self._ARTIST_FIELDS_TMPL % music_slug
64 music = self._call_api(artist_slug, artist_fields)['artist']['music']
65 return self._parse_music(music)
66
67
68class PalcoMP3IE(PalcoMP3BaseIE):
69 IE_NAME = 'PalcoMP3:song'
70 _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<artist>[^/]+)/(?P<id>[^/?&#]+)'
71 _TESTS = [{
72 'url': 'https://www.palcomp3.com/maiaraemaraisaoficial/nossas-composicoes-cuida-bem-dela/',
73 'md5': '99fd6405b2d8fd589670f6db1ba3b358',
74 'info_dict': {
75 'id': '3162927',
76 'ext': 'mp3',
77 'title': 'Nossas Composições - CUIDA BEM DELA',
78 'duration': 210,
79 'view_count': int,
80 }
81 }]
82
83 @classmethod
84 def suitable(cls, url):
85 return False if PalcoMP3VideoIE.suitable(url) else super(PalcoMP3IE, cls).suitable(url)
86
87
88class PalcoMP3ArtistIE(PalcoMP3BaseIE):
89 IE_NAME = 'PalcoMP3:artist'
90 _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<id>[^/?&#]+)'
91 _TESTS = [{
92 'url': 'https://www.palcomp3.com.br/condedoforro/',
93 'info_dict': {
94 'id': '358396',
95 'title': 'Conde do Forró',
96 },
97 'playlist_mincount': 188,
98 }]
99 _ARTIST_FIELDS_TMPL = '''artistID
100 musics {
101 nodes {
102 %s
103 }
104 }
105 name'''
106
b5ae35ee 107 @classmethod
39ed931e 108 def suitable(cls, url):
5ad28e7f 109 return False if PalcoMP3IE._match_valid_url(url) else super(PalcoMP3ArtistIE, cls).suitable(url)
39ed931e 110
111 def _real_extract(self, url):
112 artist_slug = self._match_id(url)
113 artist = self._call_api(artist_slug, self._ARTIST_FIELDS_TMPL)['artist']
114
115 def entries():
116 for music in (try_get(artist, lambda x: x['musics']['nodes'], list) or []):
117 yield self._parse_music(music)
118
119 return self.playlist_result(
120 entries(), str_or_none(artist.get('artistID')), artist.get('name'))
121
122
123class PalcoMP3VideoIE(PalcoMP3BaseIE):
124 IE_NAME = 'PalcoMP3:video'
125 _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<artist>[^/]+)/(?P<id>[^/?&#]+)/?#clipe'
126 _TESTS = [{
127 'url': 'https://www.palcomp3.com/maiaraemaraisaoficial/maiara-e-maraisa-voce-faz-falta-aqui-ao-vivo-em-vicosa-mg/#clipe',
128 'add_ie': ['Youtube'],
129 'info_dict': {
130 'id': '_pD1nR2qqPg',
131 'ext': 'mp4',
132 'title': 'Maiara e Maraisa - Você Faz Falta Aqui - DVD Ao Vivo Em Campo Grande',
133 'description': 'md5:7043342c09a224598e93546e98e49282',
134 'upload_date': '20161107',
135 'uploader_id': 'maiaramaraisaoficial',
136 'uploader': 'Maiara e Maraisa',
137 }
138 }]
139 _MUSIC_FIELDS = 'youtubeID'
140
141 def _parse_music(self, music):
142 youtube_id = music['youtubeID']
143 return self.url_result(youtube_id, 'Youtube', youtube_id)