[wlx/wdx] TCMediaInfo

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

790
Сообщения: 357
Зарегистрирован: Сб авг 09, 2008 18:08

Сообщение 790 »

Duration в контент-варианте плагина, запутался с нулями. Заменил h, mm, sec на ":"

Код: Выделить всё

<column name="Duration">
			<unit name="hh:mm:ss" type="script">Output:=TimingFormat('%h:%mm:%ss', Duration);</unit>
			<unit name="hh:mm:ss.fff" type="script">Output:=TimingFormat('%hh:%mm:%ss.%fff', Duration);</unit>
			<unit name="s" type="script">Output:=Trunc(Duration/1000);</unit>
			<unit name="z">Duration</unit>
			<unit name="Custom" type="script">
			<![CDATA[
				// this is an example of using scripts in columns
				Output:='';
				if Not StrIsNumber(Duration) then Exit;
				nDur := Number(Duration);
				Hour:=Trunc(nDur/3600000);
				Min:=Trunc((nDur-Hour*3600000)/60000);
				Sec:=Trunc((nDur-Hour*3600000-Min*60000)/1000);
				if (Hour <> 0) then Output:=String(Hour)+':';
				if (Min <> 0) then Output:=Output+String(Min)+':';
				if (Sec <> 0) then Output:=Output+String(Sec);
			]]>
			</unit>
		</column>
Хотелось бы использовать пользовательский режим, чтобы продолжительность трека отображалась в виде 0:00:00 (если есть "часы") или 0:00 (если нет "часов") или 00 (если нет "минут"). Но получается, что если продолжительность 10:08, то будет показано как 10:8, а если 1:00:05, то будет 1:5
Можно ли написать, например:

Код: Выделить всё

if (Hour <> 0) then Output:=String(Hour)+':';
if (Min = 0) or (Min > 9) then Output:=Output+String(Min)+':';
if (Min > 0) and (Min < 10) then Output:=Output+'0'+String(Min)+':';
if (Sec > 9) then Output:=Output+String(Sec) else Output:=Output+'0'+String(Sec);
Вроде, работает. Наверно, есть какие-нибудь решения попроще?
TC 11.58 32/64, Win10x64

Cuda уехал text, он был ещё вчераа...
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

790
Для простой работы с ведущими нулями есть встроенная функция TimingFormat, но напрямую такое она не решит. Для этого в библиотеку функций "Common" я добавлял скриптовую функцию FormatDuration, которая делает требуемое, кроме секунд без минут (мне кажется, что тогда теряется ощущение, что это именно время). Её можно использовать так:

Код: Выделить всё

<column name="Duration">
          ...
         <unit name="Custom" type="script">
         <![CDATA[
            uses 'Common';
            Output:=FormatDuration(Duration);
         ]]>
         </unit>
</column>
Чтобы добиться одиночных секунд, надо поменять код функции FormatDuration на такой:

Код: Выделить всё

			// automatically format duration
			function FormatDuration(nDuration);
			begin
				Result:='';

				If not StrIsNumber(nDuration) then Exit;
				nDuration := Number(nDuration);

				if nDuration > 3600000 then
					Result:=TimingFormat('%hh:%mm:%ss', nDuration)
				else if nDuration < 60000 then
					Result:=TimingFormat('%ss', nDuration)
				else
					Result:=TimingFormat('%mm:%ss', nDuration);
			end;
790
Сообщения: 357
Зарегистрирован: Сб авг 09, 2008 18:08

Сообщение 790 »

Спасибо!!
Loopback писал(а): мне кажется, что тогда теряется ощущение, что это именно время
Всё верно! Да и файлов таких у себя не нашёл (в "серьёзных" форматах аудио).
Только убрал из TimingFormat одну h, чтобы не было ведущего 0 в "часах".

Почему-то format DTS-ES (Matrix) и DTS 96/24 отображаются как простой DTS и 6ch. (а там 7, потому ещё Cb - центральный задний) в контекст-плагине, а в листерном всё нормально. (С Dolby EX, наверно, такая же ситуация будет, но мне не проверить - нет таких)

Код: Выделить всё

ID : 2
Format : DTS ES
Format/Info : Digital Theater Systems
Commercial name : DTS-ES Matrix
Codec ID : A_DTS
....
Channel(s) : 6 channels
Channel(s)_Original : 7 channels
ChannelLayout_Original : C L R Ls Rs Cb LFE
Sampling rate : 48.0 kHz
Bit depth : 24 bits
TC 11.58 32/64, Win10x64

Cuda уехал text, он был ещё вчераа...
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

790
Данные одного поля никак не могут быть разными в wdx/wlx плагинах, у них один источник данных - библиотека MediaInfo. Если что-то различается, значит это разные поля (в частности, следует обращать внимание на поля с суффиксами /string, /string1 и т.д., они могут существенно различаться), либо применена какая-то обработка скриптом (но единственное что есть в конфигурации, связанное с каналами - функция FormatChannels, которая просто добавляет локализованное слово "каналов" к их числу).

