Pull to refresh

Comments 50

Есть savefromnet для chorma'а. Открываете его в своей музыке и нажимаете скачать все. Ждете. Profit.
А потом еще можно пронумеровать имя файла что б слушать в том же порядке. Для Linux когда давно писал скрипт.
Заголовок спойлера
a = 1
ls -1t | while read line
do
let a=a+1
echo "***"
b=${a}${line}

mv "$line" "$b"
echo "***"
done

Ну… готовая тулза не решает всего спектра вопросов, который можно решить скриптом. Например автоматическая синхронизация медиа вконтакте на диск дома или в свое, родное облачко.
Вы конечно правы. На то и готовая тулза, что бы решать только типовые задачи.
Не этот ли плагин попалился недавно на воровстве данных юзеров?
Если своё vk_api подпихнуть, то вполне можно так сделать…
Скажу честно — всегда безопаснее написать свой скрипт и быть уверенным, что твои данные останутся при тебе. А savefromnet не опенсорсный, и понять что у него под капотом происходит — нужно немного запариться.
А вас не смущает savefromnet-у отдавать свои креды от аккаунта? Вы же не знаете что он может еще делать помимо скачивания. Лично я для этого плагина отдельный аккаунт завел и отдельный браузер
UFO just landed and posted this here

А зачем на каждый чих вызывать vk_audio.get()?
Можно же вызвать один раз и записать в переменную. Или я чего то не понимаю.

Можно, но в статье написано что человек учится. Все с опытом приходит.
Youtube-dl справляется с этой задачей и еще с миллионами подобных. Опен-сорс, данные не крадет, скрипты в браузер ставить не нужно.
Справляется ли? Последняя версия получает отлуп с «bad browser», хотя и представляется Хромом.
UFO just landed and posted this here
По ссылке официальный сайт, а не исполняемый файл. Где вы увидели youtube-dl.exe?
UFO just landed and posted this here
На этой же странице ссылка на исходный код и документацию. Почему вас так расстраивает наличие возможности скачать исполняемый файл (один из вариантов)?
UFO just landed and posted this here

Кто-то мешает вам собрать его самостоятельно? Сам факт наличия уже собранной версии по-вашему как-то очерняет программу?


P.S. gentoo?

UFO just landed and posted this here

Повторю вопрос — Gentoo? :)

UFO just landed and posted this here

Обычно паранойа такого уровня это признак гентушника. Если вы до сих пор не знакомы с этой операционной системой, то с вашими взглядами на open source у вас просто нет выбора, — вы созданы друг для друга.

UFO just landed and posted this here

Более, чем реальна. Но уровень паранойи — это выбор каждого. Я вот скорее скачаю готовый deb пакет из источника к которому питаю доверие, нежели буду качать исходные коды, изучать их под лупой и пересобирать. Свои риски я осознаю, и сам же за них несу ответственность. 99%+ пользователей будет качать уже собранный бинарник, и не по глупости, а целенаправлено. Желающим же большего контроля доступны исходные коды. Вы из вторых — велкам, для вас там всё подготовлено.


Вам не нравится что возможность на свой страх и риск довериться тем кто выложил вместе с исходниками уже готовый бинарь в принципе существует? Гхм, ну селяви. Обратное встречается настолько ускользающе редко, что стоит ли об этом вообще упоминать.


Хехе, представил себе как каждая вторая рабочая станция качает обновления в виде сырсов и ночами пересобирает сама себя. Дивный мир.

Хехе, представил себе как каждая вторая рабочая станция качает обновления в виде сырсов и ночами пересобирает сама себя. Дивный мир.


Для таких можно компилятор правильный подсунуть, который будет вкомпиливать правильные дополнения )
UFO just landed and posted this here
А какое решение вы предлагаете? Всех заставлять ставить из исходников? Ну так мало просто скачать и скомпилировать, надо же еще тогда глазами проверить на то, что код чист. То есть всем надо внезапно стать программистами, способными пропускать через себя десятки и сотни тысяч строк кода, чтобы не стать жертвой какой-нибудь схемы.
UFO just landed and posted this here
А можно код хотя бы на gist.github.com выложить?
Я давненько писал бота для скачивания музыки, для себя, vk.com/music_bott некоторые функции уже не работают, но музыку скачать все ещё можно, удобно что не нужно уходить с сайта чтобы скачать музыку, может кому пригодится.

Учебный пример — это хорошо. Но в свете последних новшевств музыка ВК действительно того стоит, чтобы ей пользоваться?

О каких новшествах идет речь?
Да, там можно найти (и утянуть себе на плеер) музыку, которую в других местах найти трудно.
В свете последних новшеств как раз и стоит. Плейлисты и большое количество вполне себе легальной музыки (работает с крупными агрегаторами, в результате чего там действительно много контента), а также куча авторских сообществ и тематических пабликов с остальной музыкой (и тоже с альбомами в виде плейлистов) формируют просто отличную библиотеку. Плюс пользовательский контент и возможность загрузки своих файлов. При этом цена на подписку вполне гуманна.

Есть и минусы, конечно — некоторая хаотичность и полная чушь в рекомендациях, да.
некоторая хаотичность и полная чушь в рекомендациях


мне, яндекс.музЫка, недавно (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 в коде страницы с аудио нет.
Теперь на некоторых пользователях тестируется отдача музыки через HLS (M2TS поток), который поддерживает шифрование, так что придётся использовать инструменты для дальнейшей сборки чанков.
Недели 2-ве назад видел эту статью в песочнице, код был в ошибках. Скачивалась всегда 1-ая песня под разными именами. Код себе я тогда взял и поправил ошибки… )

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 % случаев ошибок записи файлов из-за неверных символов в имени.
есть типа такого скрипта, только для скачивания сохраненных картинок, но там лимит стоит на 1000 картинок за одну сессию, если кто знает там есть метод offset он позволяет скачивать больше 1000 картинок за раз как его использовать

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()
За что ж вы так PEP 8 (Style Guide for Python Code) ненавидите? Прям вот жестоко убили и цинично проглумились над трупом.

Линтеры и всякие там чекеры (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"])


Автор молодец, спасибо ему, но надо бы тестировать прежде чем выкладывать =)
В цикле загрузки, в request ошибка. Делаете запрос к одной и той же песне и присваиваете ей разные имена :)
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)
Sign up to leave a comment.

Articles