# TCMediaInfo plugin for Total Commander 0.7.4

## Описание плагина

TCMediaInfo - контентный/листерный плагин для извлечения информации из видео и аудио файлов. Плагин использует библиотеку MediaInfo и поддерживает все форматы, которые поддерживаются библиотекой. Полный список форматов смотрите здесь.

## Требования

Плагин тестировался на:

- Total Commander 8.01 под Windows XP Professional SP3 (x86)
- Total Commander 8.01 x64 под Windows 7 (x64)

## Установка

Просто откройте wdx_tcmediainfo_xxx.zip в Total Commander для запуска автоматической установки.

## Использование

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

Конфигурирование колонок в Total Commander смотрите в документации на программу.

## Конфигурация

Если вам нужна дополнительная информация, которой нет в стандартной конфигурации, придется отредактировать файл TCMediaInfo.xml и добавить свои параметры. В файле allfields.txt находится полный список свойств библиотеки. Если вы обновляете библиотеку до новой версии, запустите saveprops.bat чтобы обновить файл списка.

В файле конфигурации вы можете увидеть четыре основных xml-узла.

### Узел опций:

    <options>
        <Formats>AVI,DIVX,MPEG,...</Formats>
        <MultiSeparator> / </MultiSeparator>
        <BasePath>base.db</BasePath>
        <MemoryBase>False</MemoryBase>
        <UseBase>True</UseBase>
        <SqlitePath>Sqlite3.dll</SqlitePath>
        <Sqlite64Path>Sqlite3_x64.dll</Sqlite64Path>
        <MediaInfoPath>MediaInfo.dll</MediaInfoPath>
        <MediaInfo64Path>MediaInfo_x64.dll</MediaInfo64Path>
        <MissedField><empty></MissedField>
        <DebugMode>False</DebugMode>
    </options>

Formats - список поддерживаемых расширений, разделенных запятой.

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

BaseFile - путь к файлу базы. Можно использовать переменные окружения.

UseBase - установите в True если вы хотите использовать базу. База сделана в связи с медленной работой библиотеки MediaInfo для ускорения последующего получения данных.

MemoryBase - если true, база будет создана только в памяти и сброшена при перезапуске TC

SqlitePath - путь к библиотеке Sqlite3.dll. По-умолчанию плагин ищет ее в своем каталоге. Можно использовать переменные окружения.

Sqlite64Path - путь к библиотеке Sqlite3_x64.dll для 64-битной версии плагина. По-умолчанию плагин ищет ее в своем каталоге. Можно использовать переменные окружения.

MediaInfoPath - путь к библиотеке MediaInfo.dll. По-умолчанию плагин ищет ее в своем каталоге. Можно использовать переменные окружения.

MediaInfo64Path - путь к библиотеке MediaInfo_x64.dll для 64-битной версии плагина. По-умолчанию плагин ищет ее в своем каталоге. Можно использовать переменные окружения.

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

DebugMode - режим отладки, сообщения об ошибках и отладочные сообщения записываются в файл debug.log

### Узел опций листера:

ViewMode - имя режима просмотра, определенного в узле <view>. Также может быть "Default" для стандартного вида. Имя "Default" зарезервировано для стандартного вида и не может использоваться в качестве имени пользовательского вида.

### Узел источников:

    <sources>
      <source name="SourceName" field="MediaLibraryField" context="MediaLibraryFieldContext" stream="StreamNumber"/>
    </sources>

Здесь вы задаете "источники" - информация, которая будет получена из библиотеки и (опционально) сохранена в базу. Каждый узел <source> может иметь атрибуты:

SourceName - имя источника. Оно может содержать только латинские буквы, цифры и символ подчеркивания. Заданное имя будет являться именем поля для базы, и именем переменной для скриптов.

MediaLibraryField - имя поля MediaLibrary (смотрите полный список доступных полей в allprops.txt)

MediaLibraryFieldContext (опциональный) - поскольку многие поля возвращают свою информацию для для разных типов объектов (контейнер, видео, аудио, и т.д.), и некоторые работают только для определенных типов контента, вам нужно задавать, для какого типа (в каком контексте) будет получена информация. Контекст может быть General, Video, Audio, Text, Chapters, Image и Menu. Если контекст опущен, будет извлекаться информация в контексте General (обычно это контейнер или общая информация, например, теги).

StreamNumber (опциональный) - номер потока, для которого будет извлечена информация. Если вместо числа будет задано "*" - будет извлечена информация по всем доступным потокам в данном контексте (данные будут разделены строкой, заданной в параметре MultiSeparator).

