Android Studio: извлечение метаданных mp3 из потокового URL Shoutcast [duplicate]

В дополнение к нарушению первой нормальной формы из-за повторяющейся группы значений, хранящихся в одном столбце, в списках, разделенных запятыми, есть много других более практических проблем:

  • Невозможно гарантировать, что каждое значение является правильным типом данных: невозможно предотвратить 1,2,3, banana, 5
  • Невозможно использовать ограничения внешнего ключа привязать значения к таблице поиска; нет возможности обеспечить ссылочную целостность.
  • Невозможно обеспечить уникальность: невозможно предотвратить 1,2,3,3,3,5
  • Can 't удалить значение из списка, не извлекая весь список.
  • Не удается сохранить список дольше, чем в столбце строки.
  • Трудно найти все объекты с заданное значение в списке; вы должны использовать неэффективное сканирование таблицы. Возможно, придется прибегать к регулярным выражениям, например, в MySQL: idlist REGEXP '[[:<:]]2[[:>:]]' *
  • Жестко подсчитывать элементы в списке или выполнять другие агрегированные запросы.
  • Трудно присоединиться к значениям к справочной таблице, к которой они ссылаются.
  • Жесткий выбор списка в отсортированном порядке.
  • Сохранение целых чисел в виде строк занимает в два раза больше места, чем сохранение двоичных целых чисел. Не говоря уже о пространстве, взятом запятыми.

Чтобы решить эти проблемы, вам нужно написать тонны кода приложения, заново изобрести функциональные возможности, которые СУБД уже обеспечивает гораздо более эффективно .

Списки, разделенные запятыми, настолько ошибочны, что я сделал это первой главой в моей книге: SQL Antipatterns: избегайте ошибок программирования баз данных .

Бывают случаи, когда вам нужно использовать денормализацию, но, поскольку @OMG Ponies упоминает , это исключения. Любая нереляционная «оптимизация» выгодна для одного типа запросов за счет других видов использования данных, поэтому убедитесь, что знаете, какие из ваших запросов нужно обрабатывать так специально, что они заслуживают денормализации.


* MySQL 8.0 больше не поддерживает этот синтаксис выражения слова-границы.

3
задан user1885868 10 May 2013 в 16:11
поделиться

2 ответа

Поскольку класс в ответе @ William-Seemann больше не используется. Вот альтернатива (с тем, что она не требует каких-либо библиотек):

Добавьте следующий проект class в ваш проект. Теперь вы можете использовать его, как показано здесь здесь . Вы также можете использовать его следующим образом:

    String title = "";
    IcyStreamMeta meta = new IcyStreamMeta();
    try {
        meta.setStreamUrl(new URL(YOURURL));
        title = meta.getStreamTitle();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

Полный кредит для dazza5000 для создания проекта.

4
ответ дан Mdlc 22 August 2018 в 03:35
поделиться
  • 1
    Но как я могу прослушать «измененный трек»? событие для обновления ярлыка, например? – johnnyshrewd 30 January 2018 в 15:02
  • 2
    @johnnyshrewd У этого класса нет слушателя. Возможно, создайте свой собственный «прослушиватель событий», выполнив приведенный выше фрагмент каждые x секунд, пока в заголовке не будет обнаружено изменение, по которому вы можете вызвать своего слушателя. – Mdlc 1 February 2018 в 10:59

Я создал свой собственный класс для извлечения метаданных на основе модифицированной версии streamscraper . Используйте этот jar (streamscraper), этот jar (jsoup) и этот класс для извлечения метаданных. Интерфейс похож на MediaMetadataRetriever:

ShoutCastMetadataRetriever smr = new ShoutCastMetadataRetriever();
smr.setDataSource(<some url>);
String artist = smr.extractMetadata(ShoutCastMetadataRetriever.METADATA_KEY_ARTIST);
String title = smr.extractMetadata(ShoutCastMetadataRetriever.METADATA_KEY_TITLE);

Я не верю, что метаданные SHOUTcast поддерживают обложку альбома, поэтому вы не сможете ее восстановить.

6
ответ дан William Seemann 22 August 2018 в 03:35
поделиться
  • 1
    SHOUTcast v1 даже не поддерживает исполнителя или титул. Это всего лишь одна строка, которая обычно форматируется как artist - title. SHOUTcast v2 предоставляет обложку альбома, если она доступна в кодере. – Brad 11 May 2013 в 15:28
  • 2
    Теперь вы противоречите себе. Ваше сообщение говорит, что обложки альбома нет. Цитата, которую вы берете из ссылки, которую я разместил, говорит, что данные являются in-stream. – Brad 13 May 2013 в 04:40
  • 3
    Работает отлично @WilliamSeeman спасибо! Для этого просто нужен jsoup jar from sourceforge.net/p/servestream/code/HEAD/tree/trunk/libs/… – user1885868 13 May 2013 в 09:45
  • 4
    @WilliamSeeman, так что теперь у нас будет 2 setDataSources (путь)? Один для медиаплеера, а другой для метаданных? когда я вызываю setDataSources на smr, я получаю net.moraleboost.streamscraper.ScrapeException. идеи? – tony9099 17 July 2013 в 10:46
  • 5
    Привет, Уильям Seemann, вы можете добавить ссылку на свой класс ShoutCastMetadataRetriever, потому что ссылка мертва. Спасибо – Pavol Franek 31 July 2014 в 16:24
Другие вопросы по тегам:

Похожие вопросы: