# -*- coding: utf-8 -*- | |
«»» | |
Скрипт для скачивания музыки с сайта vkontakte.ru (vk.com) | |
Запуск: | |
python vkcom_audio_download.py | |
Принцип работы: | |
Скрипт проверяет сохраненный access_token. Если его нет или срок истек, | |
то открывается страница в браузере с запросом на доступ к аккаунту. | |
После подтверждения идет редирект на https://oauth. | |
Нужно скопировать весь url, на который вас редиректнуло и вставить его | |
в консоль скрипта. | |
Далее будут скачиваться все ваши аудиозаписи. Если аудиозапись уже есть на | |
диске — то скачивания не происходит. | |
Будут запрошены ваши данные приложением с app_id = 3358129 | |
Можно создать свое Standalone-приложение с доступом к аудио здесь: | |
http://vk.com/editapp?act=create | |
И заменить APP_ID на ваше. | |
«»» | |
import webbrowser | |
import pickle | |
import json | |
import urllib | |
import urllib2 | |
import HTMLParser | |
import re | |
import os | |
import urlparse | |
from datetime import datetime, timedelta | |
# id of vk. com application, that has access to audio | |
APP_ID = ‘3358129’ | |
# if None, then save mp3 in current folder | |
MUSIC_FOLDER = ‘music’ | |
# file, where auth data is saved | |
AUTH_FILE = ‘.auth_data’ | |
# chars to exclude from filename | |
FORBIDDEN_CHARS = ‘/\\\?%*:|»<>!’ | |
def get_saved_auth_params(): | |
access_token = None | |
user_id = None | |
try: | |
with open(AUTH_FILE, ‘rb’) as pkl_file: | |
token = pickle. load(pkl_file) | |
expires = pickle.load(pkl_file) | |
uid = pickle.load(pkl_file) | |
if datetime.now() < expires: | |
access_token = token | |
user_id = uid | |
except IOError: | |
pass | |
return access_token, user_id | |
def save_auth_params(access_token, expires_in, user_id): | |
expires = datetime. now() + timedelta(seconds=int(expires_in)) | |
with open(AUTH_FILE, ‘wb’) as output: | |
pickle.dump(access_token, output) | |
pickle.dump(expires, output) | |
pickle.dump(user_id, output) | |
def get_auth_params(): | |
auth_url = («https://oauth.vk.com/authorize?client_id={app_id}» | |
«&scope=audio&redirect_uri=http://oauth.vk.com/blank.html» | |
«&display=page&response_type=token». | |
webbrowser.open_new_tab(auth_url) | |
redirected_url = raw_input(«Paste here url you were redirected:\n») | |
aup = urlparse.parse_qs(redirected_url) | |
aup[‘access_token’] = aup.pop( | |
‘https://oauth.vk.com/blank.html#access_token’) | |
save_auth_params(aup[‘access_token’][0], aup[‘expires_in’][0], | |
aup[‘user_id’][0]) | |
return aup[‘access_token’][0], aup[‘user_id’][0] | |
def get_tracks_metadata(access_token, user_id): | |
url = («https://api. vkontakte.ru/method/audio.get.json?» | |
«uid={uid}&access_token={atoken}».format( | |
uid=user_id, atoken=access_token)) | |
audio_get_page = urllib2.urlopen(url).read() | |
return json.loads(audio_get_page)[‘response’] | |
def get_track_full_name(t_data): | |
html_parser = HTMLParser.HTMLParser() | |
full_name = u»{0}_{1}».format( | |
html_parser. unescape(t_data[‘artist’][:100]).strip(), | |
html_parser.unescape(t_data[‘title’][:100]).strip(), | |
) | |
full_name = re.sub(‘[‘ + FORBIDDEN_CHARS + ‘]’, «», full_name) | |
full_name = re.sub(‘ +’, ‘ ‘, full_name) | |
return full_name + «.mp3» | |
def download_track(t_url, t_name): | |
t_path = os.path.join(MUSIC_FOLDER or «», t_name) | |
if not os. path.exists(t_path): | |
print «Downloading {0}».format(t_name.encode(‘ascii’, ‘replace’)) | |
urllib.urlretrieve(t_url, t_path) | |
def main(): | |
access_token, user_id = get_saved_auth_params() | |
if not access_token or not user_id: | |
access_token, user_id = get_auth_params() | |
tracks = get_tracks_metadata(access_token, user_id) | |
if MUSIC_FOLDER and not os. path.exists(MUSIC_FOLDER): | |
os.makedirs(MUSIC_FOLDER) | |
for t in tracks: | |
t_name = get_track_full_name(t) | |
download_track(t[‘url’], t_name) | |
print «All music is up to date» | |
if __name__ == ‘__main__’: | |
main() |
vk_api.audio — vk_api 9.3.2 documentation
# -*- coding: utf-8 -*- """ :authors: python273 :contact: https://vk.com/python273 :license: Apache License, Version 2. 0, see LICENSE file :copyright: (c) 2018 python273 """ import re from bs4 import BeautifulSoup from .audio_url_decoder import decode_audio_url from .exceptions import AccessDenied RE_AUDIO_ID = re.compile(r'audio(-?\d+)_(\d+)') RE_ALBUM_ID = re.compile(r'act=audio_playlist(-?\d+)_(\d+)') TRACKS_PER_USER_PAGE = 50 TRACKS_PER_ALBUM_PAGE = 100 ALBUMS_PER_USER_PAGE = 100[docs]class VkAudio(object): """ Модуль для получения аудиозаписей без использования официального API. :param vk: Объект :class:`VkApi` """ __slots__ = ('_vk', 'user_id') def __init__(self, vk): self.user_id = vk.method('users.get')[0]['id'] self._vk = vk
[docs] def get_iter(self, owner_id=None, album_id=None): """ Получить список аудиозаписей пользователя (по частям) :param owner_id: ID владельца (отрицательные значения для групп) :param album_id: ID альбома """ if owner_id is None: owner_id = self. user_id if album_id is not None: url = 'https://m.vk.com/audio?act=audio_playlist{}_{}'.format( owner_id, album_id ) offset_diff = TRACKS_PER_ALBUM_PAGE else: url = 'https://m.vk.com/audios{}'.format(owner_id) offset_diff = TRACKS_PER_USER_PAGE offset = 0 while True: response = self._vk.http.get( url, params={ 'offset': offset }, allow_redirects=False ) if not response.text: raise AccessDenied( 'You don\'t have permissions to browse user\'s audio' ) tracks = scrap_data(response.text, self.user_id) if not tracks: break for i in tracks: yield i offset += offset_diff
[docs] def get(self, owner_id=None, album_id=None): """ Получить список аудиозаписей пользователя :param owner_id: ID владельца (отрицательные значения для групп) :param album_id: ID альбома """ return list(self. get_iter(owner_id, album_id))
[docs] def get_albums_iter(self, owner_id=None): """ Получить список альбомов пользователя (по частям) :param owner_id: ID владельца (отрицательные значения для групп) """ if owner_id is None: owner_id = self.user_id offset = 0 while True: response = self._vk.http.get( 'https://m.vk.com/audio?act=audio_playlists{}'.format( owner_id ), params={ 'offset': offset }, allow_redirects=False ) if not response.text: raise AccessDenied( 'You don\'t have permissions to browse {}\'s albums'.format( owner_id ) ) albums = scrap_albums(response.text) if not albums: break for i in albums: yield i offset += ALBUMS_PER_USER_PAGE
[docs] def get_albums(self, owner_id=None): """ Получить список альбомов пользователя :param owner_id: ID владельца (отрицательные значения для групп) """ return list(self. get_albums_iter(owner_id))
[docs] def search_user(self, owner_id=None, q=''): """ Искать по аудиозаписям пользователя :param owner_id: ID владельца (отрицательные значения для групп) :param q: запрос """ if owner_id is None: owner_id = self.user_id response = self._vk.http.get( 'https://m.vk.com/audio', params={ 'id': owner_id, 'q': q }, allow_redirects=False ) if not response.text: raise AccessDenied( 'You don\'t have permissions to browse {}\'s audio'.format( owner_id ) ) return [ i for i in scrap_data(response.text, self.user_id) if i['owner_id'] == owner_id ]
[docs] def search(self, q='', offset=0): """ Искать аудиозаписи :param q: запрос :param offset: смещение """ response = self. _vk.http.get( 'https://m.vk.com/audio', params={ 'act': 'search', 'q': q, 'offset': offset } ) return scrap_data(response.text, self.user_id)
def scrap_data(html, user_id): """ Парсинг списка аудиозаписей из html странцы """ soup = BeautifulSoup(html, 'html.parser') tracks = [] for audio in soup.find_all('div', {'class': 'audio_item'}): if 'audio_item_disabled' in audio['class']: continue 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() ) 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], 'url': link, 'artist': artist, 'title': title, 'duration': duration, }) return tracks def scrap_albums(html): """ Парсинг списка альбомов из html странцы """ soup = BeautifulSoup(html, 'html. parser') albums = [] for album in soup.find_all('div', {'class': 'audioPlaylistsPage__item'}): link = album.select_one('.audioPlaylistsPage__itemLink')['href'] full_id = tuple(int(i) for i in RE_ALBUM_ID.search(link).groups()) stats_text = album.select_one('.audioPlaylistsPage__stats').text plays = int(stats_text.split(maxsplit=1)[0]) albums.append({ 'id': full_id[1], 'owner_id': full_id[0], 'url': 'https://m.vk.com/audio?act=audio_playlist{}_{}'.format( *full_id ), 'title': album.select_one('.audioPlaylistsPage__title').text, 'plays': plays }) return albums
Предусилитель ВК-80 — Balanced Audio Technology
Предусилитель VK-80
Доступен в серебристом или черном цвете
Прорывной дизайн: BAT SuperPak третьего поколения
В блоке питания предусилителя VK-80 используется совершенно новый SuperPak третьего поколения от Balanced Audio Technology. Дизайн представляет собой значительное переосмысление того, что возможно от устройства накопления энергии. Впервые BAT SuperPak имеет гибридную конструкцию, которая включает в себя два конденсатора, встроенных и залитых в каждую отдельную оболочку. Дополнительный масляно-серебряный конденсатор — возможно, конденсатор самого высокого качества, предлагаемый в отрасли по любой цене, — используется как часть конструкции Gen 3. Затем два конденсатора собираются в новую низкорезонансную оболочку. Результат: низкоуровневые детали раскрываются ясно и непринужденно, в то время как общий звук приобретает соблазнительную сладость и естественность сверху донизу.
Новый промышленный дизайн для эстетики, гибкий интерфейс для удобства
Визуально VK-80 отличается элегантным промышленным дизайном, впервые увиденным в флагманской системе BAT REX 3. Изящная архитектура дополняется мощным и простым в использовании пользовательским интерфейсом. Вы можете затемнить дисплей, не вставая со своего кресла, с помощью пульта дистанционного управления BAT. Угасание музыки одним нажатием кнопки. Переключите фазу, чтобы увидеть, производится ли запись в обратной абсолютной полярности. Даже назовите свои источники. Например, назовите вход воспроизведения вашего домашнего кинотеатра «THTR». Затем зафиксируйте громкость для входа THTR, чтобы управлять системой домашнего кинотеатра с пульта pre/pro. Любите аналог? Просто закажите VK-80 с фонокорректором BAT VK-P3, который обеспечивает переключаемые настройки усиления с подвижным магнитом и подвижной катушкой.
Необычайно хорошая конструкция трансформатора становится еще лучше
VK-80 включает в себя выходной трансформатор второго поколения, в котором используется лучшая медная обмотка Cardas. Благодаря трансформаторным выходам второго поколения VK-80 предлагает выдающееся динамичное и прозрачное воспроизведение оригинального музыкального события. Каждый из выходов предусилителя с трансформаторной связью заключен в экран из мю-металла, который значительно превосходит любой конденсатор в сохранении чистоты передачи сигнала. Верный своему наследию, VK-80 также использует SuperTube 6h40 для формирования сильноточного каскада усиления с низким импедансом. Для дополнительного удобства полностью симметричный VK-80 имеет симметричные и несимметричные входы (а также выходы).
Никогда больше не беспокойтесь об уровнях громкости
Сигнал в предусилителе VK-80 эффективно передается только через один каскад усиления. Эта схема Unistage™ обеспечивает максимальную простоту усиления входящего сигнала только один раз и не использует глобальную обратную связь для обеспечения целостности прямого прохождения упомянутого сигнала. Пропустите музыку через слишком много ступеней усиления, и вы больше не узнаете гениальность и красоту ваших любимых записей. А с VK-80 вы всегда можете добиться нужной громкости. Запатентованный электронный шунтирующий аттенюатор громкости предлагает 140 шагов разрешения 0,5 дБ, которые обеспечивают точные, воспроизводимые настройки громкости, которые звучат непрерывно для человеческого уха.
Посмотреть галерею
Предусилитель VK-80
Технические характеристики
Блок питания
SuperPak третьего поколения: 4×50 мкФ с внутренней гибридной конструкцией серебро/масло в сигнальном тракте
Выход
Выходные трансформаторы второго поколения с проводкой Cardas OFC
Глобальная обратная связь
Нет
Входы
2x XLR + 3X RCA
Выходы — основной
1x XLR + 1X RCA
Выходы — кальлет
1X
0,5 дБ
Количество шагов регулировки громкости
140
Частотная характеристика
от 2 Гц до 200 кГц
Входное сопротивление 9 (минимум)0030 100 кОм
Выходной импеданс
300 Ом
Шум (невзвешенный)
-96DB
DISTORTION
Потребляемая мощность
150 ВА
Комплект трубок
4x 6h40, 2x 6C19
Размеры Вес Если вы серьезно заинтересовались high-end 2-канальным звуком в 1990-х годах, то Balanced Audio Technology — это уже знакомое вам название. Первый обзор продуктов BAT, который я когда-либо читал, был сделан Робертом Дойчем о ламповом предусилителе VK-5 и ламповом усилителе мощности VK-60 в декабрьском выпуске нашего родственного издания Stereophile за 1995 год. В то время все говорили о «сбалансированном» дизайне BAT, уникальной схеме с нулевой обратной связью и, конечно же, об образцовом звучании их продукции. Благодаря этому первоначальному успеху BAT расширилась до других мощных, предусилителей и фонокорректоров, а недавно и проигрывателей компакт-дисков. С самого начала BAT включала полупроводниковые конструкции в свою продуктовую линейку, но, в отличие от некоторых других компаний, которые нарезали зубы на ламповом оборудовании, полупроводниковые усилители и предусилители BAT не были спроектированы по доступной цене и не предназначались просто как доступные. снаряжение начального уровня. Те же самые высокие стандарты и цели дизайна, очевидные в их трубчатом оборудовании, поддерживаются во всей их линейке продуктов, независимо от двигателя под капотом. Это подводит нас к последнему аттракциону из BAT Cave, многоканальному VK-6200. Как и во всем их 2-канальном оборудовании, VK-6200 демонстрирует почти инстинктивное внимание BAT к эстетическим вопросам — это потрясающе, мужественно и — осмелюсь сказать? — красиво. По причинам, о которых я скоро расскажу, это произведение современного искусства музейного качества было вынуждено стоять на полу во время своего пребывания здесь, но если вы в конечном итоге его купите, оно заслуживает почетного места где-нибудь в вашей комнате. Шасси VK-6200 может вместить до шести каналов. Базовый блок — голый, бесканальный VK-6200 — стоит 3750 долларов; каждый канал стоит еще 1250 долларов. Моя 5-канальная конфигурация обошлась мне в крутые 10 000 долларов! Каждый канал представляет собой полноценный моноблок с собственным трансформатором на 700 ВА (вольт-ампер). Как вы могли догадаться, топология схемы полностью балансная, но каждая канальная карта включает в себя как несимметричный (RCA), так и балансный (XLR) входы, а также микропереключатель, размещенный (логично) между ними, чтобы делать то, что происходит естественным образом. Клеммы для динамиков позолочены и рассчитаны на тяжелые условия эксплуатации. VK-6200 весит 120 фунтов — подождите, это только с двумя установленными каналами. Моя 5-канальная версия весила 180 фунтов. Осмотрев свою стойку du jour, я пришел к выводу, что только мой плиточный пол был достаточно прочным, чтобы выдержать ее. Чтобы поставить это пресс-папье на место, понадобилось два крепких стонущих человека. Вся эта серьезность дает вам потрясающие 400 Вт на канал на 4 Ом. Из-за истинной моноблочной природы VK-6200 и при условии, что ваша электрическая компания и домашняя проводка справятся с этим, это 400 Вт по всем пяти каналам одновременно. Даже при менее требовательной нагрузке в 8 Ом BAT выдает далеко не скромные 200 Вт на канал с пропускной способностью, которая превосходит возможности даже вашего ушастого пса. Но VK-6200 — это не только мощность, но и величие. Акт балансировки С первых нот VK-6200 впечатлил. Если бы меня попросили выбрать одно слово для описания его звучания, я бы выбрал «динамический». VK-6200 был одним из немногих усилителей с этим неуловимым фактором «прыжка», который оживляет все виды музыки, и не только там, где вы этого ожидаете — как с литаврами Telarc, активирующими основу, которые, конечно, звучало здорово, но они обычно делают. Нет, именно с такими мелочами динамика BAT могла быть немного пугающей.
5,75″ x 1,75″ x 5,9″0005
40 фунтов. Balanced Audio Technology Многоканальный усилитель мощности VK-6200
Я встречал лишь несколько усилителей, которые, если не считать катастрофического отказа, не могли хотя бы сносно работать со стандартной платой за проезд в домашнем кинотеатре — в конце концов, вас отвлекает картинка. Двухканальный звук легче поддается анализу; для любого усилителя, который я рассматриваю, я провожу по крайней мере 50% прослушиваний только с музыкальными записями. С BAT этот процент был выше по простой причине — он мне определенно нравился.