### Узел колонок:

    <columns>
      <column name="ColumnName" coltype="ColumnOutputType">SourceName</column>
      <column name="ColumnName" type="template">SourceName1, SourceName2</column>
      <column name="ColumnName" type="list" list="ListName">SourceName</column>
      <column name="ColumnName" type="script">{script content here}</column>
      <column name="ColumnName" type="script">
      <![CDATA[
          {script content here}
      ]]>
      </column>
    </columns>

Здесь вы определяете колонки, как они будут видны в Total Commander.

Каждый узел <column> может содержать атрибуты:

ColumnName - имя колонки (обычно английское, чтобы его можно было переводить стандартными средствами Total Commander), как оно будет видно в Total Commander.

type="<single|template|list|script>" - определяет, как будет трактоваться текст узла.

Может быть:

single - текст узла является именем источника. Используется по-умолчанию и может быть опущен.
template - шаблон, имена источников в тексте будут заменены их значениями.
list - значение заданного источника будет искаться в списке с именем, заданном в атрибуте "list", (смотрите раздел "списки")
script - скрипт на встроенном скриптовом языке (смотрите секцию "написание скриптов").

Если атрибут опущен, текст трактуется как простое имя источника (single).

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

Узел <column> также может содержать вложенные узлы <unit> (единицы). Они обрабатываются точно так же, как узлы <column> и имеют такие же атрибуты. Не исползуйте атрибут "type" в узле <column>, если вы используете единицы.

ColumnOutputType (опционально) - тип колонки, в основном полезно для форматирования даты/времени. Поддерживаются типы ft_string, ft_numeric_32, ft_numeric_32, ft_datetime. Может быть опущен, по-умолчанию используется ft_string.

Также вы можете поместить узел <separator/> между колонками, он будет виден как разделитель в меню Total Commander.

### Узел списков:

    <lists>
      <list name="ListName">
        <line name="SearchText">ReplaceText</line>
      </list>
      <list name="ListName" type="ini" file="{path to file, environment variables allowed}" section="{load from}"/>
    </lists>

В этом узле располагаются списки замен.

ListName - имя списка. Оно может содержать только латинские буквы, цифры и символ подчеркивания. Заданное имя может быть использовано в колонках типа "list", или скрипт может вызвать его по этому имени.

SearchText - текст (идентификатор) для поиска

ReplaceText - найденный текст будет заменен этим текстом

type="ini" - список может быть загружен из внешнего ini-файла. Имя файла должно быть задано в атрибуте "file" (можно использовать переменные окружения). Также необходимо установить имя секции ini-файла в атрибуте "section". Ini может быть закодирован в ANSI или UTF-8.

## Написание скриптов

Написание скриптов позволяет полностью изменить вывод информации под ваши нужды.

В скриптах можно использовать любое из определенных имен источников, и специальную переменную "Output", значение которой будет выведено плагином. Все входные переменные и переменная "Output" имеют тип Variant. Это означает, что во многих случаях вы можете использовать ее значение без дополнительных преобразований типов. Обратите внимание, что когда вариант - строка, она на самом деле закодирована в UTF-8.

Переменные обьявлять не надо, они при небходимости создаются динамически при присваивании им значений. Тип определяется по последнему присвоенному значению, типовый контроль при присваивании не выполняется. То есть если существующей числовой переменной присвоить строку, ее тип изменится. Символам строки можно присваивать числовые значения в диапазоне 0..255 или символы (строки длиной 1).

В выражениях поддерживаются следующие операции: арифметические: +, -, *, /, ^ (возведение в степень), SHL, SHR операции с битами: BITOR,BITAND,BITXOR,BITNOT логические: >, <, >=, <=, =, <>, AND, OR, NOT, константы TRUE и FALSE. Tакже можно использовать скобки. Порядок выполненния операций стандартный.

В интерпретаторе поддерживаются операторы:

- BEGIN ... END
- IF ... THEN ... ELSE
- CASE
- FOR ... TO/DOWNTO ... DO
- WHILE ... DO
- REPEAT ... UNTIL
- CONTINUE
- BREAK
- GOTO
- EXIT

Также, поддерживаются массивы и пользовательские процедуры и функции.

## Строчные функции

StrUpper(string)
StrLower(string)
StrMid(string, start, count)
StrLeft(string, count)
StrRight(string, count)
StrTrim(string)
StrLen(string)
StrPos(string, start, count)
StrReplace(string, oldpattern, newpattern, replaceall, casesense)

## Специальные функции

Для упрощения работы в применении к данным плагина, введены некоторые специальные функции.

GetListValue(List; Default)

