Skip to content
Closed
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
abc60bc
Измениние VkAudio в соотвествии с изменениями на стороне ВК
qwertyadrian Feb 13, 2020
0e30675
Добавлена обработка ситуации, когда data_audio[13] имеет 6 элементов,…
qwertyadrian Feb 17, 2020
7b9bbe4
В вывозы функций scrap_data из класса VkAudio передается аргумент VkA…
qwertyadrian Feb 17, 2020
5ca54c2
В словарь с информацией о треке добавлен ключ, содержащий список ссыл…
qwertyadrian Feb 17, 2020
3f3a52a
Fixed TypeError
qwertyadrian Feb 17, 2020
62d2514
Отключена отправка плейлистов из поста из-за ненадобности.
qwertyadrian Feb 17, 2020
be2f78f
Увеличение значения TRACKS_PER_USER_PAGE до 100, так как при значении…
qwertyadrian Mar 9, 2020
775e9ec
Методы класса (кроме get_albums_iter, get_audio_by_id и get_post_audi…
qwertyadrian Jul 5, 2020
523b105
Исправлено некорректное поведение метода get_iter класса VkAudio, есл…
qwertyadrian Jul 5, 2020
3957e58
Добавлен метод для получения обновлений друзей.
qwertyadrian Jul 6, 2020
6ac9002
first commit lol
dashedman Jul 6, 2020
47a8250
Произошел ушиб очка
dashedman Jul 7, 2020
2cbff3d
Merge branch 'audio_patch' into master
dashedman Jul 7, 2020
cef0c7d
Исправлен способ получения популярных и новинок
dashedman Jul 8, 2020
57bebc6
Merge branch 'master' of https://github.com/dashedman/vk_api
dashedman Jul 8, 2020
da65def
ctrl+s забыл нажать
dashedman Jul 8, 2020
509fac5
fix infinite loop in audio search
dashedman May 3, 2021
493207e
Merge branch 'master' into master
dashedman May 3, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 47 additions & 76 deletions vk_api/audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
:copyright: (c) 2019 python273
"""

from pprint import pprint

import re
import json
import time
Expand All @@ -31,7 +33,6 @@

class VkAudio(object):
""" Модуль для получения аудиозаписей без использования официального API.

:param vk: Объект :class:`VkApi`
"""

Expand Down Expand Up @@ -88,7 +89,6 @@ def __init__(self, vk, convert_m3u8_links=True):

def get_iter(self, owner_id=None, album_id=None, access_hash=None):
""" Получить список аудиозаписей пользователя (по частям)

:param owner_id: ID владельца (отрицательные значения для групп)
:param album_id: ID альбома
:param access_hash: ACCESS_HASH альбома
Expand Down Expand Up @@ -128,6 +128,8 @@ def get_iter(self, owner_id=None, album_id=None, access_hash=None):
ids = scrap_ids(
response['data'][0]['list']
)
if not ids:
break

tracks = scrap_tracks(
ids,
Expand All @@ -136,9 +138,6 @@ def get_iter(self, owner_id=None, album_id=None, access_hash=None):
convert_m3u8_links=self.convert_m3u8_links
)

if not tracks:
break

for i in tracks:
yield i

Expand All @@ -149,7 +148,6 @@ def get_iter(self, owner_id=None, album_id=None, access_hash=None):

def get(self, owner_id=None, album_id=None, access_hash=None):
""" Получить список аудиозаписей пользователя

:param owner_id: ID владельца (отрицательные значения для групп)
:param album_id: ID альбома
:param access_hash: ACCESS_HASH альбома
Expand All @@ -159,7 +157,6 @@ def get(self, owner_id=None, album_id=None, access_hash=None):

def get_albums_iter(self, owner_id=None):
""" Получить список альбомов пользователя (по частям)

:param owner_id: ID владельца (отрицательные значения для групп)
"""

Expand Down Expand Up @@ -198,15 +195,13 @@ def get_albums_iter(self, owner_id=None):

def get_albums(self, owner_id=None):
""" Получить список альбомов пользователя

:param owner_id: ID владельца (отрицательные значения для групп)
"""

return list(self.get_albums_iter(owner_id))

def search_user(self, owner_id=None, q=''):
""" Искать по аудиозаписям пользователя

:param owner_id: ID владельца (отрицательные значения для групп)
:param q: запрос
"""
Expand Down Expand Up @@ -254,7 +249,6 @@ def search_user(self, owner_id=None, q=''):

def search(self, q, count=100, offset=0):
""" Искать аудиозаписи

:param q: запрос
:param count: количество
:param offset: смещение
Expand All @@ -264,9 +258,7 @@ def search(self, q, count=100, offset=0):

def search_iter(self, q, offset=0):
""" Искать аудиозаписи (генератор)

:param q: запрос
:param offset: смещение
"""
offset_left = 0

Expand All @@ -290,7 +282,10 @@ def search_iter(self, q, offset=0):
ids = scrap_ids(
json_response['payload'][1][1]['playlist']['list']
)
if not ids:
break

#len(tracks) <= 10
if offset_left + len(ids) >= offset:
if offset_left < offset:
ids = ids[offset - offset_left:]
Expand All @@ -302,12 +297,10 @@ def search_iter(self, q, offset=0):
http=self._vk.http
)

if not tracks:
break

for track in tracks:
yield track


offset_left += len(ids)

response = self._vk.http.post(
Expand All @@ -321,6 +314,7 @@ def search_iter(self, q, offset=0):
)
json_response = json.loads(response.text.replace('<!--', ''))


