1616
1717RE_AUDIO_ID = re .compile (r'audio(-?\d+)_(\d+)' )
1818RE_ALBUM_ID = re .compile (r'act=audio_playlist(-?\d+)_(\d+)' )
19+ RE_ACCESS_HASH = re .compile (r'access_hash=(\w+)' )
1920
2021TRACKS_PER_USER_PAGE = 50
2122TRACKS_PER_ALBUM_PAGE = 100
@@ -35,19 +36,20 @@ def __init__(self, vk):
3536 self .user_id = vk .method ('users.get' )[0 ]['id' ]
3637 self ._vk = vk
3738
38- def get_iter (self , owner_id = None , album_id = None ):
39+ def get_iter (self , owner_id = None , album_id = None , access_hash = None ):
3940 """ Получить список аудиозаписей пользователя (по частям)
4041
4142 :param owner_id: ID владельца (отрицательные значения для групп)
4243 :param album_id: ID альбома
44+ :param access_hash: ACCESS_HASH альбома
4345 """
4446
4547 if owner_id is None :
4648 owner_id = self .user_id
4749
4850 if album_id is not None :
49- url = 'https://m.vk.com/audio?act=audio_playlist{}_{}' .format (
50- owner_id , album_id
51+ url = 'https://m.vk.com/audio?act=audio_playlist{}_{}&access_hash={} ' .format (
52+ owner_id , album_id , access_hash or ''
5153 )
5254 offset_diff = TRACKS_PER_ALBUM_PAGE
5355 else :
@@ -69,7 +71,11 @@ def get_iter(self, owner_id=None, album_id=None):
6971 'You don\' t have permissions to browse user\' s audio'
7072 )
7173
72- tracks = scrap_data (response .text , self .user_id )
74+ tracks = scrap_data (
75+ response .text ,
76+ self .user_id ,
77+ filter_root_el = {'class_' : 'audioPlaylist__list' } if album_id else None
78+ )
7379
7480 if not tracks :
7581 break
@@ -79,14 +85,15 @@ def get_iter(self, owner_id=None, album_id=None):
7985
8086 offset += offset_diff
8187
82- def get (self , owner_id = None , album_id = None ):
88+ def get (self , owner_id = None , album_id = None , access_hash = None ):
8389 """ Получить список аудиозаписей пользователя
8490
8591 :param owner_id: ID владельца (отрицательные значения для групп)
8692 :param album_id: ID альбома
93+ :param access_hash: ACCESS_HASH альбома
8794 """
8895
89- return list (self .get_iter (owner_id , album_id ))
96+ return list (self .get_iter (owner_id , album_id , access_hash ))
9097
9198 def get_albums_iter (self , owner_id = None ):
9299 """ Получить список альбомов пользователя (по частям)
@@ -255,18 +262,23 @@ def scrap_albums(html):
255262
256263 link = album .select_one ('.audioPlaylistsPage__itemLink' )['href' ]
257264 full_id = tuple (int (i ) for i in RE_ALBUM_ID .search (link ).groups ())
265+ access_hash = RE_ACCESS_HASH .search (link )
258266
259267 stats_text = album .select_one ('.audioPlaylistsPage__stats' ).text
260268
261269 # "1 011 прослушиваний"
262- plays = int (stats_text .rsplit (' ' , 1 )[0 ].replace (' ' , '' ))
270+ try :
271+ plays = int (stats_text .rsplit (' ' , 1 )[0 ].replace (' ' , '' ))
272+ except ValueError :
273+ plays = None
263274
264275 albums .append ({
265276 'id' : full_id [1 ],
266277 'owner_id' : full_id [0 ],
267278 'url' : 'https://m.vk.com/audio?act=audio_playlist{}_{}' .format (
268279 * full_id
269280 ),
281+ 'access_hash' : access_hash .group (1 ) if access_hash else None ,
270282
271283 'title' : album .select_one ('.audioPlaylistsPage__title' ).text ,
272284 'plays' : plays
0 commit comments