[wlx/wdx] TCMediaInfo

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

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

Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

jentoso писал(а):По поводу wrapper так и не нашлось время или неактуально стало?
Да как-то подзабылось. Насчет актуальности не знаю. Наверно все же сделаю, выложу здесь, нужно будет потестировать какое-то время прежде чем включать в дистрибутив.
Destiny писал(а):зачем он лежит в составе плагина, если оказывается, что надо вызывать ехе и из него сохранять настоящий/актуальный файл?
Он просто для справки, список полей с описаниями. Для того, чтобы было где посмотреть поддерживаемые поля при модификации конфига. В работе плагина он не участвует.

Обновлять его необязательно, список полей библиотеки между версиями обычно меняется незначительно.
Destiny писал(а):Почему при генерации не формируется формат: "ПОЛЕ;описание поля"?
Ведь если посмотреть в гитхабе самой библиотеки, то там всё это есть.
Потому что библиотека его выводит в таком виде, в котором он сохранен в allprops.txt. И с точки зрения читабельности это вполне нормальный формат. А то что в исходниках они лежат в формате csv ничего не значит, API библиотеки не предоставляет к ним доступ.
Destiny писал(а):Почему вдруг плагин стал поддерживать совершенно странные для него форматы? PDF, TXT, XLSX, BMP, EXE и т.п?
Эти вопросы нужно задавать автору библиотеки. Почитайте тему чуть выше, только недавно это обсуждали.
Destiny писал(а):КАК теперь быстро, безболезненно, интуитивно и точно оставить в его поле зрения ТОЛЬКО лишь файлы видео и аудио формата?
не пытаясь вспомнить их все, не перепроверяя имеющийся список FORMATS через инет - пытаясь понять - что есть там что.
Присмотритесь повнимательнее к тегу. Он сейчас как раз разбит на группы: контейнеры, видео, аудио, изображения, архивы/документы, текст (субтитры).

В еще невыпущенной версии я уже убрал часть расширений:

[cut]

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

		<Formats>
			AAF,AIFF,AIFC,AIF,AMV,AVI,M2TS,MTS,SSIF,CLPI,BDMV,BDM,MPLS,CDA,DAT,MPD,DV,DIF,DIVX,DPG,IFO,FLV,GXF,F4M,
			HEIF,AVCI,AVCS,HEIC,HEICS,AVIF,AVIS,M3U8,GVI,ISM,IVF,LXF,MKV,MK3D,MKA,MKS,MPEG,MPG,M2P,VOB,VRO,PSS,EVO,TS,
			M2T,M2S,M4T,M4S,TMF,TP,TRP,TY,BRAW,MOV,MP4,M4V,M4A,M4B,M4P,M4R,3GA,3GPA,3GPP,3GP,3GPP2,3G2,K3G,JPM,
			JPX,MQV,ISMV,ISMA,ISMT,F4A,F4B,F4V,MTV,MXF,NSV,NUT,OGA,OGG,OGM,OGV,OGX,OPUS,SPX,PMP,PTX,QT,RM,RMVB,
			RA,SWF,SKM,WEBM,ASF,DVR-MS,WMA,WMV,WTV,
			AVC,H264,264,VIDEO,PART,DRC,FLI,FLC,H261,H263,HEVC,H265,265,MPGV,MPV,MP1V,M1V,MP2V,M2V,M4V,MP4V,VC1,Y4M,VVC,
			H266,266,
			AC3,AC4,AAC,AACP,ADTS,ALS,AMR,AUD,AUE,AU,CAF,DDE,DFF,DSF,DTS,DTSHD,DTSHDMA,DTSX,DD+,EC3,EAC3,XM,FLA,FLAC,
			IT,LA,MIDI,MID,KAR,MOD,APE,MAC,M1A,MPA,MPA1,MP1,M2A,MPA2,MP2,MP3,OMA,OMG,AA3,AT3,MPC,MP+,QCP,RKA,
			S3M,SHN,SLS,SPDIF,SPX,TAK,MLP,THD,VR,VQF,ACT,AT9,WAV,W64,WV,WVC,
			AQT,SSA,ASC,STL,SMI,SAMI,SCC,SC2,SRT,DFXP,TTML,VTT
		</Formats>
		<!-- 
			Other extensions, supported by MediaInfo, but not included in order to not interfere with other plugins.
			You can add them manually if you need.
			ICC,ARI,BMP,BMS,BPG,DDS,DPX,CIN,EXR,GIF,GIS,ICO,JNG,H3D,JPEG,JPG,JPE,JPS,MPO,JP2,MNG,PCX,PNG,PNS,PSD,RLE,TIFF,TIF,
			TGA,7Z,ACE,SO,ISO,EXE,DLL,RAR,ZIP,DOCX,ODT,XLSX,ODS,TXT,PDF,BLENDERS
		-->
