Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Як в Linux завантажувати аудіо з списків відтворення vk.com?

with 4 comments

Зазвичай я не використовував ніяких лишніх інструментів для того аби качати аудіо з вконтакту, бо всі інструменти вже є в лінуксі, досить лише зберегти плейліст в файл audio.html, та виконати:

wget -c `grep https://.*mp3 -o audio.html`

Але тоді каталог заповнюється файлами виду 7b6e2b1e3f81.mp3 і хоча й більшість mp3 плеєрів читають їх теги і нормально керують колекцією музики, все одно важко наприклад чистити каталоги від зайвих, чи копіювати потрібну музику за маскою. Тому я вирішив написати трішки кращий фільтр ніж grep.

Для його використання потрібно вже дві команди:

wget -O list.py https://bunykprogs.googlecode.com/hg/vk_downloader.py
python3 list.py audio.html | sh

Але результат повинен виправдати зусилля. Перший рядочок – “інсталяція” додаткового скрипта, другий – його виконання. Щоб все працювало, ви повинні мати wget, python3 та lxml для python3.


Працює скрипт просто роздруковуючи команди скачування в термінал. Щоб їх виконати, не обов’язково перенаправляти вивід в файл, можна зразу в sh.

Ви можете запитати, а чому я не зробив так аби скрипт сам скачував аудіо, а не генерував код на sh який це робить? Та тому, що з цим я можу зробити наприклад таке:

python3 list.py audio.html | grep "German" | sh # скачати все з словом German в назві файлу
python3 list.py audio.html | wc -l # показати довжину списку.

Хоч одна програма для викачування музики з вконтакту так вміє? От, от.

Код виглядає ось так:

import sys

from lxml import html
from lxml import etree

def clear_param(txt):
    return txt.strip().replace('"', r'\"')

def parse(fl):
    tree = html.parse(fl)
    elements = tree.xpath('//div[@id="initial_list"]//input')
    urls = []
    for el in elements:
        urls.append(el.attrib['value'].split(',')[0])

    elements = tree.xpath('//div[@id="initial_list"]//div[@class="title_wrap fl_l"]')
    for el, url in zip(elements, urls):
        performer = clear_param(el.xpath('b/a/text()')[0])
        title = clear_param(el.xpath('span[@class="title"]//text()')[0])
        print('wget -c -O "{performer} - {title}.mp3" "{url}"'.format(
            url=url, performer=performer, title=title
        ))

def main():
    if len(sys.argv) > 1:
        parse(sys.argv[1])
    else:
        print('Pass file name', file=sys.stderr)


if __name__=='__main__':
    main()
Advertisements

Written by bunyk

Травень 11, 2013 at 02:00

Відповідей: 4

Subscribe to comments with RSS.

  1. […] Всю музику з альбому в контакті (UPD: В 2013, є кращий варіант): […]

  2. непогано було би перенести скрипт на github

    danbst

    Вересень 17, 2013 at 09:52

    • Відпускаю його в суспільне надбання – робіть що хочете. 🙂

      bunyk

      Вересень 17, 2013 at 10:40

  3. […] життя бурлацькеє…”, але я звідти видалився, стягнувши звісно ввесь плейліст. Потім я переставляв лінукс, перекинув всю колекцію […]


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: