FAQ по написанию плагинов

Описание: Вопросы, связанные с каталогизатором фильмов All My Movies
Модераторы: datasource, Автор

Нужен ли он?

Да
17
100%
Нет
0
Голосов нет
 
Всего проголосовавших: 17
iRo
Пользователь
iRo
Пользователь
Репутация: 0
С нами: 14 лет 2 месяца

Сообщение #1 iRo » Ср января 20, 2010 2:14 pm

Всем привет.
поиском не нашел.
Попробую создать его с Вашей помощью)))
(только вчера купил лицензию и немного успел просмотреть API)

1. Нужно скачать архив с API для Borland Delphi - Delphi Plugin API v2.5 (01 Jul 2009)
2. Создать проект DLL и включить в него файл amm_pluginapi.pas
3. Библиотека должна содержать (и экспортировать) четыре функции
-GetName4: -возвращает название плагина
-GetVersion4: - возвращает версию плагина
-Init4: OwnerAPP := Owner; -дескриптор окна AMM
- последняя функция непосредственно запуск плагина из AMM.
она зависит от типа создаваемого плагина,
а. Плагин для обработки фильмов/имен - AMM_PluginStart4
б. Плагин для импорта информации о фильме - AMM_NewBasePluginStart4(OrigTitle:Pchar; tlength:Integer);
в. Плагин для импорта информации о людях - AMM_NewNamePluginStart4(OrigTitle:Pchar; tlength:Integer);

4. Для работы непосредственно с данными из AMM. нужно создать объект типа TMovieBase

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

var
   MovieBase: TMovieBase;
begin
   MovieBase := TMovieBase.Create; 



список классов, полей и доступных функций,
а так же пример простого плагина - см. посте №2 от уважаемого z_a_s


Уважаемые знатоки!
Если не затруднит, помогите дописать!



PS или не нужная затея?
Последний раз редактировалось iRo Чт января 21, 2010 6:51 pm, всего редактировалось 1 раз.
хочу базу фильмов на портале, и плагин для Dune.
если что сделаю, выложу тут и на портале 4iRo.ru

z_a_s
Опытный пользователь
z_a_s
Опытный пользователь
Репутация: 0
С нами: 18 лет 2 месяца
Откуда: Волгоград

Сообщение #2 z_a_s » Ср января 20, 2010 8:42 pm

По 3 пункту надо добавить, что существует три вида плагинов и в зависимости от этого одна функция будет меняться.
1. Плагин для обработки фильмов/имен - AMM_PluginStart4
2. Плагин для импорта информации о фильме - AMM_NewBasePluginStart4(OrigTitle:Pchar; tlength:Integer);
2. Плагин для импорта информации о людях - AMM_NewNamePluginStart4(OrigTitle:Pchar; tlength:Integer);

Теперь по остальным пунктам.
В API прописаны три основные класса TPerson, TMovie и TMovieBase

TPerson - Класс имен, не требует специального создания используется через TMovieBase.CurrentName

Доступные свойства:
NameID:Integer - ID персоны
Name:String - Имя
AltName:String - Альтернативное имя
BirthDay:String - День рождения
BirthPlace:String - Место рождения
BirthYear:Integer - Год рождения
BirthCountry:String - Страна рождения
Biography:String - Биография
Filmography:String - Фильмография
Comments:String - Комментарии
URL:String - Ссылка на страницу
Rating:Integer - Рейтинг

Доступные функции:
IsPicExists:Boolean; - Возвращает True если у персоны есть фото
GetPic(FName:String):Boolean; - Сохраняет фото персоны в файл
SetPic(FName:String):Boolean; - Вставить фото персоны из файла (корректно работает только с JPEG файлами)
DeletePic:Boolean; - Удалить фото персоны


TMovie - Класс фильмов, не требует специального создания используется через TMovieBase.CurrentMovie

