Export to GitHub

cuberok - issue #22

Cuberok должен добавлять в список только поддерживаемые форматы файлов


Posted on May 5, 2009 by Swift Monkey

What steps will reproduce the problem? 1. Открыть боковую панель "Файлы" и выбрать любую папку, в которой кроме треков есть, например, обложка альбома в jpg файле, файл лицензии и т.п. 2. Перетащить папку в список воспроизведения

What is the expected output? What do you see instead? Ожидаемый результат: только треки из папки добавляются в список воспроизведения Получаемый результат: В список добавляются треки, картинки, текстовые файлы и все что лежало в папке

What version of the product are you using? On what operating system? Версия плеера 0.0.9, то же самое наблюдалось и в предидущих версиях. ОС WinXP SP3.

Comment #1

Posted on May 6, 2009 by Swift Kangaroo

Согласен, имеет место быть бага. Работы ведутся.

Comment #2

Posted on May 18, 2009 by Quick Giraffe

Кстати, здесь же, наверно, можно учесть такую особенность: сейчас, когда в одной папке лежат и cue, и образ, в плейлист добавляется этот образ потреково и дополнительно он же целиком.

Cuberok v 0.0.10 build: 19:37:36 May 18 2009 Qt: 4.5.1 X11 Current plugin: Phonon Available plugins are: Null engine GStreamer Phonon

Gentoo Linux

Comment #3

Posted on May 26, 2009 by Happy Ox

иногда при этом плеер еще и крашится или зависает

Comment #4

Posted on Jun 2, 2009 by Quick Giraffe

Насколько я понимаю, просить стоит здесь.

В некотрых cue-файлах указан образ, который на самом деле не существует. Очень часто в скачанной раздаче лежат либо два cue (в одном указан образ CDImage.wav, в другом - CDImage.ape), либо один, но который указывает на CDImage,wav, хотя в раздаче лежит ape или flac.

Предлагаю детектить такие ситуации и если файл образа, который указан в cue, не существует, показывать пользователю диалог, типа CUE $имяфайла.cue указывает на образ $имяобраза.wav, который не существует. Что делать? [не загружать cue] [указать другой файл] если выбрано "указать другой файл" то тут пользователю можно дополнительно предложить (O) исправить имя файла в cue () создать второй cue-файл в той же папке с исправленным именем файла () нечего не менять и не создавать (при следующем обращении в этому cue придётся снова отвечать на эти вопросы

Вот как-то так :)

Comment #5

Posted on Jun 3, 2009 by Swift Kangaroo

Пора мне отдельный список фичреквестов завести, чтобы не запутаться...

Comment #6

Posted on Jun 3, 2009 by Quick Giraffe

Да, пожалуй, дейтвительно стоит выделить Comment 4 в отдельный вопрос. Тем более, что остаются непонятки с ним.

так что, извините, что подвортил топик, считаем, что этого фичереквеста в нём не было. http://code.google.com/p/cuberok/issues/detail?id=43

Comment #7

Posted on Jul 7, 2009 by Swift Kangaroo

This issue was closed by r244.

Comment #8

Posted on Jul 7, 2009 by Quick Giraffe

Перетаскивал в плейлист фот такую папку, добавились флаки и лог

01 - Reise, Reise.flac 02 - Mein Teil.flac 03 - Dalai Lama.flac 04 - Keine Lust.flac 05 - Los.flac 06 - Amerika.flac 07 - Moskau.flac 08 - Morgenstern.flac 09 - Stein Um Stein.flac 10 - Ohne Dich.flac 11 - Amour.flac cover.jpg Rammstein - Reise, Reise.cue Rammstein - Reise, Reise.cue2tracks.log

cue не добавился и не должен был (нет файла, на который оно указывает), картинка не добавилась (и не должна).

Comment #9

Posted on Jul 8, 2009 by Swift Kangaroo

r247 Хочу отметить, что определение неподдерживаемого формата файла происходит исключительно по расширению, и даже по небольшому списку таковых ибо Ибо в реале отличить музыкальный файл от ерунды всякой может только бакэнд, а дёргать его на каждый из многих сотен файлов представляется мне нерациональным.