[/cut]

Просто уже много раз возникали вопросы - а почему этот формат не поддерживается, почему этот не показывается. Поэтому попробовал добавить все поддерживаемые форматы (генерируется из csv из исходников), но тут всплыла специфика взаимодействия с другими плагинами. Так что просто надо найти баланс.
Destiny писал(а):В идеале тег FORMAS в XML файле настроек плагина должен иметь суб-теги: AUDIO, IMAGE, VIDEO, TEXT ну и т.д.
Субтеги это уже излишне, но группы можно дополнительно разделить пустыми строками для наглядности.
Destiny
Сообщения: 340
Зарегистрирован: Вт дек 15, 2015 18:22

Сообщение Destiny »

Loopback писал(а):Он просто для справки, список полей с описаниями.
Дык это же хорошо)))
НО! как справка = файл тогда должен быть актуализирован!
Т.е. должны быть суммированы факты:
есть список полей, генерируемых библиотекой, и есть описания для них, выдранные из того,
что хранится на гитхабе разработчика библиотеки.
А иначе толку от файла, который правильный на 70/80/90%?
Loopback писал(а):И с точки зрения читабельности это вполне нормальный формат.
См. выше- написано вами же)) Это справка! А значит формат=> ПОЛЕ : описание поля.
И никак иначе....
Loopback писал(а):Присмотритесь повнимательнее к тегу. Он сейчас как раз разбит на группы: контейнеры, видео, аудио, изображения, архивы/документы, текст (субтитры).
Вот не догнал((( хотя вроде и достаточно логичное разбиение.
Так что тупо воспользовался вашим спойлером, надеясь, что "перекрестно-опыляемых" расширений
с поддержкой их другими плагинами не получится...

В целом: с надеждой смотрим в будущее плагина и благодарим за вашу работу!
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Destiny писал(а):О! как справка = файл тогда должен быть актуализирован!
Разумеется, когда я обновляю версию библиотеки, то обновляю и allprops.txt. Механизм обновления в TCMediaInfo.exe предусмотрен на случай, если пользователь самостоятельно обновляет библиотеку.
Destiny писал(а):Т.е. должны быть суммированы факты:
есть список полей, генерируемых библиотекой, и есть описания для них, выдранные из того,
что хранится на гитхабе разработчика библиотеки.
Да не нужно ничего тянуть из гитхаба, всё то же самое в виде пар поле:описание возвращает библиотека. И всё это без изменений сохраняется в allprops.txt. Причём именно для текущей версии, установленной у пользователя. А на гитхабе могут быть версии этих файлов с полями, которых по факту еще нет в текущей версии.
Destiny писал(а):См. выше- написано вами же)) Это справка! А значит формат=> ПОЛЕ : описание поля.
И никак иначе....
Так а в allprops.txt что, разве другой формат?

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

Menu_Codec_List                                  : Deprecated, do not use in new projects
Menu_Language_List                               : Menu languages in this file, separated by /
CompleteName                                     : Complete name (Folder+Name+Extension)
FolderName                                       : Folder name only
FileNameExtension                                : File name and extension
FileName                                         : File name only
FileExtension                                    : File extension only
CompleteName_Last                                : Complete name (Folder+Name+Extension) of the last file (in the case of a sequence of files)
Destiny писал(а):хотя вроде и достаточно логичное разбиение.
Группировка берется из исходного файла Format.csv.
Destiny
Сообщения: 340
Зарегистрирован: Вт дек 15, 2015 18:22

Сообщение Destiny »

Loopback писал(а):Так а в allprops.txt что, разве другой формат?
Конечно. ЕСЛИ сохранить из ЕХЕ файла эти поля в этот файл (чьё имя по умолчанию, кстати, даже и не спрашивается! имя захардкожено похоже),
то в файле сохраняются ТОЛЬКО названия полей. Никаких комментариев после двоеточия нет.
Только в редчайших случаях есть слово Deprecated
и всё.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Destiny писал(а):имя захардкожено похоже
Тот случай, когда выбор ни к чему. Незачем плодить файлы, назначение функции - обновить имеющийся.
Destiny писал(а):то в файле сохраняются ТОЛЬКО названия полей. Никаких комментариев после двоеточия нет.
Вот это уже интереснее. Например, файл в версии 1.0.8 c библиотекой 24.05 сохранён с помощью этой же функции и он вполне полноценен. Версии плагина и библиотеки какие?
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Loopback
Я проверял сегодня именно на этой версии плагина именно с этой библиотекой. Файл allprops.txt создавался через TCMediaInfo.exe. Да, остаются только названия полей. Комментариев или нет вообще (в основном), или вместо них указано "Deprecated" (редко).
Даже самая богатая фантазия
Не представит себе наши безобразия.
Destiny
Сообщения: 340
Зарегистрирован: Вт дек 15, 2015 18:22

Сообщение Destiny »

Loopback
Да ваш плагин 1.0.8 в полной его комплектации и без каких-либо моих вмешательств.
Ну и выше вот уже подтвердили суть проблемы.
Включая нюансы про Deprecated.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Это я народ в заблуждение ввёл, прошу великодушного пардону :oops: Я на ру-борде написал что дамп полей без описаний был всегда — у меня в памяти это перемешалось с дампами другой утилиты. Сейчас прочёл сообщения и перепроверил: в 1.0.7 дамп поле:описание, в 1.0.8 — только поле (описаний нет, за исключением редких Deprecated).
Amo ergo sum
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Avada
Destiny
yozhik
Проверил. По всей вероятности я ошибся и всё же выгрузил список, который в версии 1.0.8 из более ранней версии библиотеки. Так как дело именно в ней: в версии 22.03 выгрузка работает без проблем, а в последних выдает только список полей без описаний. Посмотрю в чем дело, но если это было сделано намеренно и это принципиальная позиция автора, то к сожалению, придется фичу с сохранением этого файла выпилить.

UP: Долго искать не пришлось, вот коммит. Сэкономили на спичках, как говорится. Правда с определенной мотивацией. И вот тут еще спрашивали.
Destiny
Сообщения: 340
Зарегистрирован: Вт дек 15, 2015 18:22

Сообщение Destiny »

Мммммм. Позволите продолжить уточнения?
Типа в самой библиотеке порезали возможности по выводу информации о поддерживаемых тэгах? Зачем-то намеренно.
И логику фиг поймешь, но да ладно.
НО! мы же речь ведем о самописной/дополнительной программе, функционал которой и выполнял эту встроенную типа
API команду на вывод инфы в файл.
НО! если "на той стороне" что-то и почикали - то "на этой" же можно продолжить выводить корректно! Т.е. просто допилить
вывод инфы С УЧЕТОМ той инфы, что они хранят в вышеуказанной ссылке и на которую сами же ссылаются в одном из
указанных выше коммитов/обсуждений.
Типа это офиц.место для хранения такой инфы. Ну значит надо её оттуда извлекать и генерировать вывод в файл allprops.txt
инфы с её учетом.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Destiny писал(а):Типа в самой библиотеке порезали возможности по выводу информации о поддерживаемых тэгах? Зачем-то намеренно.
И логику фиг поймешь, но да ладно.
Да, убрали из бинарника описания.

А логика указана по ссылкам. Мотивируют это тем, что библиотека слишком разрослась в размерах, что плохо для использования в некоторых применениях, например, в JavaScript, поэтому размер оптимизируют. Вот тут пожертвовали описаниями полей, их размер около 150кб.
Destiny писал(а):Ну значит надо её оттуда извлекать и генерировать вывод в файл allprops.txt
инфы с её учетом.
Файл я продолжу обновлять. Если нужно, отдельно выложу скрипт для формирования этого файла на основе данных гитхаба. Просто больше этого функционала не будет во встроенном виде.

Также ещё планирую сделать раздел на сайте с этой информацией, может так кому удобнее будет смотреть.
olegvsk
Сообщения: 115
Зарегистрирован: Чт дек 17, 2020 16:34

Сообщение olegvsk »

Loopback
Отличный полезный плагин. Пользуюсь главным образом wlx-частью, не хватает одного - быстрого переключения режимов просмотра. Например, Ctrl+номер или вроде того. Или хоткей можно настроить самостоятельно?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

olegvsk
Хорошая идея. Будучи "мышистом" всё время забываю про клавиатурное управление. Добавил в todo. Возможно не в ближайшей версии, но надо будет сделать.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
IsPressed функцию можно добавить? Хочу поэксппрементировать с подсказкой. Сейчас она у меня такая:

[cut]

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

    <sources>
        <!-- General -->
        <source name="Duration" field="Duration"/>
        <source name="OverallBitRate" field="OverallBitRate"/>
        <source name="GeneralFormat" field="Format"/>
        <source name="EncDate" field="Encoded_Date"/>
        <source name="RecDate" field="Recorded_Date"/>
        <source name="GeneralStreamCount" field="StreamCount"/>
        <!-- Tag info -->
        <source name="Title" field="Title"/>
        <source name="Album" field="Album"/>
        <source name="Performer" field="Performer"/>
        <source name="Copyright" field="Copyright"/>
        <source name="Comment" field="Comment" />
        <source name="Composer" field="Composer"/>
        <source name="Genre" field="Genre"/>
        <source name="TrackNumber" field="Track/Position"/>
        <source name="Medium" field="OriginalSourceMedium"/>
        <source name="Source" field="OriginalSourceForm"/>
        <source name="EncodedWith" field="Encoded_Application"/>
        <!-- Video -->
        <source name="VideoStreamCount" field="StreamCount" context="Video"/>
        <source name="VideoFormat" field="Format" context="Video"/>
        <source name="VideoBr" field="BitRate" context="Video"/>
        <source name="VideoCodecID" field="CodecID" context="Video"/>
        <source name="VideoFrameWidth" field="Width" context="Video"/>
        <source name="VideoFrameHeight" field="Height" context="Video"/>
        <source name="DisplayAspectRatio" field="DisplayAspectRatio/String" context="Video"/>
        <source name="VideoFPS" field="FrameRate" context="Video"/>
        <source name="VideoFrameCount" field="FrameCount" context="Video"/>
        <!-- Audio -->
        <source name="AudioStreamCount" field="StreamCount" context="Audio"/>
        <source name="AudioLang" field="Language" context="Audio" stream="*"/>
        <source name="AudioLanguage" field="Language/String" context="Audio" stream="*"/>
        <source name="AudioFormat" field="Format" context="Audio"/>
        <source name="AudioBr" field="BitRate" context="Audio"/>
        <source name="AudioCodecID" field="CodecID" context="Audio"/>
        <source name="AudioBrMode" field="BitRate_Mode" context="Audio"/>
        <source name="AudioSamplingRate" field="SamplingRate/String" context="Audio"/>
        <source name="AudioChannels" field="Channel(s)" context="Audio"/>
        <source name="AudioResolution" field="BitDepth" context="Audio"/>
        <source name="AudioFormatSettingsMode" field="Format_Settings_Mode" context="Audio"/>
        <!-- Text -->
        <source name="TextStreamCount" field="StreamCount" context="Text"/>
        <source name="TextLang" field="Language" context="Text" stream="*"/>
        <source name="TextLanguage" field="Language/String" context="Text" stream="*"/>
        <source name="TextFormat" field="Format" context="Text"/>

    </sources>
    <columns>
        <!-- General -->
        <column name="Duration">
            <unit name="hh:mm:ss" type="script">Output:=TimingFormat('%hh:%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[
              Output:='';
              if Duration = '' then Exit;
              Hour:=Trunc(Duration/3600000);
              Min:=Trunc((Duration-Hour*3600000)/60000);
              Sec:=Trunc((Duration-Hour*3600000-Min*60000)/1000);
              if (Hour <> 0) then Output:=IntToStr(Hour)+' ч. ';
              if  (Min <> 0) then Output:=Output+IntToStr(Min) +' м. ';
              if  (Sec = -1) then Output:=Output+IntToStr(Sec) +' с. ';
            ]]>
            </unit>
        </column>
        <column name="Format">GeneralFormat</column>
        <column name="Bitrate">
            <unit name="Bps">OverallBitRate</unit>
            <unit name="KBps" type="script">Output:=Format('%f', OverallBitRate/1000);</unit>
            <unit name="MBps" type="script">Output:=Format('%f', OverallBitRate/1000000);</unit>
        </column>
        <column name="Recorded Date" coltype="ft_datetime">RecDate</column>
        <column name="Encoded Date" coltype="ft_datetime">EncDate</column>
        <column name="Stream Count" coltype="ft_numeric_32">
            <unit name="General">GeneralStreamCount</unit>
            <unit name="Video only">VideoStreamCount</unit>
            <unit name="Audio only">AudioStreamCount</unit>
            <unit name="Subtitles only">TextStreamCount</unit>
        </column>
        <separator/>
        <!-- Tag info -->
        <column name="Title">Title</column>
        <column name="Album">Album</column>
        <column name="Performer">Performer</column>
        <column name="Copyright">Copyright</column>
        <column name="Comment">Comment</column>
        <column name="Composer">Composer</column>
        <column name="Genre">Genre</column>
        <column name="Track Number">TrackNumber</column>
        <column name="Recorded Date">RecDate</column>
        <column name="Medium">Medium</column>
        <column name="Source">Source</column>
        <column name="Encoded With">EncodedWith</column>
        <column name="Tag Info" type="script">
        <![CDATA[
          Output:=''
          if (Title <> '') then Output:=Title;
        ]]>
        </column>

        <separator/>
        <!-- Video -->
        <column name="Video Streams">VideoStreamCount</column>
        <column name="Video Format">VideoFormat</column>
        <column name="Video Codec">VideoCodecID</column> <!-- For AVI this field return FOURCC -->
        <column name="Video Bitrate">
            <unit name="Bps">VideoBr</unit>
            <unit name="KBps" type="script">Output:=Format('%f', VideoBr/1000);</unit>
            <unit name="MBps" type="script">Output:=Format('%f', VideoBr/1000000);</unit>
        </column>
        <column name="Frame Size" type="script">
        <![CDATA[
          if (VideoFrameWidth = '') and (VideoFrameHeight = '') then
            Output:=''
          else
            Output:=VideoFrameWidth+' x '+VideoFrameHeight;
        ]]>
        </column>
        <column name="Frame Rate">VideoFPS</column>
        <column name="Frame Count">VideoFrameCount</column>
        <column name="All video as string" type="script">
        <![CDATA[
		  if (VideoFrameWidth = '') and (VideoFrameHeight = '') then
            Output:=''
          else
            Output:=VideoFrameWidth+'x'+VideoFrameHeight;
          if (DisplayAspectRatio <> '') then Output:=Output+' ('+DisplayAspectRatio+')';
          if (VideoFPS <> '') then Output:=Output+', '+VideoFPS+' fps';
          if (VideoFormat <> '') then Output:=Output+', '+VideoFormat;
          if (VideoBr <> '') then Output:=Output+', '+Format('%f', VideoBr/1000000)+' MBps';
          if (VideoStreamCount <> '1') and (Output <> '') then Output:=Output+', Дорожек: '+VideoStreamCount;
        ]]>     
        </column>
        <separator/>
        <!-- Audio -->
        <column name="Audio Streams">AudioStreamCount</column>
        <column name="Audio Lang" type="script">Output:=StrReplace(AudioLang,  '|', ' ', 1, 0)</column>
        <column name="Audio Language" type="script">Output:=StrReplace(AudioLanguage,  '|', ' ', 1, 0)</column>
        <column name="Audio Format">AudioFormat</column>
		<column name="Audio Bitrate"> 
             <unit name="Bps">AudioBr</unit> 
             <unit name="KBps" type="script"><![CDATA[if (AudioBr <> '') then Output:=Format('%f', AudioBr/1000);]]></unit> 
		</column>
        <column name="Bitrate Mode">AudioBrMode</column>
        <column name="Sampling Rate">AudioSamplingRate</column>
        <column name="Channels">AudioChannels</column>
        <column name="Resolution">AudioResolution</column>
        <column name="All audio as string" type="script">
        <![CDATA[
          Output:=AudioFormat;

          if (AudioSamplingRate <> '') then Output:=Output+', '+AudioSamplingRate;
          if (AudioChannels <> '') then Output:=Output+', '+AudioChannels+' Ch';
          if (AudioResolution <> '') then Output:=Output+', '+AudioResolution+' Bits';
          if (AudioBr <> '') then Output:=Output+', '+Format('%d Kbps', Trunc(AudioBr/1000));			
          Output:=Output+', Дорожек: '+AudioStreamCount;
        ]]>     
        </column>
        <column name="All audio streams1" type="script">
        <![CDATA[
	        Output:=Get(Language, Audio, 1);

        ]]>     
        </column>

        <separator/>
        <!-- Subtitles -->
        <column name="Text Streams">TextStreamCount</column>
        <column name="Subs" type="script">Output:=StrReplace(TextLang,  '|', ' ', 1, 0)</column>
        <column name="Subtitles" type="script">Output:=StrReplace(TextLanguage,  '|', ' ', 1, 0)</column>
        <column name="Subtitles Format">TextFormat</column>
        <separator/>
        <!-- Almost demo purpose, retrieve custom values from lists -->
        <column name="Video codec custom" type="list" list="VideoCodecs">VideoCodecID</column>
        <column name="Audio codec custom" type="script">Output:=GetListValue('AudioCodecs', Format('%4.4d', AudioCodecID), AudioCodecID);</column>
    </columns>
[/cut]
[cut]13fields=Время: [=tcmediainfo.Duration]\nВидео: [=tcmediainfo.All video as string]\nАудио: [=tcmediainfo.All audio as string]\n[="Язык аудио: "tcmediainfo.Audio Language]\n[="Субтитры: "tcmediainfo.Text Streams]\n[="Язык субтитров: "tcmediainfo.Subtitles][/cut]
Делал давно и, как видите, коряво. Нужна ревизия, до которой руки так и не дошли.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):IsPressed функцию можно добавить?
IsPressed куда добавить, сюда? Зачем? :?

Если с похожими целями, как обновление записей при нажатом Ctrl, то нет, я уже говорил, что не буду здесь делать действия в зависимости от нажатых клавиш.
Ответить