Доступные свойства:
Title:String - Название фильма
OriginalTitle:String - Оригинальное название
Description:String - Описание
Genre:String - Жанры. В строке перечисляются все жанры через запятую
Year:String - Год выхода фильма
Resolution:String - Разрешение
Size:String - Размер файла
Duration:String - Длительность
Loan:String - Кому отдан
Director:String - Режиссер
VideoInfo:String - Информация о видео потоке. Выводиться в виде строки "Кодек~Частота кадров~Средний битрейт~Глубина цвета"
AudioInfo :String - информация о аудио потоке. Выводиться в виде строки "Кодек~Информация~Средний битрейт"
Actors:String - Актеры
MediaType:String - Тип носителя
MediaCount:Integer - Количество носителей
MediaLocation:String - Местонахождение
Rating:Integer - Рейтинг фильма
MovieNum:Integer - Номер фильма
Comments:String - Комментарии
MediaLabel:String - Метка носителя
Subtitles:String - Субтитры
AspectRatio:String - Формат экрана
URL:String - Ссылка на страницу фильма
LocalPath:String - Локальный путь
Country: String - Страна
MPAA: String - Рейтинг МЗАА
ID: Integer - ID фильма
Wishlist: Boolean - Желаемый
Seen: Boolean - Просмотренный
Studio: String - Студии
Barcode: String - Штрих-Код
Scenario: String - Сценарист
TrailerLink: String - Ссылка на трейлер
Price: Single - Цена
UDFieldsCount:Integer - Количество пользовательских полей
ScreenshotsCount:Integer - Количество скриншотов
EpisodesCount:Integer - Количество эпизодов
PersonalMarks: String - Личные отметки пользователя

Доступные функции:
IsCoverExists:Boolean; - Возвращает True если у фильма есть постер
GetScreenshot(FName:String; ScreenIndex:Integer):Boolean; - Сохраняет скриншот в файл
GetCoverImage(FName:String):Boolean; - Сохраняет постер в файл
SetCoverImage(FName:String):Boolean; - Вставить постер из файла (корректно работает только с JPEG файлами)
SetScreenshot(FName:String):Integer; - Вставить скриншот из файла (корректно работает только с JPEG файлами)
DeleteScreenshot(ScreenIndex:Integer):Boolean; - Удалить скриншот
DeleteCover:Boolean; - Удалить постер
GetUDFieldValue(Index:Integer):String; - Получить значение пользовательского поля
GetUDFieldName(Index:Integer):String; - Получить имя пользовательского поля
SetUDFieldValue(Index:Integer; UDValue:String):Integer; - Установить значение пользовательского поля
EpisodeAdd(SeasonNum, EpisodeNum:Integer; Title, Description, URL, AirDate:String):Integer; - Добавить эпизод
EpisodeDelete(EpIndex:Integer):Boolean; - Удалить эпизод
EpisodeGetSeasonNum(EpIndex:Integer):Integer; - Получить номер сезона
EpisodeGetEpisodeNum(EpIndex:Integer):Integer; - Получить номер эпизода
EpisodeGetTitle(EpIndex:Integer):String; - Получить название эпизода
EpisodeGetDescription(EpIndex:Integer):String; - Получить описание эпизода
EpisodeGetURL(EpIndex:Integer):String; - Получить ссылку на страницу эпизода
EpisodeGetAirDate(EpIndex:Integer):String; - Получить дату выхода эпизода
EpisodeSetSeasonNum(EpIndex, SeasonNum:Integer); - Установить номер сезона
EpisodeSetEpisodeNum(EpIndex, EpisodeNum:Integer); - Установить номер эпизода
EpisodeSetTitle(EpIndex:Integer; Title:String); - Установить название эпизода
EpisodeSetDescription(EpIndex:Integer; Description:String); - Установить описание эпизода
EpisodeSetURL(EpIndex:Integer; URL:String); - Установить ссылку на страницу эпизода
EpisodeSetAirDate(EpIndex:Integer; AirDate:String); - Установить дату выхода эпизода
SaveMovieCardImage(FName:String;w,h:Integer):Boolean; - сохранить как изображение (JPG, PNG или BMP) вид карточки выбранного фильма с текущим шаблоном.