по сему список на настоящий момент далеко не полный и его можно дополнять: if(suf == "jpg" || suf == "png" || suf == "txt" || suf == "doc" || suf == "log" || suf.startsWith("htm") || !suf.size() || !base.size())

Comment #10

Posted on Jul 8, 2009 by Quick Giraffe

А мы точно не можем заранее, при подгрузке бэкэнда, выяснить, какие mime-типы он поддерживает? А потом по ним отсеивать. Я видел, что в плагинах есть некий список. Или в винде нереально mime-тип определить? Насколько я понимаю, список поддерживаемых типов всегда будет короче, чем список неподдерживаемых )))

Вот, например, у меня есть раздача специального издания, где в одном каталоге лежат DVD и mp3. Я, не особо замарачиваясь, перетащил всю раздачу в проигрыватель и все файлы с DVD (всякие VIDEO_TS.VOB) у меня теперь в плейлисте ;-)

Comment #11

Posted on Jul 8, 2009 by Swift Kangaroo

емнип только у фонона есть спец функция для определения поддерживаемых mime типов, и та (по крайней мере в винде) работает из рук вон косо

С другой стороны VOB содержит аудио дорожку и банить его будет некорректно, сам видал как кореша на компе смотрели кино, а с ноута его же слушали :-)

Меня в существующей схеме больше всего смущает возможность несоответствия расширения и типа. Я рад бы переделать, но как?

Comment #12

Posted on Jul 8, 2009 by Quick Giraffe

Меня в существующей схеме больше всего смущает возможность несоответствия расширения и типа. Меня вообще этот, откровенно говоря, виндовый способ определения типа файла смущал ещё когда я на винде сидел.

Я правильно понимаю, что только на gstreamer есть потенциальная возможность изменения списка поддерживаемых форматов? Предлагаю наобум такой вариант (мне нравится тем, что он расширяемый): 1. Получаем от плагина список форматов (mime), которые он, теоретически, может играть. Этот список может быть прошит в коде (как сейчас, например, в том же phonon) или оперделяться динамически, если бэкэнд это позволяет. Это костяк. 2. В настройках плагина добавляем раздел "поддерживаемые форматы". Здесь отображаем список форматов, которые мы уже считаем поддерживаемыми, с возможность удаления элементов из этого списка. Для добавления формата предлагаем указать музыкальный файл, определяем его параметры и добавляем формат этого файла в список. Естественно, "служебные" форматы вроде *.pls, *.m3u и *.cue в список поддерживаемых форматов добавлять не нужно, о чём пользователя можно предупредить прямо в окне настроек, чтоб не забывал. 3. при добавлении файлов в плейлист сверяемся со списком поддерживаемых форматов для текущего бэкэнда. 4. при динамической смене бэкэнда файлы в плейлисте, которые имеют неподдерживаемый формат, делаем "серыми", они остаются в плейлисте, но не воспроизводятся, а пользователю ненавязчиво предлагается их удалить из списка или выбрать другой бэкэнд.

Вот как-то так. Мне вчера уже сказали, что фантазия у меня слишком богатая )))

Comment #13

Posted on Jul 8, 2009 by Quick Giraffe

btw, http://qt-apps.org/content/show.php/QFreeDesktopMime?content=86454

Comment #14

Posted on Jul 8, 2009 by Swift Kangaroo

В целом поддерживаю, однако будет проблема с phonon, у него есть собственные бакэнды, которые могут пропадать и появляться без предупреждения. Придётся при каждом запуске мониторить список типов для него.

Comment #15

Posted on Jul 8, 2009 by Swift Kangaroo

(No comment was entered for this change.)

Comment #16

Posted on Jul 8, 2009 by Quick Giraffe

Придётся при каждом запуске мониторить список типов для него. Просто интересно: каким образом? Спрашиваю не чтобы подискутировать, я просто не представляю. Если от фонона можно получить используемый им бэкэнд, тогда могу предположить...

Кстати, если уж делать таким способом, то при добавлении файлов в плейлист можно, как в amarok показывать всплывашку с надписью "некоторые файлы не были добавлены в плейлист, потому что формат считается непоодерживаемым", только в отличие от амарок, полагаю, нужно добавить кнопки "показать список недобавленных файлов" и "перейти к настройкам поддерживаемых форматов"