Переключите в WLX режим просмотра в "Вывод без обработки", найдите имя поля, которое выводит нужную информацию, и сравните с именем поля, данные из которого выводится в колонку.
790
Сообщения: 357
Зарегистрирован: Сб авг 09, 2008 18:08

Сообщение 790 »

Спасибо, всё получилось.
В листере:

Код: Выделить всё

Format : DTS
Format/String : DTS ES
...
Format_Commercial : DTS-ES Matrix
Format_Commercial_IfAny : DTS-ES Matrix
...
Format_AdditionalFeatures : ES
...
Channel(s) : 6
Channel(s)_Original : 7
Добавил в колонки:

Код: Выделить всё

<source name="AudioChannelsOriginal" field="Channel(s)_Original" context="Audio"/>
<source name="AudioFormatAdditionalFeatures" field="Format_AdditionalFeatures" context="Audio"/>
<source name="AudioFormatString" field="Format/String" context="Audio"/>
......
<column name="Audio Additional string">AudioFormatString</column>
<column name="Audio Additional Features">AudioFormatAdditionalFeatures</column>
<column name="Channels Original" coltype="ft_numeric_32">AudioChannelsOriginal</column>
Теперь пытаюсь разобраться, чтобы при отсутствии/наличии данных в 'Channel(s)_Original' использовал/не использовал данные из 'Channel(s)'

Что такое Format_Settings_Mode : 16 ?
Я не понимаю, но это не BitDepth
TC 11.58 32/64, Win10x64

Cuda уехал text, он был ещё вчераа...
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

790 писал(а): чтобы при отсутствии/наличии данных в 'Channel(s)_Original' использовал/не использовал данные из 'Channel(s)'
Сделать скриптовую колонку, с проверкой на пустой результат. Как-то примерно так:

Код: Выделить всё

Output:=Get('Channel(s)_Original', 'Audio');
if Output = '' then Output:=Get('Channel(s)', 'Audio');
790 писал(а):Что такое Format_Settings_Mode : 16 ?
Не знаю, это надо адресовать автору MediaInfo :)

Вроде это какие-то специфические настройки кодека. В теме по этому полю было обсуждение. Для mp3 тут может выводиться, например, joint stereo, что имеет смысл. Что такое 16 - понятия не имею.
790
Сообщения: 357
Зарегистрирован: Сб авг 09, 2008 18:08

Сообщение 790 »

Loopback писал(а): Сделать скриптовую колонку, с проверкой на пустой результат. Как-то примерно так:

Код: Выделить всё

Output:=Get('Channel(s)_Original', 'Audio');
if Output = '' then Output:=Get('Channel(s)', 'Audio');
"Как-то примерно так" не получилось, не врубился. В общем, скопировал скрипт из параметра "Frame Size" и заменил на своё:

Код: Выделить всё

<column name="Channels" type="script"><![CDATA[if (AudioChannelsOriginal = '')  then Output:=AudioChannels else Output:=AudioChannelsOriginal;]]></column>
По аналогии ещё добавил:

Код: Выделить всё

<column name="Sampling Rate" coltype="ft_numeric_floating">
	<unit name="KHz" type="script"><![CDATA[if (AudioSamplingRate <> '') then Output:=Format('%f', AudioSamplingRate/1000);]]></unit>
</column>
...
<column name="Resolution" type="script"><![CDATA[if (AudioResolution = '')  then Output:='-' else Output:=AudioResolution;]]></column>
В общем, человеку, воспитанному на 'Atari Basic', так понятней :D Спасибо за науку!
TC 11.58 32/64, Win10x64

Cuda уехал text, он был ещё вчераа...
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

790
Да, что-то я начудил тут, Get это же только для листерной части. У вас всё правильно :)
790
Сообщения: 357
Зарегистрирован: Сб авг 09, 2008 18:08

Сообщение 790 »

Код: Выделить всё

allprops.txt:
Audio_Language_List: Audio languages in this file separated by /
Language: Language (2-letter ISO 639-1 if exists, else 3-letter ISO 639-2, and with optional ISO 3166-1 country separated by a dash if available, e.g. en, en-us, zh-cn)
Во втором параметре ни слова про /, однако, он там всё-таки есть?

Во втором source есть stream="*"

Код: Выделить всё

<source name="AudioLangCode" field="Language" context="Audio" stream="*"/>
без * показывает только код первого языка. (а их бывает больше 2-х)

В общем, как сделать, чтобы при пустом значении Language и AudioStreamCount > 1, не рисовались пустые слэши / / , а было написано просто число аудио-потоков; а при наличии AudioLangCode показывались сами эти "коды", даже если код один?
Типа так:

Код: Выделить всё

<column name="Audio Language Code" type="script">
<![CDATA[if (AudioLangCode = '') then
	 begin
	 if (AudioStreamCount < 2) then Output:='' else Output:=AudioStreamCount;
	 end
	 else Output:=AudioLangCode
]]>
</column>
но так не получается, потому что, видимо, значение AudioLangCode не пустое, там эти слэши мешают чтоли?
TC 11.58 32/64, Win10x64

Cuda уехал text, он был ещё вчераа...
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