TMovieBase - Основной класс

Доступные свойства:
CurrentMovie:TMovie; - Доступ к текущему фильму
CurrentName:TPerson; - Доступ к текущему имени
GetAllPersonalMarks:String - Список личных отметок
GenreList:TStringList; - Список жанров
MovieCount:Integer - Количество фильмов в списке (если есть фильтрация то выводится именно количество отфильтрованных фильмов)
Filename:String - Имя файла открытой базы

Доступные функции:

//для работы с фильмами
AddMovie; - Добавить фильм
SaveMovie:Integer; - Сохранить текущий фильм
EditMovie; - Редактировать текущий фильм
DeleteMovie; - Удалить текущий фильм
First; - Выбрать первый фильм в списке
Last; - Выбрать последний фильм в списке
Next; - Следующий фильм
Prior; - Предыдущий фильм
Compress; - Сжать базу
GetGenreList:Boolean; - Получить список жанров
LocateMovieID(IDValue:Integer):Boolean; - Найти фильм по ID
SetSQLFilter(FilterStr:String):Boolean; - Установить SQL фильтр
ExecSQL(SQLStr:String):Boolean; - Выполнить SQL

//для работы с персонами
AddName; - добавить имя
SaveName:Integer; - Сохранить имя
EditName; - Редактировать текущее имя
DeleteName; - Удалить имя
FirstName; - Выбрать первое в списке имя
LastName; - Выбрать последнее в списке имя
NextName; - Следующие имя
PriorName; - Предыдущее имя
LocateNameID(IDValue:Integer):Boolean; - Найти имя по ID
GetNameCount:Integer; - Получить количество имен в списке

//Функции работающие только в плагине импорта информации о фильме
GetGetURL(URL:String):String; - Загружает html страницу с указанного адреса
GetPostURL(URL, Params:String):String; - Передача параметров при помощи POST метода
GetCoverFromURL(URL:String):Boolean; - Загрузить постер по ссылке
GetScreenFromURL(URL:String):Boolean; - Загрузить скриншот по ссылке
SelectTheMovie(MovieList:String):Integer; - Выводит список фильмов для выбора нужного

//Функции работающие только в плагине импорта информации о персоне
NameGetURL(URL:String):String; - Загружает html страницу с указанного адреса
NamePostURL(URL, Params:String):String; - Передача параметров при помощи POST метода
GetNamePicFromURL(URL:String):Boolean; - Загрузить фото по ссылке
SelectTheName(NameList:String):Integer; - Выводит список имен для выбора нужного

Ну и на последок пример простого плагина который перенумеровывает фильмы

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

library Test;

uses
  amm_pluginapi,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, IniFiles;

{$R *.res}

function GetVersion4: Integer; far;
begin
   Result := 1;
end;

function GetName4: Pchar; far;
begin
   Result := 'Test';
end;

procedure AMM_PluginStart4; far;
var
   MovieBase: TMovieBase;
   x, i: Integer;
begin
   MovieBase := TMovieBase.Create;
 
   x := MovieBase.MovieCount;

   MovieBase.First;
   for i := 1 to x do
      begin
         MovieBase.EditMovie;
         MovieBase.CurrentMovie.MovieNum := i;
         MovieBase.SaveMovie;
         MovieBase.Next;
      end;
   MovieBase.Free;
end;

procedure Init4(Owner: Integer); far;
begin
   OwnerAPP := Owner;
end;

exports
   GetName4, AMM_PluginStart4, Init4, GetVersion4;

begin
end.
Последний раз редактировалось z_a_s Пн марта 22, 2010 1:16 pm, всего редактировалось 1 раз.