Comment #17

Posted on Jul 8, 2009 by Swift Kangaroo

Для phonon получить бакэнд нельзя (или я просто не знаю как), но можно спросить Phonon::BackendCapabilities::isMimeTypeAvailable(mimetype) и, предполагая, что бакенд с прошлого запуска мог измениться, проверять все допустимые типы на корректность при запуске. Что с ними делать если он окажется некорректным я не знаю. Теоретически может быть такая ситуация: заполнен список эмпетрями, играет пестня, cuberok на всём скаку закрывают. Потом из дистриба удаляется (условно) libmad и cuberok запускается вновь. Весь список внезапно окажется неподдерживаемым phonon.

По поводу всплывашки отдельная песня: Щас штатным методом работы считается ругань в окно сообщений, значёк даже меняется при ошибках. Я согласен, что нередко нужна какая-то интерактивность, или просто более видное сообщение об ошибке. Однако не могу придумать механизм интерактивности в общем виде... Кнопка "отменить задание" у меня фактически не работает, для коррекции cue образов пришлось прокидывать специальные сигналы в gui thread. Есть мысли по поводу общей реализации и механизмов?

Comment #18

Posted on Jul 8, 2009 by Quick Giraffe

Теоретически может быть такая ситуация: заполнен список эмпетрями, играет пестня, cuberok на всём скаку закрывают. Потом из дистриба удаляется (условно) libmad и cuberok запускается вновь. Весь список внезапно окажется неподдерживаемым phonon.

Ну, в такой ситуации тоже можно делать позиции "серыми" в плейлисте. Как я понимаю, сейчас такого механизма нет, но если такой вариант делать, то лучше наверно сразу, а не после вынесения в плагины. Если такой вариант невозможен в принципе, то можно подумать ещё о чем-нибудь.

нередко нужна какая-то интерактивность, или просто более видное сообщение об ошибке. Как я это вижу... Я полагаю, что можно добавить ещё один док-виджет, но чтобы пользователь не управлял им самостоятельно. Этот виджет сделать обработчиком сообщений. Если сообщение важное - виджет "вылезает", отображается, например вот так, как на каритнке, "потеснив" существующие док-виджеты. http://h.imagehost.org/0110/error_dialog_mockup.png Все "неважные" сообщения добавляются в список и просматриваются как лог по требованию. "Важные" сообщения тоже добавляются в список, но и отображаются отдельно, с кнопками "закрыть", "следующее", "предыдущее". В качестве "важного" сообщения можно передавать не только текст, но и готовый виджет со своими кнопками, например. Можно предусмотреть таймауты для закрытия этих виджетов, если это несложно. В итоге получается маленький такой браузер для просмотра ошибок, который вылезает сам, если что-то случится и прячется либо вручную, либо по таймауту.

Недостатки: слишком "круто" и сложно; возможно, будет некрасиво, если пользователь как- то по-своему расположил док-виджеты.

А про кнопку "отменить задание" я так и не понял, что она делает ))

Comment #19

Posted on Jul 24, 2009 by Swift Kangaroo

Ща приделал следующую фичу:

Если выбрать автоматический аудио вывод, то на вкладке "Настройка звука" можно будет задать для любого mime предпочтительный бакэнд. Проверки пока нету, можно и на audiere повесить кота в мешке, и оно честно будет пытацо запустицо. Эту фичу в принципе можно использовать как workaround для ape, который не играется на ffmpeg

Интересует юзабельность этого подхода с точки зрения пользователя.

Comment #20

Posted on Jul 24, 2009 by Quick Giraffe

Фишка интересная, только похоже, что тип файла, который определяет проигрыватель, не значится в предлагаемом списке (можно читать как "у меня не заработало"). Если оставить, то нужно указывать предпочитаемый вывод, который используется для типов, не заданных в табличке.

В плане "юзабельность этого подхода" - фишка может позиционироваться как "для продвинутых пользователей", которые не только понимают, что такое mime-type и какие у них есть плагины вывода, но и отличают звучание одного и того же файла на разных движках. Тогда эти пользователи смогут, например, заставить проигрыватель воспроизводить mp3 через GStreamer, который, например, использует mad, а flac через ffmpeg, который, например, корректнее работает с его метаданными.

