Здравствуйте. Меня зовут Вадим. И я — меломан. Это как наркотик. Постоянно нужна новая музыка. И инструменты для ее поиска и прослушивания. Эта болезнь длится уже много лет. Все началось с написания скриптов, которые распарсивали, базы данных vk.com и last.fm. Потом были многопоточные парсеры музыки liveinternet через сеть прокси серверов и парсер поиcковой выдачи google и p2p сети wuala + рекомендательные сервисы на базе last.fm (w3z.ru — проект закрыт). Затем появилась социальная сеть для меломанов интегрированная с last.fm и vk (wharrgarbl.ru — проект закрыт). И наконец десктопное приложение для меломанов, в котором можно было и слушать и искать музыку в едином интерфейсе (mielophone.com — проект закрыт). Все эти проекты объединяет одно — они не были opensource проектами, и по разным причинам умерли. Мне помогало много людей yamalight, Kaaboeld и вдвойне печально, что их пришлось закрыть. Какие то по требованию правообладателей, а какие то — не «потянул». Так может быть пора перестать искать «выгоду»? — подумал я, и решил написать еще один бесплатный, свободный, кроссплатформенный аудиоплеер.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/de4/5ca/f1f/de45caf1f2336d674ac9c14fb27110b1.png)
Но смотри, будешь на болванку сливать — не вздумай сжимать в mp3!
Классная мультиформатная кроссплатформенная библиотека для декодирования треков — это половина успеха. И к счастью BASS Library бесплатен для freeware проектов. А о половине поддерживаемых ею форматов — я даже не слышал. Отличный звук, написана на C, быстрая, компактная и кроссплатформенная. Вообще я был приятно удивлен сколько дверей открывается для freeware/opensource проектов.
All your files are belong to us.
Среднестатистический плеер под андроид (да и не только под андроид) предполагает 5 вариантов агрегации мультимедиа библиотеки.
Можно упорядочить треки по артистам, альбомам, жанрам, папкам или отобразить все треки единым списком. Мне это напоминает мультфильм «дудочка или кувшинчик». Там старичок-лесовичок давал девочке либо дудочку — чтобы можно было увидеть все ягодки, либо кувшинчик, чтобы их собрать. Допустим у вас есть папка «Мои любимые треки», в которой, ну например все треки, которые вы «лайкнули» на pandora.com, затем добавили в vk.com и синхронизировали с устройством. Если в данной папке несколько сотен треков, как у меня, то экраны со списком по артистам, альбомам и жанрам будут сильно перегружены избыточной информацией. Навигация по папкам — спасает, но файловая структура — древовидна. Какие то папки с альбомами могут быть вложены в папки с артистами, какие то нет. Становится неудобно выбирать несколько папок, и наконец они не упорядочены артистам-альбомам-годам. А всего то надо — отсортировать папки и представить в виде плоского двухуровнего дерева:
![Image #2079925, 92.6 KB Image #2079925, 92.6 KB](https://habrastorage.org/r/w1560/getpro/habr/post_images/478/6bb/10f/4786bb10fee669bc3271da8dc3f5abd8.png)
Папки группируются по артистам, сортируются по годам и наконец то можно за минимальное количество кликов выбрать папку «мои любимые треки», добавить пару любимых альбомов и вот тот микс, который я добавил на устройство совсем недавно.
Какая боль, какая боль, mediascaner vs пользователь — 5:0
Первая версия библиотеки треков была основана на стандартной медиабиблиотеке андроид (буквально 100 милисекунд — великолепно). Но тестируя функционал попадания треков в раздел недавно добавленные — я столкнулся с проблемой отсутствия недавно добавленных треков. Дело в том, что после добавления нового файла на устройство — он не сразу становится доступен. Сперва его должен увидеть сервис медиасканера, который ведет себя как манерная девица и толком стартует только после перезагрузки устройства (он еще и зависает, разряжая батарею при битом треке, но сейчас речь не об этом). Пришлось написать сканер файловой системы. Но раз у нас свой сканер файлов, то нужен и свой сканер тегов. Для этих целей я выбрал www.jthink.net/jaudiotagger. Он поддерживает все форматы которые поддерживает плеер и на первый взгляд довольно быстрый.
Всего 70 ms на файл. Я уже говорил что я меломан? У меня много файлов. И 70 милисекунд легко превращаются в минуты томительного ожидания. Окей в java можно скинуть arraylist в файл буквально несколькими строчками кода и при сканировании инкрементно добавлять только те треки, которые не были просканированы ранее. Повесив апдейт на кнопку refresh, например. Все стало работать быстро, пока я в один прекрасный день не поймал себя на том, что смотрю на список треков в собственной программе и не понимаю почему не появился трек залитый только что. Я забыл что надо нажимать кнопку refresh. Покопавшись в системе я не нашел события «новый файл», но нашел ACTION_POWER_DISCONNECTED. Подписавшись на него — уже можно запускать сканер каждый раз, когда пользователь вытащил шнур из usb, уже лучше. Но 70 миллисекунд остаются 70 миллисекундами. Я попробовал прикрутить библиотеку на C и 70 ms превратились в 30 ms. На первый взгляд прирост не существенный, но на 1000 треков так уже не кажется. Так родилась текущая версия сканера.
Let The Music Set You Free.
Легалайз. Всего за 169 рублей в месяц Google Music предоставляет возможность слушать музыку абсолютно легально, и более того, можно хранить свою медиатеку в их облаке. Конечно я не смог пройти мимо этого чуда и, купив подписку, первым делом кинулся реализовывать доступ к хранилищу из плеера. Однако не все получилось. Есть отличный Unofficial-Google-Music-API, написанный на Python, однако его java порты безнадежно устарели. Точнее нет проблем с воспроизведением музыки из облака, так залитые пользователем треки — не зашифрованы. Но треки из их магазина, доступные по подписке и из родного приложения — отдаются в зашифрованном виде, причем алгоритм постоянно меняется. И легального пути прослушать легально доступный трек легальному пользователю из нелегального приложения к сожалению нет. Я немного побарахтался с переписыванием с питона на java, но к сожалению ничего не вышло. Поэтому пока можно слушать только собственные треки. А жаль. Кстати, если я не ошибаюсь, собственные треки в облако гугл мьюзик можно заливать бесплатно.
Patterns and Textures.
Перерыв весь dribbble.com несколько раз во всех направлениях, мне показалось что ничего функциональнее Vox еще не придумали. Хотя конечно у меня странные на дизайнерский взгляд требования. Ужасно не люблю когда треклист спрятан где то в глубине, на другом экране, и тебе загадочно показывают обложку с тремя кнопками вместо него. А большинство современных дизайнов почему то реализует именно этот паттерн. Обложку можно показать и под треклистом, затенив, например (как это делает Vox). Либо если уж делать красоту — то делать красоту, с анимацией на opengl и «подключаемыми модулями зрительного образа». Ну вот, теперь Вы знаете откуда я черпал вдохновение. БОльшая часть нарисована программно, что надеюсь облегчит портирование на другие платформы.
It'$ Not For Money
Ну вот мы и плавно подобрались к теме портирования. А в кроссплатформенной разработке я нуб. Со стороны выгляди как — технологий куча, а на выходе печаль. Хочется чтобы приложение было не просто хорошим, а таким же классным — каким был WinAmp в свое время.
Для начала рассмотрел очевидные решения:
Java — громоздкая и тянет за собой JVM
Java Fx — тяжелая
Затем рассмотрел инновационные:
github.com/bigfatbrowncat/zetes — очень интересное и необычное решение. Но пока очень уж молодое. Но работает. (Автор на хабре — и прибьет меня, так как фреймворк еще не анонсирован)
Затем фрейморки ГИП:
Qt, GTK+, wxWidgets — и для каждого нашлись специфичные недостатки. В общем и целом — набор тяжеловесных инструментов.
Затем дерзкие:
mono — неприлично классное решение. Интерфейс пишется нативный, весит немного, писать легко. И я даже начал. А потом с удивлением понял что значительная часть бизнес логики приложения реализована на C, а если интерфейс все равно писать под каждую платформу то зачем нужен моно? Общая часть получается мизерная.
И еще раз рассмотрел пул очевидных решений — нативное приложение под каждую платформу. Проще всего это реализовать перенеся максимально на С. Например для musicbrainz — есть библиотека на C, ее можно интегрировать в приложение и тогда в каждом приложении остнется реализовать только интерфейс и ниточки за которые дергаются сишные либы. Тут проблема только одна. Надо выучить С.
Why can't i see what's in front of me
Вот на этом месте я начал понимать что без помощи сообщества мне ну никак не обойтись. Итак, что есть прямо сейчас:
— репозиторий android версии приложения bitbucket.org/recoilme/freeamp
— собственно приложение play.google.com/store/apps/details?id=ru.recoilme.freeamp
Приложение может:
— проигрывать кучу различных форматов
— сканировать треки, считывать теги
— представлять медиабиблиотеку в удобном виде
— частично интегрировано с сервисом Gooogle music
— максимально эффективно использовать ресурсы системы (не жрет батарею проще говоря, совсем забыл рассказать об этой борьбе)
Запланированный на ближайшее время функционал:
— интеграция с musicbrainz и last.fm. Максимум информации о каждом исполнителе, скробблинг, поиск обложек, лирики и так далее
— интеграция с музыкальными сервисами (vk + soundcloud)
— интеграция с интернет радиостанциями (прикрутить список по сути, басс умеет с ними из коробки работать)
— всякие мелкие задачки (налетай! разбирай!): bitbucket.org/recoilme/freeamp/issues?status=new&status=open
и многое другое. Проект пока молодой и пилится в основном по выходным|вечерам, но, надеюсь, перспективный
А также есть отложенные большие задачи, которые пока мне не по зубам:
— например собрать libmusicbrainz под android
— написать модуль зрительного образа и вывести его на локскрин, например
— переписать медиасканер на си
— ну и глобально, начать портировать под мак, потом под linux, потом под прочие платформы.
Welcome to contribute!
Приложение:
2H Company — Филип Дик
2H Company — Культиватор
The Orb — Let The Music Set You Free
The Orb — Earth (Gaia) — Patterns and Textures — Trk 2
Argaman — It'$ Not For Money
Infected Mushroom — In Front of Me
![image](https://habrastorage.org/getpro/habr/post_images/de4/5ca/f1f/de45caf1f2336d674ac9c14fb27110b1.png)
Но смотри, будешь на болванку сливать — не вздумай сжимать в mp3!
Классная мультиформатная кроссплатформенная библиотека для декодирования треков — это половина успеха. И к счастью BASS Library бесплатен для freeware проектов. А о половине поддерживаемых ею форматов — я даже не слышал. Отличный звук, написана на C, быстрая, компактная и кроссплатформенная. Вообще я был приятно удивлен сколько дверей открывается для freeware/opensource проектов.
All your files are belong to us.
Среднестатистический плеер под андроид (да и не только под андроид) предполагает 5 вариантов агрегации мультимедиа библиотеки.
Можно упорядочить треки по артистам, альбомам, жанрам, папкам или отобразить все треки единым списком. Мне это напоминает мультфильм «дудочка или кувшинчик». Там старичок-лесовичок давал девочке либо дудочку — чтобы можно было увидеть все ягодки, либо кувшинчик, чтобы их собрать. Допустим у вас есть папка «Мои любимые треки», в которой, ну например все треки, которые вы «лайкнули» на pandora.com, затем добавили в vk.com и синхронизировали с устройством. Если в данной папке несколько сотен треков, как у меня, то экраны со списком по артистам, альбомам и жанрам будут сильно перегружены избыточной информацией. Навигация по папкам — спасает, но файловая структура — древовидна. Какие то папки с альбомами могут быть вложены в папки с артистами, какие то нет. Становится неудобно выбирать несколько папок, и наконец они не упорядочены артистам-альбомам-годам. А всего то надо — отсортировать папки и представить в виде плоского двухуровнего дерева:
![Image #2079925, 92.6 KB Image #2079925, 92.6 KB](https://habrastorage.org/getpro/habr/post_images/478/6bb/10f/4786bb10fee669bc3271da8dc3f5abd8.png)
Папки группируются по артистам, сортируются по годам и наконец то можно за минимальное количество кликов выбрать папку «мои любимые треки», добавить пару любимых альбомов и вот тот микс, который я добавил на устройство совсем недавно.
Какая боль, какая боль, mediascaner vs пользователь — 5:0
Первая версия библиотеки треков была основана на стандартной медиабиблиотеке андроид (буквально 100 милисекунд — великолепно). Но тестируя функционал попадания треков в раздел недавно добавленные — я столкнулся с проблемой отсутствия недавно добавленных треков. Дело в том, что после добавления нового файла на устройство — он не сразу становится доступен. Сперва его должен увидеть сервис медиасканера, который ведет себя как манерная девица и толком стартует только после перезагрузки устройства (он еще и зависает, разряжая батарею при битом треке, но сейчас речь не об этом). Пришлось написать сканер файловой системы. Но раз у нас свой сканер файлов, то нужен и свой сканер тегов. Для этих целей я выбрал www.jthink.net/jaudiotagger. Он поддерживает все форматы которые поддерживает плеер и на первый взгляд довольно быстрый.
Всего 70 ms на файл. Я уже говорил что я меломан? У меня много файлов. И 70 милисекунд легко превращаются в минуты томительного ожидания. Окей в java можно скинуть arraylist в файл буквально несколькими строчками кода и при сканировании инкрементно добавлять только те треки, которые не были просканированы ранее. Повесив апдейт на кнопку refresh, например. Все стало работать быстро, пока я в один прекрасный день не поймал себя на том, что смотрю на список треков в собственной программе и не понимаю почему не появился трек залитый только что. Я забыл что надо нажимать кнопку refresh. Покопавшись в системе я не нашел события «новый файл», но нашел ACTION_POWER_DISCONNECTED. Подписавшись на него — уже можно запускать сканер каждый раз, когда пользователь вытащил шнур из usb, уже лучше. Но 70 миллисекунд остаются 70 миллисекундами. Я попробовал прикрутить библиотеку на C и 70 ms превратились в 30 ms. На первый взгляд прирост не существенный, но на 1000 треков так уже не кажется. Так родилась текущая версия сканера.
Let The Music Set You Free.
Легалайз. Всего за 169 рублей в месяц Google Music предоставляет возможность слушать музыку абсолютно легально, и более того, можно хранить свою медиатеку в их облаке. Конечно я не смог пройти мимо этого чуда и, купив подписку, первым делом кинулся реализовывать доступ к хранилищу из плеера. Однако не все получилось. Есть отличный Unofficial-Google-Music-API, написанный на Python, однако его java порты безнадежно устарели. Точнее нет проблем с воспроизведением музыки из облака, так залитые пользователем треки — не зашифрованы. Но треки из их магазина, доступные по подписке и из родного приложения — отдаются в зашифрованном виде, причем алгоритм постоянно меняется. И легального пути прослушать легально доступный трек легальному пользователю из нелегального приложения к сожалению нет. Я немного побарахтался с переписыванием с питона на java, но к сожалению ничего не вышло. Поэтому пока можно слушать только собственные треки. А жаль. Кстати, если я не ошибаюсь, собственные треки в облако гугл мьюзик можно заливать бесплатно.
Patterns and Textures.
Перерыв весь dribbble.com несколько раз во всех направлениях, мне показалось что ничего функциональнее Vox еще не придумали. Хотя конечно у меня странные на дизайнерский взгляд требования. Ужасно не люблю когда треклист спрятан где то в глубине, на другом экране, и тебе загадочно показывают обложку с тремя кнопками вместо него. А большинство современных дизайнов почему то реализует именно этот паттерн. Обложку можно показать и под треклистом, затенив, например (как это делает Vox). Либо если уж делать красоту — то делать красоту, с анимацией на opengl и «подключаемыми модулями зрительного образа». Ну вот, теперь Вы знаете откуда я черпал вдохновение. БОльшая часть нарисована программно, что надеюсь облегчит портирование на другие платформы.
It'$ Not For Money
Ну вот мы и плавно подобрались к теме портирования. А в кроссплатформенной разработке я нуб. Со стороны выгляди как — технологий куча, а на выходе печаль. Хочется чтобы приложение было не просто хорошим, а таким же классным — каким был WinAmp в свое время.
Для начала рассмотрел очевидные решения:
Java — громоздкая и тянет за собой JVM
Java Fx — тяжелая
Затем рассмотрел инновационные:
github.com/bigfatbrowncat/zetes — очень интересное и необычное решение. Но пока очень уж молодое. Но работает. (Автор на хабре — и прибьет меня, так как фреймворк еще не анонсирован)
Затем фрейморки ГИП:
Qt, GTK+, wxWidgets — и для каждого нашлись специфичные недостатки. В общем и целом — набор тяжеловесных инструментов.
Затем дерзкие:
mono — неприлично классное решение. Интерфейс пишется нативный, весит немного, писать легко. И я даже начал. А потом с удивлением понял что значительная часть бизнес логики приложения реализована на C, а если интерфейс все равно писать под каждую платформу то зачем нужен моно? Общая часть получается мизерная.
И еще раз рассмотрел пул очевидных решений — нативное приложение под каждую платформу. Проще всего это реализовать перенеся максимально на С. Например для musicbrainz — есть библиотека на C, ее можно интегрировать в приложение и тогда в каждом приложении остнется реализовать только интерфейс и ниточки за которые дергаются сишные либы. Тут проблема только одна. Надо выучить С.
Why can't i see what's in front of me
Вот на этом месте я начал понимать что без помощи сообщества мне ну никак не обойтись. Итак, что есть прямо сейчас:
— репозиторий android версии приложения bitbucket.org/recoilme/freeamp
— собственно приложение play.google.com/store/apps/details?id=ru.recoilme.freeamp
Приложение может:
— проигрывать кучу различных форматов
— сканировать треки, считывать теги
— представлять медиабиблиотеку в удобном виде
— частично интегрировано с сервисом Gooogle music
— максимально эффективно использовать ресурсы системы (не жрет батарею проще говоря, совсем забыл рассказать об этой борьбе)
Запланированный на ближайшее время функционал:
— интеграция с musicbrainz и last.fm. Максимум информации о каждом исполнителе, скробблинг, поиск обложек, лирики и так далее
— интеграция с музыкальными сервисами (vk + soundcloud)
— интеграция с интернет радиостанциями (прикрутить список по сути, басс умеет с ними из коробки работать)
— всякие мелкие задачки (налетай! разбирай!): bitbucket.org/recoilme/freeamp/issues?status=new&status=open
и многое другое. Проект пока молодой и пилится в основном по выходным|вечерам, но, надеюсь, перспективный
А также есть отложенные большие задачи, которые пока мне не по зубам:
— например собрать libmusicbrainz под android
— написать модуль зрительного образа и вывести его на локскрин, например
— переписать медиасканер на си
— ну и глобально, начать портировать под мак, потом под linux, потом под прочие платформы.
Welcome to contribute!
Приложение:
2H Company — Филип Дик
2H Company — Культиватор
The Orb — Let The Music Set You Free
The Orb — Earth (Gaia) — Patterns and Textures — Trk 2
Argaman — It'$ Not For Money
Infected Mushroom — In Front of Me