Comments 50
А потом еще можно пронумеровать имя файла что б слушать в том же порядке. Для Linux когда давно писал скрипт.
a = 1
ls -1t | while read line
do
let a=a+1
echo "***"
b=${a}${line}
mv "$line" "$b"
echo "***"
done
А зачем на каждый чих вызывать vk_audio.get()?
Можно же вызвать один раз и записать в переменную. Или я чего то не понимаю.
Кто-то мешает вам собрать его самостоятельно? Сам факт наличия уже собранной версии по-вашему как-то очерняет программу?
P.S. gentoo?
Повторю вопрос — Gentoo? :)
Обычно паранойа такого уровня это признак гентушника. Если вы до сих пор не знакомы с этой операционной системой, то с вашими взглядами на open source у вас просто нет выбора, — вы созданы друг для друга.
Более, чем реальна. Но уровень паранойи — это выбор каждого. Я вот скорее скачаю готовый deb пакет из источника к которому питаю доверие, нежели буду качать исходные коды, изучать их под лупой и пересобирать. Свои риски я осознаю, и сам же за них несу ответственность. 99%+ пользователей будет качать уже собранный бинарник, и не по глупости, а целенаправлено. Желающим же большего контроля доступны исходные коды. Вы из вторых — велкам, для вас там всё подготовлено.
Вам не нравится что возможность на свой страх и риск довериться тем кто выложил вместе с исходниками уже готовый бинарь в принципе существует? Гхм, ну селяви. Обратное встречается настолько ускользающе редко, что стоит ли об этом вообще упоминать.
Хехе, представил себе как каждая вторая рабочая станция качает обновления в виде сырсов и ночами пересобирает сама себя. Дивный мир.
Учебный пример — это хорошо. Но в свете последних новшевств музыка ВК действительно того стоит, чтобы ей пользоваться?
Есть и минусы, конечно — некоторая хаотичность и полная чушь в рекомендациях, да.
некоторая хаотичность и полная чушь в рекомендациях
мне, яндекс.музЫка, недавно (2 дня назад как) порекомендовал сборку в стиле «регги», среди прочего там — песня — «течёт река волга» (не знаю кто поёт, какое-то ВИА или ещё кто), игра на балалайке, парочку песен из бродвейских мюзиклов и прочая муть со всех концов планеты… всё что их объединяет с «регги», так это года — почти все композиции родом из 60х +\-
Данные будут записаны в бинарном виде, дабы не хранить логин и пароль пользователя в открытом виде.Так всё равно данные можно прочитать hex-редактором, так как они не зашифорованы. Не по теме статьи, но всё же.
А за скрипт респект, просто и практично.
Вы успешно авторизовались.
Подготовка к скачиванию...
Traceback (most recent call last):
File "vkdl.py", line 119, in <module>
main()
File "vkdl.py", line 93, in main
audio = vk_audio.get(owner_id=my_id)[0]
File "/home/onboard/.local/lib/python3.6/site-packages/vk_api/audio.py", line 96, in get
return list(self.get_iter(owner_id, album_id, access_hash))
File "/home/onboard/.local/lib/python3.6/site-packages/vk_api/audio.py", line 77, in get_iter
filter_root_el={'class_': 'audioPlaylist__list'} if album_id else None
File "/home/onboard/.local/lib/python3.6/site-packages/vk_api/audio.py", line 236, in scrap_data
for audio in root_el.find_all('div', {'class': 'audio_item'}):
AttributeError: 'NoneType' object has no attribute 'find_all'
И, действительно, ноды с id == au_search_items в коде страницы с аудио нет.
UP ошибка то осталась: audio = vk_audio.get(owner_id=my_id)[0]
diff --git a/src/main.py b/src/main.py
index bfadfa5..b09d4c7 100755
--- a/src/main.py
+++ b/src/main.py
@@ -7,6 +7,7 @@ import requests
from time import time
import vk_api
from vk_api import audio
+import re
class vkMusicDownloader():
@@ -94,6 +95,7 @@ class vkMusicDownloader():
# собственно циклом загружаем нашу музыку
for i in audio:
fileM = "{} - {}.mp3".format(i["artist"], i["title"])
+ fileM = re.sub('/', '_', fileM)
try:
if os.path.isfile(fileM) :
print("{} Уже скачен: {}.".format(index, fileM))
Нулевой байт убирать смысла не вижу (у меня ни одной записи с ним в имени не нашлось :-). Для других ОС будут инвалидными другие символы, но, думаю, убранный слеш покроет 99 % случаев ошибок записи файлов из-за неверных символов в имени.
import requests
import io
import json
token = '******'
count = 2476
offset = 1000
def download(url):
r = requests.get(url, stream=True)
filename = url.split('/')[-1]
with open(filename, 'bw') as file:
for chunk in r.iter_content(4096):
file.write(chunk)
def write_json(data):
with open('response_2.json', 'w') as file:
json.dump(data, file, indent=2, ensure_ascii=False)
def get_largest(size_dict):
weight = {'o': 0, 'p': 0, 'q': 0, 'r': 0, 's': 0, 'm': 10, 'x': 20, 'y': 30, 'z': 40, 'w': 50}
size_dict['type'] = weight[size_dict['type']]
return size_dict['type']
def main():
# photos = json.load(open('response_2.json'))['response']['items']
# for photo in photos:
# sizes = photo['sizes']
# max_size_url = max(sizes, key=get_largest)['src']
# download(max_size_url)
r = requests.get('https://api.vk.com/method/photos.get',
params={'owner_id': '*****',
'v': '5.52',
'access_token': token,
'album_id': 'saved', 'photo_sizes': True, 'count': count, 'offset': offset})
write_json(r.json())
if __name__ == '__main__':
main()
Линтеры и всякие там чекеры (flake8, pylint, mypy и т.д.) при написании на питоне должны быть вашими лучшими друганами, а вы их игнорите. Нехорошо-с.
Переменные и функции пишутся в нижнем регистре с подчёркиваниями, а у вас они в верблюжьем (CamelCase), в котором пишутся классы.
Вместо такого вот ужоса
print('Скачивается: ' + i[«artist»] + " — " + i[«title»])лучше бы написать
print(f'Скачивается: {i[«artist»]} — {i[«title»]}')— будет и короче, и понятнее, и «питоничнее», и исполняться будет быстрее.
Скобки срочно убрать, это вам не C и не Java!!!
if (os.path.exists(USERDATA_FILE) and new == True):
Ну и так далее.
В общем, линтеры-чекеры в помощь, а то ж глазам больно на такой код смотреть. А ещё лучше — нормальный редактор, который будет в реальном времени текст проверять
Вместо
r = requests.get(audio["url"])
должно быть r = requests.get(i["url"])
Автор молодец, спасибо ему, но надо бы тестировать прежде чем выкладывать =)
audio = vk_audio.get(owner_id=my_id)[0]
r = requests.get(audio["url"])
def regul(text):
return (re.sub('[\\\/\:\"\?\*\<\>\|]','',text.strip())).lower()
with open(regul(i["artist"]) + '_' + regul(i["title"]) + '.mp3', 'wb') as output_file:
output_file.write(r.content)
Загрузка музыки ВКонтакте