- PVSM.RU - https://www.pvsm.ru -

Yet another audioplayer

Здравствуйте. Меня зовут Вадим. И я — меломан. Это как наркотик. Постоянно нужна новая музыка. И инструменты для ее поиска и прослушивания. Эта болезнь длится уже много лет. Все началось с написания скриптов, которые распарсивали, базы данных vk.com и last.fm. Потом были многопоточные парсеры музыки liveinternet через сеть прокси серверов и парсер поиcковой выдачи google и p2p сети wuala + рекомендательные сервисы на базе last.fm (w3z.ru — проект закрыт). Затем появилась социальная сеть для меломанов интегрированная с last.fm и vk (wharrgarbl.ru — проект закрыт). И наконец десктопное приложение для меломанов, в котором можно было и слушать и искать музыку в едином интерфейсе (mielophone.com — проект закрыт). Все эти проекты объединяет одно — они не были opensource проектами, и по разным причинам умерли. Мне помогало много людей yamalight [1], Kaaboeld [2] и вдвойне печально, что их пришлось закрыть. Какие то по требованию правообладателей, а какие то — не «потянул». Так может быть пора перестать искать «выгоду»? — подумал я, и решил написать еще один бесплатный, свободный, кроссплатформенный аудиоплеер.
image

Но смотри, будешь на болванку сливать — не вздумай сжимать в mp3!

Классная мультиформатная кроссплатформенная библиотека для декодирования треков — это половина успеха. И к счастью BASS Library [3] бесплатен для freeware проектов. А о половине поддерживаемых ею форматов — я даже не слышал. Отличный звук, написана на C, быстрая, компактная и кроссплатформенная. Вообще я был приятно удивлен сколько дверей открывается для freeware/opensource проектов.

All your files are belong to us.
Среднестатистический плеер под андроид (да и не только под андроид) предполагает 5 вариантов агрегации мультимедиа библиотеки.
Можно упорядочить треки по артистам, альбомам, жанрам, папкам или отобразить все треки единым списком. Мне это напоминает мультфильм «дудочка или кувшинчик». Там старичок-лесовичок давал девочке либо дудочку — чтобы можно было увидеть все ягодки, либо кувшинчик, чтобы их собрать. Допустим у вас есть папка «Мои любимые треки», в которой, ну например все треки, которые вы «лайкнули» на pandora.com, затем добавили в vk.com и синхронизировали с устройством. Если в данной папке несколько сотен треков, как у меня, то экраны со списком по артистам, альбомам и жанрам будут сильно перегружены избыточной информацией. Навигация по папкам — спасает, но файловая структура — древовидна. Какие то папки с альбомами могут быть вложены в папки с артистами, какие то нет. Становится неудобно выбирать несколько папок, и наконец они не упорядочены артистам-альбомам-годам. А всего то надо — отсортировать папки и представить в виде плоского двухуровнего дерева [4]:
Image #2079925, 92.6 KB

Папки группируются по артистам, сортируются по годам и наконец то можно за минимальное количество кликов выбрать папку «мои любимые треки», добавить пару любимых альбомов и вот тот микс, который я добавил на устройство совсем недавно.

Какая боль, какая боль, mediascaner vs пользователь — 5:0
Первая версия библиотеки треков [5] была основана на стандартной медиабиблиотеке андроид (буквально 100 милисекунд — великолепно). Но тестируя функционал попадания треков в раздел недавно добавленные — я столкнулся с проблемой отсутствия недавно добавленных треков. Дело в том, что после добавления нового файла на устройство — он не сразу становится доступен. Сперва его должен увидеть сервис медиасканера, который ведет себя как манерная девица и толком стартует только после перезагрузки устройства (он еще и зависает, разряжая батарею при битом треке, но сейчас речь не об этом). Пришлось написать сканер файловой системы. Но раз у нас свой сканер файлов, то нужен и свой сканер тегов. Для этих целей я выбрал www.jthink.net/jaudiotagger/ [6]. Он поддерживает все форматы которые поддерживает плеер и на первый взгляд довольно быстрый.
Всего 70 ms на файл. Я уже говорил что я меломан? У меня много файлов. И 70 милисекунд легко превращаются в минуты томительного ожидания. Окей в java можно скинуть arraylist [7] в файл буквально несколькими строчками кода и при сканировании инкрементно добавлять только те треки, которые не были просканированы ранее. Повесив апдейт на кнопку refresh, например. Все стало работать быстро, пока я в один прекрасный день не поймал себя на том, что смотрю на список треков в собственной программе и не понимаю почему не появился трек залитый только что. Я забыл что надо нажимать кнопку refresh. Покопавшись в системе я не нашел события «новый файл», но нашел ACTION_POWER_DISCONNECTED. Подписавшись на него [8] — уже можно запускать сканер каждый раз, когда пользователь вытащил шнур из usb, уже лучше. Но 70 миллисекунд остаются 70 миллисекундами. Я попробовал прикрутить библиотеку на C [9] и 70 ms превратились в 30 ms. На первый взгляд прирост не существенный, но на 1000 треков так уже не кажется. Так родилась текущая версия сканера [10].

