Сортировка треков в плейлисте VK



    Disclaimer: я начал писать этот скрипт, когда весёлые новости ещё не подоспели.

    Буду краток.
    • Что оно делает?
      • Переупорядочивает треки в вашем плейлисте в VK так, чтобы с минимальным вмешательством он стал выглядеть аккуратнее.
    • Где взять?
    • Как пользоваться?
      • Понадобится Python 2.7.x. Качаете, устанавливаете. Берёте файл vk_music_organizer.py из архива, открываете в блокноте, в самом начале пишете в строках email = '...' и password = '...' свой логин и пароль соответственно. Сохраняете. Если у вас корректно установлен Python, то после этого достаточно просто запустить этот файл двойным щелчком.


    • Как оно работает?
      • Алгоритм сортировки такой:
        1. Разбить все треки по альбомам, если таковые у пользователя есть, все треки без указанного альбома скинуть в один безымянный альбом. Все альбомы отсортировать по алфавиту, безымянный поставить первым.
        2. Пройтись по всем трекам внутри каждого альбома и цепочки идущих подряд треков с одним исполнителем объеденить в кластеры.
        3. Внутри каждого альбома, для всех встреченных исполнителей найти самый большой кластер с ними. Из одинаковых по размеру выбрать первый в списке.
        4. Все треки, не лежащие в самом большом кластере своего исполнителя, перетащить в этот кластер.
        5. Объеденить подряд все кластеры внутри каждого альбома. Объединить все альбомы.

        Помимо сортировки там ничего особо содержательного нет. Я использую авторизатор и код вызова API из этой статьи. Не считая сортировки, работа программы ограничивается одним запросом к audio.get, одним к audio.getAlbums и кучей к audio.reorder. Бесплатный бонус: все треки, попавшие под суровую длань копирайта, отправляются в подвал.

    Скрипт предоставляется как есть, со всеми багами и недостатками. Используйте на свой страх и риск. Enjoy!
    Метки:
    Поделиться публикацией
    Комментарии 25
    • +22
      Скоро будет нечего сортировать, копирасты всё поудаляют из вк )
      • 0
        Вспомним про флэшки- будем на флэшках обмениваться. Потом запретят флэшки- вспомним про болванки. Запретят болванки- вспомним про кассеты и винил.
        • +4
          А вам не приходило в голову, что такой образ мышления априори предполагает, что абсолютно ничего нельзя сделать против самих запрещений?
          • +3
            Против самих запрещений ничего нельзя сделать хотя бы потому, что данная власть вроде как легитимна, но ей при этом абсолютно наплевать на интересы выбравших ее граждан.
            И следующие выборы ничего нового не принесут.
            А всякие предложения вроде революций есть провокация, запрещенная законодательством РФ.
          • +1
            Запретят кассеты и винил — bar-blues станет мейнстримом
            • +1
              Тогда будут рейды маски-шоу с представителем РАО по этим заведениям, где исполняют каверы.
              Разницы-то? Надо менять принципы системы, а не методы ухода от глупых законов.
            • НЛО прилетело и опубликовало эту надпись здесь
            • –1
              Вчера культовый трек 2Pac – Changes удалили (
            • –8
              открываете в блокноте, в самом начале пишете в строках email = '...' и password = '...'

              Учитывая, что эти методы доступны flash и iframe приложениям, не вижу никакого смысла использовать Ваше решение, где мне еще придется свои данные для аутентификации оставлять.
              • +17
                У моего приложения есть преимущество: оно уже написано. Если боитесь, что оно сольёт куда-то Ваши данные, прочитайте код. Кроме того, никто не заставляет Вас им пользоваться.
                • –3
                  Интересно, за что меня минусуют. Ведь stanalone приложениям доступна авторизация как и всем сторонним приложениям, просто с запросом разрешений в браузере. Не вижу никакого смысла оставлять приложению свои данные. Не каждый будет лезть в исходный код. Учитесь уважать пользователей.

                  P.S. Все больше убеждаюсь, что хабрасообщество — стадо. То в одном посте осуждают нубов, оставляющих свои данные где непопадя, то минусуют меня за обратное.
                  • +1
                    не вижу никакого смысла использовать Ваше решение

                    Не видите смысла — не используйте, в чём проблема? Напишите своё, если Вам нужно. Лично мне будет интересно почитать про разработку приложений на Flash с нуля, поскольку я в этой теме не разбираюсь.

                    Не каждый будет лезть в исходный код.

                    А не нужно каждому. Достаточно одного человека, который заметит бэкдор и ткнёт пальцем в строку на гитхабе.

                    Учитесь уважать пользователей.

                    Вы так говорите, как будто я лично Вам что-то должен.
                    • 0
                      не вижу никакого смысла использовать Ваше решение

                      Где Вы такую фразу увидели?

                      Лично мне будет интересно почитать про разработку приложений на Flash с нуля

                      Я вверху писал, что есть еще iframe приложения. Javascript API.

                      Учитесь уважать пользователей.

                      Не вырывайте фразы без контекста. Вы все больше меня разочаровываете. Обратите пожалуйста внимание на фразу: «Ведь stanalone приложениям доступна авторизация как и всем сторонним приложениям, просто с запросом разрешений в браузере.»
                      • +1
                        Где Вы такую фразу увидели?

                        В корне этой ветки.

                        Я вверху писал, что есть еще iframe приложения. Javascript API.

                        И про это тоже будет интересно почитать.

                        Не вырывайте фразы без контекста. Вы все больше меня разочаровываете. Обратите пожалуйста внимание на фразу: «Ведь stanalone приложениям доступна авторизация как и всем сторонним приложениям, просто с запросом разрешений в браузере.»

                        Пожалуйста, процитирую Вас целиком. Во-первых, повторюсь в третий раз, не нравится — не пользуйтесь. Во-вторых, если знаете, как сделать на питоне авторизацию через браузер, милости прошу в кнопку fork. В третьих, и тут я позволю себе процитировать Вас лишь частично:
                        Вы все больше меня разочаровываете.
                        Держите меня в курсе.
              • +2
                тююю, я то думал «альбомы» в музыкальном смысле этого слова, а тут… ничего интересного вобщем, простите уж
                • +1
                  тоже разочаровался(
                  • 0
                    Ну, знаете. Можно, конечно, попробовать добавить запросы к MusicBrainz, но могут полезть очень неприятные и труднопоправимые ошибки из-за неверного сопоставления. Я изначально ставил цель добиться порядка минимальными изменениями. Подобные же операции — вещь намного более радикальная.
                  • 0
                    Попытался затестить. Запустил, попросилось в интернет, вконтакте пишет, что приложение зашло, но за 20 минут ничего не изменилось и ничего не написало. Насколько долго нужно ждать и как определить, что оно вообще работает? :)
                    • 0
                      Время работы зависит от количества треков. На моих ~250 скрипт отрабатывает за 3 минуты.
                      Большая часть времени — это запросы к API на переупорядочивание. Мне было лень писать аккуратную реализацию с запросами только по необходимости, поэтому 1 трек = 1 запрос. У VK стоит ограничение на 3 запроса в секунду. Плюс не слишком точная задержка у меня.
                      Если хотите смотреть, что оно там отправляет, можете вставить в метод reorder_audio в файле vk_music_organizer.py какую-нибудь отладочную печать, как-то так:
                      reorder_audio
                      	def reorder_audio(self, audio_id, owner_id=None, before=None, after=None):
                      		if not before and not after:
                      			raise ValueError('Neither before nor after were specified')
                      
                      		self.ensure_login()
                      
                      		params = {'aid': audio_id, 'oid': (self.user_id if owner_id is None else owner_id)}
                      		if before:
                      			params['before'] = before
                      		if after:
                      			params['after'] = after
                      
                      		print params  # this is the debug output
                      
                      		result = vk_api.call_api('audio.reorder', params, self.token)
                      		if result != 1:
                      			raise RuntimeError('API did not return success code')
                      
                      • 0
                        Сейчас, после некоторого времени, консоль просто вылетела, и никаких изменений. Грустно.
                        У меня 707 аудиозаписей, но не думаю, что дело в них. :)
                        Сейчас попробую с отладочной печатью, может так яснее станет, в чём дело.
                        • 0
                          Можете ещё переключить debug_mode = True в самом начале. Тогда скрипт будет сохранять в отдельные файлы списки треков, альбомов и результаты сортировки. По крайней мере, можно будет посмотреть, отсортировалось оно там или нет.
                          • 0
                            Включил, оно опять так же отработало, но result и audios абсолютно идентичными остались.
                            • 0
                              Предлагаю перевести дискуссию в ЛС, она может затянуться.
                    • 0
                      Python 2.7.x установлен верно. Падает с ошибкой.
                      E:\vk-music-organizer-master>vk_music_organizer.py Traceback (most recent call last): File "E:\vk-music-organizer-master\vk_music_organizer.py", line 218, in <module> main(email=email, password=password) File "E:\vk-music-organizer-master\vk_music_organizer.py", line 200, in main audios = vk.get_audios() File "E:\vk-music-organizer-master\vk_music_organizer.py", line 52, in get_audios self.ensure_login() File "E:\vk-music-organizer-master\vk_music_organizer.py", line 46, in ensure_login self.email, self.password, client_id=self.client_id, scope=self.scope) File "E:\vk-music-organizer-master\vk_auth.py", line 108, in auth doc, url = auth_user(email, password, client_id, scope, opener) File "E:\vk-music-organizer-master\vk_auth.py", line 71, in auth_user raise RuntimeError('Some essential data is missing in the form.') RuntimeError: Some essential data is missing in the form. E:\vk-music-organizer-master>
                      • 0
                        Да, я принял кривой pull request. Уже исправил, перекачайте.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.