Skip to content

Commit 903c771

Browse files
committed
Refactor VkAudio
1 parent 43ead53 commit 903c771

5 files changed

Lines changed: 98 additions & 88 deletions

File tree

examples/get_all_audio.py

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# -*- coding: utf-8 -*-
22
import collections
3+
34
import vk_api
5+
from vk_api.audio import VKAudio
46

57

68
def main():
@@ -15,41 +17,37 @@ def main():
1517
print(error_msg)
1618
return
1719

18-
vkaudio = vk_session.get_audio()
19-
20-
"""
21-
VkApi.audio.get и VkApi.audio.search делает запросы к странице m.vk.com
22-
и извлекает информацию из html. Необходимый параметр для метода search - 'q',
23-
а для get - 'owner_id'. Параметр offset принимает стандартное значение - 0.
24-
Здесь мы получим все аудиозаписи пользователя в цикле с использованием параметра offset
25-
и составим рейтинг самых популярных исполнителей для данного профиля.
26-
Ниже мы выведем список из 10 песен самого популярного
27-
"""
20+
vkaudio = VKAudio(vk_session)
2821

29-
count = 0
3022
artists = collections.Counter()
23+
24+
offset = 0
25+
3126
while True:
32-
audios = vkaudio.get(owner_id=-99463083, offset=count)
33-
print('offset=', count)
27+
audios = vkaudio.get(owner_id=-99463083, offset=offset)
28+
29+
if not audios:
30+
break
31+
3432
for audio in audios:
3533
artists[audio['artist']] += 1
3634

37-
count += len(audios)
35+
offset += len(audios)
3836

39-
if len(audios) == 0:
40-
break
41-
42-
# состаляем рейтинг первых 15
37+
# Составляем рейтинг первых 15
4338
print('\nTop 15:')
4439
for artist, tracks in artists.most_common(15):
45-
print('{} - {} tracks added'.format(artist, tracks))
46-
47-
# ищем треки самого популярного
48-
most_common = artists.most_common(1)[0][0]
49-
print('\nSearch for ', most_common)
50-
tracks = vkaudio.search(q=most_common)
51-
for n, track in enumerate(tracks[:10]):
52-
print('{}. {}\nURL: {}'.format(n+1, track['title'], track['url']))
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']))
5351

5452
if __name__ == '__main__':
5553
main()

vk_api/audio.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# -*- coding: utf-8 -*-
2+
from bs4 import BeautifulSoup
3+
4+
from .exceptions import AccessDenied
5+
6+
7+
class VKAudio:
8+
def __init__(self, vk):
9+
self._vk = vk
10+
11+
def get(self, owner_id, offset=0):
12+
""" Получение списка аудиозаписей пользователя
13+
14+
:param owner_id: ID владельца (отрицательные значения для групп)
15+
:param offset: смещение
16+
"""
17+
18+
response = self._vk.http.get(
19+
'https://m.vk.com/audios{}'.format(owner_id),
20+
params={
21+
'offset': offset
22+
},
23+
allow_redirects=False
24+
)
25+
26+
if not response.text:
27+
raise AccessDenied(
28+
'You don\'t have permissions to browse {}\'s audio'.format(
29+
owner_id
30+
)
31+
)
32+
33+
return scrap_data(response.text)
34+
35+
def search(self, q='', offset=0):
36+
""" Поиск аудиозаписей
37+
38+
:param q: запрос
39+
:param offset: смещение
40+
"""
41+
42+
response = self._vk.http.get(
43+
'https://m.vk.com/audio',
44+
params={
45+
'act': 'search',
46+
'q': q,
47+
'offset': offset
48+
}
49+
)
50+
51+
return scrap_data(response.text)
52+
53+
54+
def scrap_data(html):
55+
""" Парсинг списка аудиозаписей """
56+
57+
soup = BeautifulSoup(html, 'html.parser')
58+
tracks = []
59+
60+
for audio in soup.find_all('div', {'class': 'audio_item ai_has_btn'}):
61+
ai_artist = audio.select('.ai_artist')
62+
artist = ai_artist[0].text
63+
link = audio.select('.ai_body')[0].input['value']
64+
65+
tracks.append({
66+
'artist': artist,
67+
'title': audio.select('.ai_title')[0].text,
68+
'dur': audio.select('.ai_dur')[0]['data-dur'],
69+
'id': audio['id'],
70+
'url': link
71+
})
72+
73+
return tracks

vk_api/exceptions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class VkApiError(Exception):
1515
pass
1616

1717

18-
class AccessDenied (VkApiError):
18+
class AccessDenied(VkApiError):
1919
pass
2020

2121

vk_api/vk_api.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import requests
1515

1616
import jconfig
17-
from vk_api.vk_audio import VKAudio
1817
from .exceptions import *
1918
from .utils import code_from_number, search_re, clean_string
2019

@@ -378,9 +377,6 @@ def auth_handler(self):
378377
def get_api(self):
379378
return VkApiMethod(self)
380379

381-
def get_audio(self):
382-
return VKAudio(self)
383-
384380
def method(self, method, values=None, captcha_sid=None, captcha_key=None, raw=False):
385381
""" Использование методов API
386382

vk_api/vk_audio.py

Lines changed: 0 additions & 57 deletions
This file was deleted.

0 commit comments

Comments
 (0)