790 писал(а):Во втором параметре ни слова про /, однако, он там всё-таки есть?
Это разные вещи. Эти слеши (или другие символы, заданные в ключе MultiSeparator) добавляет сам плагин, при использовании вывода из всех потоков с помощью "*" - нужно же их чем-то разделять.
790 писал(а):В общем, как сделать, чтобы при пустом значении Language и AudioStreamCount > 1, не рисовались пустые слэши / / , а было написано просто число аудио-потоков; а при наличии AudioLangCode показывались сами эти "коды", даже если код один?
Если число потоков больше 1, то Language одного потока может быть пустой, а другой нет. По идее об отсутствии нужно судить только по факту, когда пустые все. Не знаю, может надо было бы изначально возвращать пустую строку, если все составляющие пустые. С другой стороны пусть это не очень красиво выглядит, зато видно, что значений несколько и они пустые.

Думаю, в качестве решения, пусть и немного корявого, можно заменить пробелы и слеши на пустую строку и проверить результат, если он пустой - возвращать число потоков.

Код: Выделить всё

<column name="Audio Language Code" type="script">
		<![CDATA[
			TestStr := StrReplace(AudioLangCode, '/', '');
			TestStr := StrReplace(TestStr, ' ', '');
			if (TestStr = '') then
			begin
				if (AudioStreamCount < 2) then Output:='' else Output:=AudioStreamCount;
			end
			else Output:=AudioLangCode;
		]]>
</column>
790
Сообщения: 357
Зарегистрирован: Сб авг 09, 2008 18:08

Сообщение 790 »

Да, так работает! Правда не всегда влезает в строку, если языков в файле много.
Так что я сделел так, удалил stream="*" вообще и далее:

Код: Выделить всё

<column name="Audio Language Code" type="script">
<![CDATA[if (AudioLangCode = '') then
	begin
if (AudioStreamCount < 2) then Output:='' else Output:=AudioStreamCount;
	end
	else 
	begin
if (AudioStreamCount<2) then Output:=AudioLangCode else Output:=AudioLangCode+' +'+String(AudioStreamCount-1);
	end
]]>
</column>
и так оно работает:
Если там нет кодов и 1 аудио-поток, то будет пусто;
Если там нет кодов, а потоков >1, то будет число потоков;
Если там 1 код и 1 поток, то будет 1 код;
Если там 1 код и потоков >1, то будет первый код +N кодов и я буду знать, что надо глянуть в листере, что там ещё за языки и/или форматы звука.
Мой телек не позволяет мне переключать аудио-дорожки, и хотя, как правило, первым идёт "ru", зачастую приходится удалять ненужные.
TC 11.58 32/64, Win10x64

Cuda уехал text, он был ещё вчераа...
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Использую кнопку для просмотра в Lister

Код: Выделить всё

TOTALCMD#BAR#DATA
%COMMANDER_EXE%
%P%N /S=L:Ptcmediainfo
WCMICONS.DLL,414
Просмотр MediaInfo Plugin

0
-1
Сам плагин настроен так, чтобы не хватал все файлы, а только по требованию

Код: Выделить всё

10=%COMMANDER_PATH%\plugins\WDX\TCMediaInfo\TCMediaInfo.wlx
10_detect="ext="XXX""
Почему-то в TC x64 данная кнопка не срабатывает, просто открывается внутренний Lister.
P.S. Еще заметил, что после закрытия Lister, процессы TOTALCMD.EXE и TOTALCMD64.EXE остаются в памяти. Данная проблема была в плагине Autorun, проблему решил.
TC 11.58 combo, Windows 11 x64
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

jentoso писал(а):Почему-то в TC x64 данная кнопка не срабатывает, просто открывается внутренний Lister.
У меня и в 32-битном не работал... Но причину нашёл - проблема в расширении wdx для листерного плагина. При этом при нажатии кнопки плагин вообще тоталом не загружался. Если сделать копию плагина с именем TCMediaInfo.wlx и указать его в ListerPlugins, то всё начинает работать. Полагаю, это можно считать багом тотала, учитывая что по F3 всё работает и c расширением wdx, то и в таком сценарии должно работать.

В x64 тоже работает, если сделать копию TCMediaInfo.wdx64 в TCMediaInfo.wlx64.

Не знаю, может всё же стоит сделать пару сопутствующих файлов-врапперов wlx/wlx64 (как в Imagine), чтобы исключить такие проблемы.
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Loopback писал(а):В x64 тоже заработало, если сделать копию в TCMediaInfo.wlx64.
Сделал копию TCMediaInfo.wdx64 и переименовал в TCMediaInfo.wlx64, все работает.
А я уже и не помню, почему для 32-битной версии переименовал копию в wlx, а для 64 не догадался.
TC 11.58 combo, Windows 11 x64
Аватара пользователя
burav
Сообщения: 22
Зарегистрирован: Пт окт 07, 2011 18:16

Сообщение burav »

Добрый день!
Подскажите, почему у одного файла русские тэги в листерном плагине отображаются кракозябрами, у другого - нормально, хотя в контентном плагине оба файла отображаются правильно?
Изображение Изображение
Спасибо
Ответить