Let The Music Set You Free.

Легалайз. Всего за 169 рублей в месяц Google Music предоставляет возможность слушать музыку абсолютно легально, и более того, можно хранить свою медиатеку в их облаке. Конечно я не смог пройти мимо этого чуда и, купив подписку, первым делом кинулся реализовывать доступ к хранилищу из плеера. Однако не все получилось. Есть отличный Unofficial-Google-Music-API [11], написанный на Python, однако его java порты безнадежно устарели. Точнее нет проблем с воспроизведением музыки из облака, так залитые пользователем треки — не зашифрованы. Но треки их их магазина, доступные по подписке и из родного приложения — отдаются в зашифрованном виде, причем алгоритм постоянно меняется. И легального пути прослушать легально доступный трек легальному пользователю из нелегального приложения к сожалению нет. Я немного побарахтался [12] с переписыванием с питона на java, но к сожалению ничего не вышло. Поэтому пока можно слушать только собственные треки. А жаль. Кстати, если я не ошибаюсь, собственные треки в облако гугл мьюзик можно заливать бесплатно.

Patterns and Textures.

Перерыв весь dribbble.com несколько раз во всех направлениях, мне показалось что ничего функциональнее Vox [13] еще не придумали. Хотя конечно у меня странные на дизайнерский взгляд требования. Ужасно не люблю когда треклист спрятан где то в глубине, на другом экране, и тебе загадочно показывают обложку с тремя кнопками вместо него. А большинство современных дизайнов почему то реализует именно этот паттерн. Обложку я можно показать и под треклистом, затенив, например (как это делает Vox). Либо если уж делать красоту — то делать красоту, с анимацией на opengl и «подключаемыми модулями зрительного образа». Ну вот, теперь Вы знаете откуда я черпал вдохновение. БОльшая часть нарисована программно [14], что надеюсь облегчит портирование на другие платформы.

It'$ Not For Money

Ну вот мы и плавно подобрались к теме портирования. А в кроссплатформенной разработке я нуб. Со стороны выгляди как — технологий куча, а на выходе печаль. Хочется чтобы приложение было не просто хорошим, а таким же классным — каким был WinAmp в свое время.
Для начала рассмотрел очевидные решения:
Java — громоздкая и тянет за собой JVM
Java Fx — тяжелая

Затем рассмотрел инновационные:
github.com/bigfatbrowncat/zetes [15] — очень интересное и необычное решение. Но пока очень уж молодое. Но работает. (Автор на хабре — и прибьет меня, так как фреймворк еще не анонсирован)

Затем фрейморки ГИП:
Qt, GTK+, wxWidgets — и для каждого нашлись специфичные недостатки. В общем и целом — набор тяжеловесных инструментов.

Затем дерзкие:
mono — неприлично классное решение. Интерфейс пишется нативный, весит немного, писать легко. И я даже начал. А потом с удивлением понял что значительная часть бизнес логики приложения реализована на C, а если интерфейс все равно писать под каждую платформу то зачем нужен моно? Общая часть получается мизерная.

И еще раз рассмотрел пул очевидных решений — нативное приложение под каждую платформу. Проще всего это реализовать перенеся максимально на С. Например для musicbrainz — есть библиотека на C, ее можно интегрировать в приложение и тогда в каждом приложении остнется реализовать только интерфейс и ниточки за которые дергаются сишные либы. Тут проблема только одна. Надо выучить С.

Why can't i see what's in front of me

Вот на этом месте я начал понимать что без помощи сообщества мне ну никак не обойтись. Итак, что есть прямо сейчас:
— репозиторий android версии приложения bitbucket.org/recoilme/freeamp [16]
— собственно приложение play.google.com/store/apps/details?id=ru.recoilme.freeamp [17]

Приложение может:
— проигрывать кучу различных форматов
— сканировать треки, считывать теги
— представлять медиабиблиотеку в удобном виде
— частично интегрировано с сервисом Gooogle music
— максимально эффективно использовать ресурсы системы (не жрет батарею проще говоря, совсем забыл рассказать об этой борьбе)