iRo
Пользователь
iRo
Пользователь
Репутация: 0
С нами: 14 лет 2 месяца

Сообщение #3 iRo » Чт января 21, 2010 6:30 pm

вот спасибо!!!
сейчас попробую вставить в FAQ нужные шаги..


ойойойойойойоойойой.....
а где функция - сделать экспорт используя шаблон?????
мне именно эта функция то и нужна ((((
хочу базу фильмов на портале, и плагин для Dune.

если что сделаю, выложу тут и на портале 4iRo.ru

z_a_s
Опытный пользователь
z_a_s
Опытный пользователь
Репутация: 0
С нами: 18 лет 2 месяца
Откуда: Волгоград

Сообщение #4 z_a_s » Чт января 21, 2010 6:38 pm

iRo писал(а):ойойойойойойоойойой.....
а где функция - сделать экспорт используя шаблон?????
мне именно эта функция то и нужна ((((

Такой функции нет, надо писать самому :)

В соседней теме DenKa выложил исходники своего плагина для медиа-плейера WD TV, можно его взять за основу.

iRo
Пользователь
iRo
Пользователь
Репутация: 0
С нами: 14 лет 2 месяца

Сообщение #5 iRo » Чт января 21, 2010 6:53 pm

z_a_s писал(а):
iRo писал(а):ойойойойойойоойойой.....
а где функция - сделать экспорт используя шаблон?????
мне именно эта функция то и нужна ((((
Такой функции нет, надо писать самому :)

В соседней теме DenKa выложил исходники своего плагина для медиа-плейера WD TV, можно его взять за основу.

уже пытаюсь скачать)))
вот только фиг скачаешь с рапиды :cry:
хочу базу фильмов на портале, и плагин для Dune.

если что сделаю, выложу тут и на портале 4iRo.ru

z_a_s
Опытный пользователь
z_a_s
Опытный пользователь
Репутация: 0
С нами: 18 лет 2 месяца
Откуда: Волгоград

Сообщение #6 z_a_s » Чт января 21, 2010 6:57 pm

iRo писал(а):уже пытаюсь скачать)))
вот только фиг скачаешь с рапиды :cry:


Закинул архив на bolidesoft

UncleVader
Пользователь
UncleVader
Пользователь
Репутация: 0
С нами: 14 лет 2 месяца

Вопрос по API

Сообщение #7 UncleVader » Пт января 22, 2010 9:19 am

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

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

procedure RefreshOff; //disables refreshing of the movie details area
procedure RefreshOn;  //enables refreshing of the movie details area

из amm_pluginapi.pas. Но после вызова RefreshOff не обновляется не только основное окно, но и данные класса MovieBase. Или баг API или я чегото недопер...

iRo
Пользователь
iRo
Пользователь
Репутация: 0
С нами: 14 лет 2 месяца

Сообщение #8 iRo » Вт февраля 23, 2010 1:50 am

Добавилась функция SaveMovieCardImage

2 z_a_s добавь плз в свой пост.

PS я так и не разобрался как с ее помощью получить нужные две картинки для Dune.
Напишите плз описание и пример использования для Dune!
хочу базу фильмов на портале, и плагин для Dune.

если что сделаю, выложу тут и на портале 4iRo.ru

bolide M
Site Admin
Аватара
bolide M
Site Admin
Репутация: 8
С нами: 18 лет 2 месяца

Re: Вопрос по API

Сообщение #9 bolide » Пт февраля 26, 2010 11:42 pm

UncleVader писал(а):Но после вызова RefreshOff не обновляется не только основное окно, но и данные класса MovieBase. Или баг API или я чегото недопер...


Данные класса MovieBase заполняются вызовом функции EditMovie

bolide M
Site Admin
Аватара
bolide M
Site Admin
Репутация: 8
С нами: 18 лет 2 месяца

Сообщение #10 bolide » Пт февраля 26, 2010 11:47 pm

iRo писал(а):PS я так и не разобрался как с ее помощью получить нужные две картинки для Dune.
Напишите плз описание и пример использования для Dune!


SaveMovieCardImage просто рендерит текущий HTML шаблон для текущего фильма в картинку с заданными координатами.
Для Dune надо генерировать картинку с разрешением 1920x1080

Для получения картинки с постером надо использовать другую функцию, GetCoverImage. Она сохранит постер в JPEG формате в том разрешении, в котором она хранится в базе. Для Дюны её еще ресайзить надо.

А чем встроенный функционал для Dune не устраивает?

iRo
Пользователь
iRo
Пользователь
Репутация: 0
С нами: 14 лет 2 месяца

Сообщение #11 iRo » Пн марта 01, 2010 10:30 am

bolide писал(а):
iRo писал(а):PS я так и не разобрался как с ее помощью получить нужные две картинки для Dune.
Напишите плз описание и пример использования для Dune!

SaveMovieCardImage просто рендерит текущий HTML шаблон для текущего фильма в картинку с заданными координатами.
Для Dune надо генерировать картинку с разрешением 1920x1080

Для получения картинки с постером надо использовать другую функцию, GetCoverImage. Она сохранит постер в JPEG формате в том разрешении, в котором она хранится в базе. Для Дюны её еще ресайзить надо.

А чем встроенный функционал для Dune не устраивает?

в принцепи всем устраивает.
только очень нужно подправить:
1. пути до фильмов так:
у меня несколько дисков и в корне каждого лежит dunefolder с указанием названия hd1, hd1 и т.д.
эти названия я занес в АММ в местонахождения.
все фильмы (источники в смысле) лежат в корне дисков /.video/...
в качестве пути прописываю название местонахождения+файл/папка
получается например такая ссылка на фильм-
media_url = hd1://.video/DISTRICT_9
и теперь куда бы я ни положил папку с описанием фильма (хоть в корен, хоть в категорию "фантастика") я всегда смогу запустить просмотр))))
а в Вашем варианте, у меня всегда пути вида "дофига слешей с точками" (((
и что самое главное - если фильм блюрей, то АММ указывает на конкретный файл *.m2ts
а в дюне нужно указывать папку фильма (Film/BDMV, AACS, CERTIFICATE - указывать папку Film)!!!!!

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

может можно сделать плагин для Вашей функции вывода?
например сделаю dll с функциями
EditURL(var value:string) string // передаем ссылку на фильм, возвращает нужный для записи в dunefolder
EditOpis(var value:string) string // передаем описание фильма, возвращает отредактированное по желанию пользователя
EditComments(var value:string) string // передаем коментарий фильма, возвращает отредактированный по желанию пользователя

вот если бы Вы добавили поддержку такого плагина - то избавились бы от многочисленных просьб сделать так то и так то)))
тогда каждый сможет сделать именно так как он хочет!

