Skip to content

Commit 74d15bb

Browse files
committed
audio links added
1 parent 1372910 commit 74d15bb

3 files changed

Lines changed: 87 additions & 2 deletions

File tree

examples/get_all_audio.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def main():
4949
print('\nSearch for ', most_common)
5050
tracks = vkaudio.search(q=most_common)
5151
for n, track in enumerate(tracks[:10]):
52-
print('{}. {}'.format(n+1, track['title']))
52+
print('{}. {}\nURL: {}'.format(n+1, track['title'], track['url']))
5353

5454
if __name__ == '__main__':
5555
main()

vk_api/vk_audio.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
# -*- coding: utf-8 -*-
12
from bs4 import BeautifulSoup
23
import re
4+
from .vk_audio_decoder import decode
35
from .exceptions import AccessDenied
46

57
RE_VALUE = re.compile(r'>(.*?)<')
@@ -46,9 +48,12 @@ def scrap_data(html):
4648
for audio in soup.find_all("div", {"class": "audio_item ai_has_btn"}):
4749
ai_artist = audio.select('.ai_artist')
4850
artist = ai_artist[0].text
51+
link = audio.select('.ai_body')[0].input['value']
52+
url = decode(link)
4953
data = {'artist': artist,
5054
'title': value(audio.select('.ai_title')),
5155
'dur': value(audio.select('.ai_dur'), duration=True),
52-
'id': audio['id']}
56+
'id': audio['id'],
57+
'url': url}
5358
songs.append(data)
5459
return songs

vk_api/vk_audio_decoder.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# -*- coding: utf-8 -*-
2+
vk_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/="
3+
4+
5+
def decode(string):
6+
vals = string.split("?extra=")[1].split("#")
7+
tstr = vk_o(vals[0])
8+
ops = vk_o(vals[1])
9+
ops_arr = ops.split(chr(9))
10+
llen = len(ops_arr)
11+
i = llen - 1
12+
while i >= 0:
13+
args_arr = ops_arr[i].split(chr(11))
14+
op_ind = args_arr.pop(0)
15+
if op_ind == 'v':
16+
tstr = vk_v(tstr)
17+
elif op_ind == 'r':
18+
tstr = vk_r(tstr, args_arr[0])
19+
elif op_ind == 'x':
20+
tstr = vk_x(tstr, args_arr[0])
21+
i -= 1
22+
return tstr
23+
24+
25+
def vk_o(string):
26+
global vk_str
27+
llen = len(string)
28+
result = ""
29+
s = 0
30+
index2 = 0
31+
while s < llen:
32+
sym_index = vk_str.find(string[s])
33+
if sym_index != -1:
34+
if index2 % 4 != 0:
35+
i = (i << 6) + sym_index
36+
else:
37+
i = sym_index
38+
if index2 % 4 != 0:
39+
index2 += 1
40+
shift = -2 * index2 & 6
41+
result += chr(0xFF & (i >> shift))
42+
else:
43+
index2 += 1
44+
s += 1
45+
return result
46+
47+
48+
def vk_v(string):
49+
return string[::-1]
50+
51+
52+
def vk_r(string, i):
53+
global vk_str
54+
vk_str2 = vk_str + vk_str
55+
vk_str2_len = len(vk_str2)
56+
llen = len(string)
57+
result = ""
58+
s = 0
59+
while s < llen:
60+
index = vk_str2.find(string[s])
61+
if index != -1:
62+
offset = index-int(i)
63+
if offset < 0:
64+
offset += vk_str2_len
65+
result += vk_str2[offset]
66+
else:
67+
result += string[s]
68+
s += 1
69+
return result
70+
71+
72+
def vk_x(string, i):
73+
xor_val = ord(i[0])
74+
str_len = len(string)
75+
result = ""
76+
i = 0
77+
while i < str_len:
78+
result += chr(ord(string[i]) ^ xor_val)
79+
i += 1
80+
return result

0 commit comments

Comments
 (0)