From 518f043eb4468958b8da5359eaf06caea5e5f5f5 Mon Sep 17 00:00:00 2001 From: milkiweed Date: Thu, 21 Nov 2019 08:21:39 +0200 Subject: [PATCH] ~audio.py, +utils.py. fixed audio parsing --- vk_api/audio.py | 18 +++++++++++++----- vk_api/utils.py | 11 +++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/vk_api/audio.py b/vk_api/audio.py index 899a2e07..f75725b5 100644 --- a/vk_api/audio.py +++ b/vk_api/audio.py @@ -6,6 +6,7 @@ :copyright: (c) 2019 python273 """ +import json import re from itertools import islice @@ -13,6 +14,7 @@ from .audio_url_decoder import decode_audio_url from .exceptions import AccessDenied +from .utils import search_key RE_AUDIO_ID = re.compile(r'audio(-?\d+)_(\d+)') RE_ALBUM_ID = re.compile(r'act=audio_playlist(-?\d+)_(\d+)') @@ -240,17 +242,23 @@ def scrap_data(html, user_id, filter_root_el=None): artist = audio.select_one('.ai_artist').text title = audio.select_one('.ai_title').text duration = int(audio.select_one('.ai_dur')['data-dur']) - full_id = tuple( - int(i) for i in RE_AUDIO_ID.search(audio['id']).groups() - ) + # full_id = tuple( + # int(i) for i in RE_AUDIO_ID.search(audio['id']).groups() + # ) + + # convert string to python object + audio_data = json.loads(audio["data-audio"]) + # find audio & owner id`s + audio_id = search_key(audio_data, "id") + owner_id = search_key(audio_data, "vk_id") link = audio.select_one('.ai_body').input['value'] if 'audio_api_unavailable' in link: link = decode_audio_url(link, user_id) tracks.append({ - 'id': full_id[1], - 'owner_id': full_id[0], + 'id': audio_id, + 'owner_id': owner_id, 'url': link, 'artist': artist, diff --git a/vk_api/utils.py b/vk_api/utils.py index 82d413c6..02028818 100644 --- a/vk_api/utils.py +++ b/vk_api/utils.py @@ -23,6 +23,17 @@ from cookielib import Cookie +def search_key(data, key): + """ Поиск ключа во вложенном списке из разных структур данных""" + for elem in data: + if isinstance(elem, list): + return search_key(elem, key) + + elif isinstance(elem, dict): + if key in elem.keys(): + return elem[key] + + def search_re(reg, string): """ Поиск по регулярке """ s = reg.search(string)