Что скажите?
хочу базу фильмов на портале, и плагин для Dune.

если что сделаю, выложу тут и на портале 4iRo.ru

newminer
Пользователь
newminer
Пользователь
Репутация: 0
С нами: 14 лет 5 месяцев

Сообщение #12 newminer » Пт марта 12, 2010 3:18 pm

Вопрос к знатокам:
У меня имеется 5 пользовательских полей: 4 флажка (они, очевидно, не учитываются совсем) и 1 текстовое поле.
Следующий код выдает стабильно 0.

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

db:=TMovieBase.Create;
db.First;
for i:=1 to db.MovieCount  do begin
db.EditMovie;
ShowMessage(IntToStr(db.CurrentMovie.UDFieldsCount));
db.SaveMovie;
db.Next;
end;

В чем причина?

bolide M
Site Admin
Аватара
bolide M
Site Admin
Репутация: 8
С нами: 18 лет 2 месяца

Сообщение #13 bolide » Вт марта 16, 2010 5:56 pm

iRo писал(а):1. пути до фильмов так:
у меня несколько дисков и в корне каждого лежит dunefolder с указанием названия hd1, hd1 и т.д.
эти названия я занес в АММ в местонахождения.
все фильмы (источники в смысле) лежат в корне дисков /.video/...
в качестве пути прописываю название местонахождения+файл/папка
получается например такая ссылка на фильм-
media_url = hd1://.video/DISTRICT_9
и теперь куда бы я ни положил папку с описанием фильма (хоть в корен, хоть в категорию "фантастика") я всегда смогу запустить просмотр))))