Cпециальная функция для работы со списками. Параметры:

List - имя списка
ID - текст, который будет искаться
Default - стандартное значение, котрое будет возвращено в случае если текст не найден

Возвращаемое значение - строка.

TimingFormat(TimingFmt; Timing)

Функция для вычисления и форматирования тайминга, заданного в миллисекундах.

TimingFmt - формат строки, может быть свободно сконструирован из произвольного текста со следующими подстановками:

%h - час, например 1 час → 1
%hh - час с ведущим нулем, например 1 час → 01
%hhh - час с двумя ведущими нулями, например 1 час → 001
%m - минуты, например 5 мин → 5
%mm - минуты с ведущим нулем, например 5 мин → 05
%s - секунды, например 5 мин → 5
%ss - секунды с ведущим нулем, например 5 мин → 05
%z - тысячные доли секунды (= миллисекундам), например 25 мс → 25
%fff - тысячные доли секунды (= миллисекундам), c ведущими нулями, например 25 мс → 025
%ff - доли секунды, округленные до сотых, c ведущими нулями, например 125 мс → 13
%f - доли секунды, округленные до десятых, например 125 мс → 1

Timing - тайминг в миллисекундах

Возвращаемое значение - строка.

Пример: TimingFormat('%hh:%mm%:%ss.%fff', 183353) → "00:03:03.353"

## Перевод

Для перевода используйте стандартный механизм TC. Посмотрите содержимое файла TCMediaInfo.lng, его содержимое очевидно.

## История версий

    Version 0.7.4 (2013-07-26)
    + перевод
    + возможность (по-сути костыль) для исправления неправильной кодировки, полученной из ANSI ID3-тегов

    Version 0.7.3 (2013-07-24)
    + пользовательские режимы просмотра в WLX
    - исправлена работа с одновременной работой нескольких окон

    Version 0.7.2 (2013-07-17)
    ? попытка исправить зависание на некоторых файлах, открытых другими процессами
    + настройки цвета и шрифтов для WLX
    + несколько строчных функций для скриптинга
    + WLX теперь учитывает пути к MediaLibrary, заданные в конфигурации
    + добавлен горизонтальный скроллбар в WLX
    - исправлена проверка формата в x64 WDX

    Version 0.7.1 (2012-07-09)
    + интегрирован WLX
    + в список поддерживаемых расширений добавлен FLV и 3GP
    - исправлен делитель битрейта
    - исправлено отображение некоторых полей

    Version 0.7.0 (2012-06-27)
    * Документация переведена в html.
    * Для возможности компиляции 64-битной версии использован другой скриптовый движок (потребуются небольшие изменения скриптов).
    * MediaInfo обновлена до версии 0.7.58.0.
    * Плагин записывает отладочные сообщения и ошибки в файл лога вместо сообщений
    + Добавлена специальная скриптовая функция TimingFormat
    + Добавлена опция для задания текста, который будет отображаться для полей без информации в базе (если поле было добавлено позже занесения информации по файлу в базу)
    + Добавление источников больше не требует пересоздания базы

    Version 0.6.2 (2011-02-06)
    - Исправлено появление лишнего сообщения на пустой базе
    + Заново добавлена ANSI-версия
    - Версия файла была недоступна под Windows 7
    + Возможность задать произвольный путь к базе.

    Version 0.6.1 (2010-09-14)
    - Кажется исправлен общий доступ к БД
    + Добавлена опция использования только сессионной БД в памяти

    Version 0.6 (2010-08-22)
    * Плагин полностью переписан
    * Скриптовый движок заменен на Pascal Script
    * Для хранения опций и определений используется XML
    + Значение колонки может быть собрано из нескольких источников
    + База для ускорения повторной загрузки (Sqlite3)
    - Исправлена работа с последними версиями библиотеки

    Version 0.51 (не выпускалась)
    + Поддержка списков замены
    + Плагин не использует DetectString, а проверяет расширения по списку, заданному в конфигурации
    + Добавлен стандартный конфиг, чтобы рабочий не перезаписывался при обновлении инсталлятором

    Version 0.50 (2009-09-07)
      Первый релиз.

## Благодарности

Christian Ghisler - за бесконечно мощный инструмент.

Команде MediaInfo - за отличную библиотеку.

Alexey Boyko - за простой и удобный интерпретатор PasCalc.

## Лицензия

Copyright (c) 2009-2012 Dmitry Yudin

Сайт плагина

Плагин распространяется бесплатно.

Разрешено включение в любые сборки Total Commander, как персональные, так и публичные, при условии сохранения данного информационного файла.