Тут важно, чтобы наличие этого функционала не замедляло переход между треками и не усложняло поддержку кода. Линуксоиды любят рассказывать, что такие функции не нужны, я же считаю, что нужны любые функции, которые кто-то может использовать, если они не портят программу, конечно.

======== По поводу "не заработало": у меня все файлы играются GStreamer'ом, хотя я указал играть mime audio/ogg через ffmpeg

$ kfile -av ~/Музыка/Король\ и\ Шут/2008\ -\ Тень\ Клоуна/09\ -\ Кода.ogg /home/name_no/Музыка/Король и Шут/2008 - Тень Клоуна/09 - Кода.ogg: Звуковой файл Ogg Vorbis (audio/vorbis)

Comment #21

Posted on Jul 24, 2009 by Swift Kangaroo

а если поставить не audio/ogg а application/ogg? r279

Там ещё можно проверить так, в исходниках в папочке QFreeDesktopMime собрать его тестилку и запустить test interested_file (меня самого избыточность ogg типов напрягает)

Ещё добавлю установку движка по умолчанию для авто... Про продвинутых пользователей: щитаю это направление перспективным, advanced фичи будут

Оверхеда кстати эта фича не накладывает, ибо все бакэнды инициализируются заранее и меняются между собой без задержки.

Comment #22

Posted on Jul 24, 2009 by Swift Kangaroo

Ещё добавлю установку движка по умолчанию для авто... r280

Comment #23

Posted on Jul 24, 2009 by Quick Giraffe

Тестик пришлось подредактировать ))))

Index: src/test.cpp

--- src/test.cpp (revision 278) +++ src/test.cpp (working copy) @@ -48,14 +48,18 @@ qDebug() << mime.fromFileName("test.h"); qDebug() << mime.description();

  • qDebug() << "Start arguments"; if (argc > 1) {
  • if (QFileInfo(argv[1]).isDir()) {
  • QDir dir(argv[1]);
  • //dir.setFilter(QDir::Files);
  • foreach (QFileInfo fileInfo, dir.entryInfoList())
  • qDebug() << "-" << mime.fromFile (fileInfo.absoluteFilePath()) << fileInfo.fileName();
  • } else {
  • qDebug() << "-" << mime.fromFile(argv[1]) << argv[1];
  • for (int i = 1; i < argc; i++) {
  • QString f = QString::fromLocal8Bit(argv[i]);
  • if (QFileInfo(f).isDir()) {
  • QDir dir(f);
  • //dir.setFilter(QDir::Files);
  • foreach (QFileInfo fileInfo, dir.entryInfoList())
  • qDebug() << "-" << mime.fromFile (fileInfo.absoluteFilePath()) << fileInfo.fileName();
  • } else {
  • qDebug() << "-" << mime.fromFile(f) << f;
  • } } }

Start arguments - "audio/x-vorbis+ogg" "/home/name_no/Музыка/Король и Шут/2008 - Тень Клоуна/09 - Кода.ogg" - "application/x-cue" "/home/name_no/Музыка/Sex Pistols/Sex Pistols-Flogging A Dead Horse/Sex Pistols - Flogging A Dead Horse.cue"

Выставил "audio/x-vorbis+ogg" - сработало.

Кстати, после того, как воспользовался тестом, заметил, что, кажется, cuberok забывает переключиться на автовыбранный плагин при переходе на трек, которого нет в табличке. Похоже, что это решится само собой когда появится "плагин по дефолту".

Например: в табличке задано только "audio/x-vorbis+ogg" -> FFmpeg Запускаем проигрывтель. Cuberok играет mp3 плагином GStreamer. Переходим на ogg-трек. Cuberok переключается на FFmpeg. Переходим на mp3-трек - он воспроизводится плагином FFmpeg.

Comment #24

Posted on Jul 24, 2009 by Quick Giraffe

Мдя...

$ test-mime./01\ Holidays\ In\ The\ Sun.flac ............. - "audio/mpeg" "./01 Holidays In The Sun.flac"

Comment #25

Posted on Jul 28, 2009 by Swift Kangaroo

r287 Добавил экспериментальную всплывашку в левом нижнем углу приложения. Пока туда попадают все записи из "Сообщений". Поскольку полноценный OSD мне не представляется возможным, требуется придумать как этой штукой будет удобнее пользоваться. Привязывать ли её к главному окну, или к десктопу?

Ещё туда добавлю опциональную кнопку отмены, и будет примерно следующее: Кинул пользователь в плейлист всю домашнюю папку, вылезло сообщение "добавление папки такой-то", в течении десяти секунд (если машина задохнулась от щастья такого) у пользователя есть возможность прессануть по батончику "отмена", и насилие над винтом мгновенно прекратится. Тоже самое будет для длительных операций типа: - полезли в инет зачем-то - нажали пересканировать библиотеку, или кинули туда папку гигов на ндцать

Comment #26

Posted on Jul 28, 2009 by Quick Giraffe

Эта штука "похищает фокус" )))))