тоже думаю доработать в этом направлении. Только названия дисков думаю брать из поля "метка диска".

iRo писал(а):а в Вашем варианте, у меня всегда пути вида "дофига слешей с точками" (((
и что самое главное - если фильм блюрей, то АММ указывает на конкретный файл *.m2ts
а в дюне нужно указывать папку фильма (Film/BDMV, AACS, CERTIFICATE - указывать папку Film)!!!!!

Если в пути к m2ts файлу встречается BDMV, то программа считает это блюреем и ссылку ставит на папку, если BDMV нет, считает это отдельным файлом и ставит, соответственно, ссылку на файл

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

так весь вид правится в используемом HTML шаблоне...

iRo писал(а):может можно сделать плагин для Вашей функции вывода?
например сделаю dll с функциями
EditURL(var value:string) string // передаем ссылку на фильм, возвращает нужный для записи в dunefolder
EditOpis(var value:string) string // передаем описание фильма, возвращает отредактированное по желанию пользователя
EditComments(var value:string) string // передаем коментарий фильма, возвращает отредактированный по желанию пользователя


честно говоря, не понял смысл этих функций :)

bolide M
Site Admin
Аватара
bolide M
Site Admin
Репутация: 8
С нами: 18 лет 2 месяца

Сообщение #14 bolide » Вт марта 16, 2010 6:04 pm

newminer писал(а):В чем причина?


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

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

iRo
Пользователь
iRo
Пользователь
Репутация: 0
С нами: 14 лет 2 месяца

Сообщение #15 iRo » Вт марта 16, 2010 6:16 pm

bolide писал(а):тоже думаю доработать в этом направлении. Только названия дисков думаю брать из поля "метка диска".
ну все таки невсегда совпадает метка диска и то что указанно в dune_folder.txt
у меня например разные они )))
bolide писал(а):Если в пути к m2ts файлу встречается BDMV, то программа считает это блюреем и ссылку ставит на папку, если BDMV нет, считает это отдельным файлом и ставит, соответственно, ссылку на файл
С этим уже разобрался, все супер спасибо.
только вот зачем же название папки формировать из название + (год) ???
может сделаете галочку "добавлять год к названию" ??? очень просим)))
bolide писал(а):так весь вид правится в используемом HTML шаблоне...
Вот интересно, а как же так сделать шаблон, что бы он строки местами менял?
ведь все эти данные записываются в два места - "Описание" и "Комментарий"
а если мне нужно в "Описании" поменять местами строчки например? к шаблону еще и java писать? (кстати а можно?)
если бы шаблоны на php писались, то тут уж все было бы просто.
bolide писал(а):
iRo писал(а):может можно сделать плагин для Вашей функции вывода?
например сделаю dll с функциями
EditURL(var value:string) string // передаем ссылку на фильм, возвращает нужный для записи в dunefolder
EditOpis(var value:string) string // передаем описание фильма, возвращает отредактированное по желанию пользователя
EditComments(var value:string) string // передаем коментарий фильма, возвращает отредактированный по желанию пользователя

честно говоря, не понял смысл этих функций :)

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

PS с возвращением. давно на форуме не появлялись, я уж и не надеялся на ответ)))
в отпуске надеюсь время провели?
хочу базу фильмов на портале, и плагин для Dune.

если что сделаю, выложу тут и на портале 4iRo.ru


Вернуться в «All My Movies»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 77 гостей