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