Активно работаю в консоли, cuberok на другом рабочем столе. При смене трека всплывашка вылезает на моём рабочем столе и пока она не исчезнет - клавиатурный ввод не идёт в консоль. Это на r288.

Comment #27

Posted on Jul 28, 2009 by Swift Kangaroo

r289 вроде поправил, проверил на гноме

Comment #28

Posted on Jul 28, 2009 by Quick Giraffe

Да, это помогло от перехвата фокуса.

Теперь нужно сделать ещё одну фишку: 1. Переключаемся в окно cuberok. 2. Запускаем следующий трек. Всплывашка появляется в углу окна cuberok 3. Переключаемся в другое окно. Всплывашка оказывается посреди экрана и всё загораживает )))

P.S. Предлагаю ещё так: $ svn diff src/messagewindow.cpp src/resource.qrc

Index: src/messagewindow.cpp

--- src/messagewindow.cpp (revision 289) +++ src/messagewindow.cpp (working copy) @@ -33,7 +33,7 @@ QLabel *label = new QLabel(mes, this); label->setWordWrap(true); vl->addWidget(label); - QPushButton *b = new QPushButton("X", this); + QPushButton *b = new QPushButton(QIcon(":/icons/edit-add.png"), "", this); connect(b, SIGNAL(clicked(bool)), this, SLOT(close())); b->setMaximumSize(24, 24); hl->addWidget(b);

Index: src/resource.qrc

--- src/resource.qrc (revision 289) +++ src/resource.qrc (working copy) @@ -61,5 +61,6 @@ ../images/gohome.png ../images/back.png ../images/forward.png + ../images/edit-add.png

Attachments

Comment #29

Posted on Jul 30, 2009 by Quick Giraffe

Круто, FFmpeg плагин играет архив rar, в котором лежат отдельные треки mp3. Шикарно.

Comment #30

Posted on Jul 30, 2009 by Swift Kangaroo

удивлён весьма! воспроизвести не могу ни на винде ни на lenny

Comment #31

Posted on Jul 30, 2009 by Quick Giraffe

А жаль, потому что даже seek работает как положено. Единственное, чего не хвататет, так это отображения времени: http://a.imagehost.org/0467/screen_08.png

Ещё попробую cue для rar-файла создать, хотя без времени, видимо, работать не будет ))))

Comment #32

Posted on Jul 30, 2009 by Quick Giraffe

З.Ы. отдельный issue создавать не тянет. По поводу "можешь сам коммитить": я вчера попробовал и сразу у нас получилась коллизия:

http://code.google.com/p/cuberok/source/detail?r=291 http://code.google.com/p/cuberok/source/browse/trunk/src/main.cpp? spec=svn293&r=293#195

собственно, поэтому и стараюсь присылать патчи, а не коммитить их самостоятельно.

Comment #33

Posted on Jul 30, 2009 by Swift Kangaroo

это я вчера накосячил когда macos мучал

кстати, на макоси это дело вызывало ошибочку (создание shared memory перед аппликейшеном). Потом посмотрю по-подробнее, разведу как нибудь

Comment #34

Posted on Jul 30, 2009 by Swift Kangaroo

кстати, если есть возможность, нужно потестить на MacOS... буду весьма признателен

Status: Started

Labels:
Type-Defect Priority-Medium