def get_updates_iter(self):
""" Искать обновления друзей (генератор) """

Expand All @@ -343,6 +337,8 @@ def get_updates_iter(self):
ids = scrap_ids(
[i[0] for i in updates if i]
)
if not ids:
break

tracks = scrap_tracks(
ids,
Expand All @@ -351,9 +347,6 @@ def get_updates_iter(self):
http=self._vk.http
)

if not tracks:
break

for track in tracks:
yield track

Expand All @@ -371,7 +364,8 @@ def get_updates_iter(self):
)
json_response = json.loads(response.text.replace('<!--', ''))

def get_popular_iter(self, offset=0):

def get_popular_iter(self,offset=0):
""" Искать популярные аудиозаписи (генератор)

:param offset: смещение
Expand All @@ -380,35 +374,29 @@ def get_popular_iter(self, offset=0):
response = self._vk.http.post(
'https://vk.com/audio',
data={
'block': 'chart',
'section': 'explore'
'block':'chart',
'section':'recoms'
}
)
json_response = json.loads(scrap_json(response.text))

ids = scrap_ids(
json_response['sectionData']['explore']['playlist']['list']
json_response['sectionData']['recoms']['playlist']['list']
)

if offset:
tracks = scrap_tracks(
ids[offset:],
self.user_id,
convert_m3u8_links=self.convert_m3u8_links,
http=self._vk.http
)
else:
tracks = scrap_tracks(
ids,
self.user_id,
convert_m3u8_links=self.convert_m3u8_links,
http=self._vk.http
)
#len(tracks) <= 10
tracks = scrap_tracks(
ids[offset:] if offset else ids,
self.user_id,
convert_m3u8_links=self.convert_m3u8_links,
http=self._vk.http
)

for track in tracks:
yield track

def get_news_iter(self, offset=0):

def get_news_iter(self,offset=0):
""" Искать популярные аудиозаписи (генератор)

:param offset: смещение
Expand All @@ -419,31 +407,24 @@ def get_news_iter(self, offset=0):
response = self._vk.http.post(
'https://vk.com/audio',
data={
'block': 'new_songs',
'section': 'explore'
'block':'new_songs',
'section':'recoms'
}
)
json_response = json.loads(scrap_json(response.text))

ids = scrap_ids(
json_response['sectionData']['explore']['playlist']['list']
json_response['sectionData']['recoms']['playlist']['list']
)

#len(tracks) <= 10
if offset_left + len(ids) >= offset:
if offset_left >= offset:
tracks = scrap_tracks(
ids,
self.user_id,
convert_m3u8_links=self.convert_m3u8_links,
http=self._vk.http
)
else:
tracks = scrap_tracks(
ids[offset - offset_left:],
self.user_id,
convert_m3u8_links=self.convert_m3u8_links,
http=self._vk.http
)
tracks = scrap_tracks(
ids if offset_left >= offset else ids[offset - offset_left:],
self.user_id,
convert_m3u8_links=self.convert_m3u8_links,
http=self._vk.http
)

for track in tracks:
yield track
Expand All @@ -456,8 +437,8 @@ def get_news_iter(self, offset=0):
data={
'al': 1,
'act': 'load_catalog_section',
'section_id': json_response['sectionData']['explore']['sectionId'],
'start_from': json_response['sectionData']['explore']['nextFrom']
'section_id': json_response['sectionData']['recoms']['sectionId'],
'start_from': json_response['sectionData']['recoms']['nextFrom']
}
)

Expand All @@ -466,25 +447,17 @@ def get_news_iter(self, offset=0):
ids = scrap_ids(
json_response['payload'][1][1]['playlist']['list']
)
if not ids:
break

#len(tracks) <= 10
if offset_left + len(ids) >= offset:
if offset_left >= offset:
tracks = scrap_tracks(
ids,
self.user_id,
convert_m3u8_links=self.convert_m3u8_links,
http=self._vk.http
)
else:
tracks = scrap_tracks(
ids[offset - offset_left:],
self.user_id,
convert_m3u8_links=self.convert_m3u8_links,
http=self._vk.http
)

if not tracks:
break
tracks = scrap_tracks(
ids if offset_left >= offset else ids[offset - offset_left:],
self.user_id,
convert_m3u8_links=self.convert_m3u8_links,
http=self._vk.http
)

for track in tracks:
yield track
Expand All @@ -493,7 +466,6 @@ def get_news_iter(self, offset=0):

def get_audio_by_id(self, owner_id, audio_id):
""" Получить аудиозапись по ID

:param owner_id: ID владельца (отрицательные значения для групп)
:param audio_id: ID аудио
"""
Expand Down Expand Up @@ -521,7 +493,6 @@ def get_audio_by_id(self, owner_id, audio_id):

def get_post_audio(self, owner_id, post_id):
""" Получить список аудиозаписей из поста пользователя или группы

:param owner_id: ID владельца (отрицательные значения для групп)
:param post_id: ID поста
"""
Expand Down Expand Up @@ -561,7 +532,7 @@ def scrap_ids(audio_data):


def scrap_json(html_page):
""" Парсинг списка хэшей ауфдиозаписей новинок или популярных + nextFrom&sessionId """
""" Парсинг списка хэшей аудиозаписей новинок или популярных + nextFrom&sessionId """

find_json_pattern = r"new AudioPage\(.*?(\{.*\})"
fr = re.search(find_json_pattern, html_page).group(1)
Expand Down