Запланированный на ближайшее время функционал:
— интеграция с musicbrainz и last.fm. Максимум информации о каждом исполнителе, скробблинг, поиск обложек, лирики и так далее
— интеграция с музыкальными сервисами (vk + soundcloud)
— интеграция с интернет радиостанциями (прикрутить список по сути, басс умеет с ними из коробки работать)
— всякие мелкие задачки (налетай! разбирай!): bitbucket.org/recoilme/freeamp/issues?status=new&status=open [18]
и многое другое. Проект пока молодой и пилится в основном по выходным|вечерам, но, надеюсь, перспективный

А также есть отложенные большие задачи, которые пока мне не по зубам:
— например собрать libmusicbrainz под android
— написать модуль зрительного образа и вывести его на локскрин, например
— переписать медиасканер на си
— ну и глобально, начать портировать под мак, потом под linux, потом под прочие платформы.

Welcome to contribute!

Приложение:
2H Company — Филип Дик [19]
2H Company — Культиватор [20]
The Orb — Let The Music Set You Free [21]
The Orb — Earth (Gaia) — Patterns and Textures — Trk 2 [22]
Argaman — It'$ Not For Money [23]
Infected Mushroom — In Front of Me [24]

Автор: recompileme

Источник [25]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/open-source/53302

Ссылки в тексте:

[1] yamalight: http://habrahabr.ru/users/yamalight/

[2] Kaaboeld: http://habrahabr.ru/users/kaaboeld/

[3] BASS Library: http://ru.wikipedia.org/wiki/BASS

[4] отсортировать папки и представить в виде плоского двухуровнего дерева: https://bitbucket.org/recoilme/freeamp/src/d6563d925294276a488369972d6b681b5b57b762/src/ru/recoilme/freeamp/playlist/MakePlaylistAbstract.java?at=master

[5] Первая версия библиотеки треков: https://bitbucket.org/recoilme/freeamp/src/d6563d925294276a488369972d6b681b5b57b762/src/ru/recoilme/freeamp/playlist/MakePlaylistMS.java?at=master

[6] www.jthink.net/jaudiotagger/: http://www.jthink.net/jaudiotagger/

[7] скинуть arraylist: https://bitbucket.org/recoilme/freeamp/src/d6563d925294276a488369972d6b681b5b57b762/src/ru/recoilme/freeamp/FileUtils.java?at=master

[8] Подписавшись на него: https://bitbucket.org/recoilme/freeamp/src/d6563d925294276a488369972d6b681b5b57b762/src/ru/recoilme/freeamp/player/ServicePlayer.java?at=master

[9] библиотеку на C: http://www.un4seen.com/forum/?topic=13225.0

[10] сканера: https://bitbucket.org/recoilme/freeamp/src/d6563d925294276a488369972d6b681b5b57b762/src/ru/recoilme/freeamp/playlist/MakePlaylistFS.java?at=master

[11] Unofficial-Google-Music-API: https://github.com/simon-weber/Unofficial-Google-Music-API

[12] побарахтался: https://bitbucket.org/recoilme/freeamp/src/d6563d925294276a488369972d6b681b5b57b762/src/com/faceture/google/play/PlayClient.java?at=master

[13] Vox: http://coppertino.com/vox/

[14] нарисована программно: https://bitbucket.org/recoilme/freeamp/src/d6563d925294276a488369972d6b681b5b57b762/res/drawable/?at=master

[15] github.com/bigfatbrowncat/zetes: https://github.com/bigfatbrowncat/zetes

[16] bitbucket.org/recoilme/freeamp: https://bitbucket.org/recoilme/freeamp

[17] play.google.com/store/apps/details?id=ru.recoilme.freeamp: https://play.google.com/store/apps/details?id=ru.recoilme.freeamp

[18] bitbucket.org/recoilme/freeamp/issues?status=new&status=open: https://bitbucket.org/recoilme/freeamp/issues?status=new&status=open

[19] 2H Company — Филип Дик: http://www.youtube.com/watch?v=BqcvqJYpIHA

[20] 2H Company — Культиватор: http://www.youtube.com/watch?v=xftF5IHAZAM

[21] The Orb — Let The Music Set You Free: http://www.youtube.com/watch?v=qfo4JucsdVA

[22] The Orb — Earth (Gaia) — Patterns and Textures — Trk 2: http://www.youtube.com/watch?v=BtNbRlXI9rY

[23] Argaman — It'$ Not For Money : http://argaman.bandcamp.com/track/it-not-for-money

[24] Infected Mushroom — In Front of Me : http://www.youtube.com/watch?v=qaLg0Txbzo8

[25] Источник: http://habrahabr.ru/post/209920/