Skip to content

Commit cca24ea

Browse files
committed
Add support for downloading Music Albums
1 parent 15f555b commit cca24ea

2 files changed

Lines changed: 70 additions & 5 deletions

File tree

examples/get_album_audio.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# -*- coding: utf-8 -*-
2+
import collections
3+
4+
import vk_api
5+
from vk_api.audio import VkAudio
6+
7+
8+
def main():
9+
""" Пример составления топа исполнителей для альбома вк """
10+
11+
login, password = 'login', 'password'
12+
vk_session = vk_api.VkApi(login, password)
13+
14+
try:
15+
vk_session.auth()
16+
except vk_api.AuthError as error_msg:
17+
print(error_msg)
18+
return
19+
20+
vkaudio = VkAudio(vk_session)
21+
22+
artists = collections.Counter()
23+
24+
offset = 0
25+
26+
while True:
27+
audios = vkaudio.get(album_id='-89975290_74038117', offset=offset)
28+
29+
if not audios:
30+
break
31+
32+
for audio in audios:
33+
artists[audio['artist']] += 1
34+
35+
offset += len(audios)
36+
37+
# Составляем рейтинг первых 15
38+
print('\nTop 15:')
39+
for artist, tracks in artists.most_common(15):
40+
print('{} - {} tracks'.format(artist, tracks))
41+
42+
# Ищем треки самого популярного
43+
most_common_artist = artists.most_common(1)[0][0]
44+
45+
print('\nSearch for', most_common_artist)
46+
47+
tracks = vkaudio.search(q=most_common_artist)[:10]
48+
49+
for n, track in enumerate(tracks, 1):
50+
print('{}. {} {}'.format(n, track['title'], track['url']))
51+
52+
53+
if __name__ == '__main__':
54+
main()

vk_api/audio.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,27 @@ class VkAudio:
1616
def __init__(self, vk):
1717
self._vk = vk
1818

19-
def get(self, owner_id, offset=0):
19+
def get(self, owner_id=None, album_id=None, offset=0):
2020
""" Получить список аудиозаписей пользователя
2121
2222
:param owner_id: ID владельца (отрицательные значения для групп)
23+
:param album_id: ID альбома (отрицательные значения для групп)
2324
:param offset: смещение
2425
"""
2526

27+
if owner_id is None and album_id is None:
28+
raise TypeError("get() missing 1 required argument: 'album_id' or 'owner_id'")
29+
elif owner_id is not None and album_id is not None:
30+
raise TypeError("get() too many arguments")
31+
32+
id = owner_id
33+
url = "https://m.vk.com/audios{}"
34+
if album_id is not None:
35+
id = album_id
36+
url = "https://m.vk.com/audio?act=audio_playlist{}"
37+
2638
response = self._vk.http.get(
27-
'https://m.vk.com/audios{}'.format(owner_id),
39+
url.format(id),
2840
params={
2941
'offset': offset
3042
},
@@ -34,7 +46,7 @@ def get(self, owner_id, offset=0):
3446
if not response.text:
3547
raise AccessDenied(
3648
'You don\'t have permissions to browse {}\'s audio'.format(
37-
owner_id
49+
id
3850
)
3951
)
4052

@@ -92,8 +104,7 @@ def scrap_data(html):
92104

93105
soup = BeautifulSoup(html, 'html.parser')
94106
tracks = []
95-
96-
for audio in soup.find_all('div', {'class': 'audio_item ai_has_btn'}):
107+
for audio in soup.find_all('div', {'class': 'audio_item'}):
97108
ai_artist = audio.select('.ai_artist')
98109
artist = ai_artist[0].text
99110
link = audio.select('.ai_body')[0].input['value']

0 commit comments

Comments
 (0)