Загрузка инфы с сайта "Кинопоиск"

vikts
Posts: 1
Joined: Sun May 15, 2011 11:04 pm

Re: Загрузка инфы с сайта "Кинопоиск"

Post by vikts »

Такой вопросик, если я добавляю во всю свои коллекцию теги с кинопоиска, всё ок, отображается прекрасно на всех медиа устройствах у меня, но...
Как только я вытащу жёсткий диск из компа и потом вставлю назад, всё это теряется и приходится заново прописывать, это не проблема для 10 фильмов, но при больших коллекциях это убивает.
Есть какое то решение? Спасибо
VVS1234
Posts: 44
Joined: Sat Oct 13, 2012 10:41 pm

Re: Загрузка инфы с сайта "Кинопоиск"

Post by VVS1234 »

Надеюсь, что ветка еще жива. Возник вопрос по информации с кинопоиск.
Как я понял, вся загруженная информация сохраняется в поле Properties[mpiIMDBinfo], однако в какой-то неясной кодировке.
Есть ли возможность извлечь эту информацию в других скриптах (например, обработка ресурсов или в веб-интерфейсе) в удобочитаемом формате?

спасибо.
Eugene
Posts: 2805
Joined: Tue Sep 16, 2008 7:30 pm

Re: Загрузка инфы с сайта "Кинопоиск"

Post by Eugene »

VVS1234 wrote:Надеюсь, что ветка еще жива. Возник вопрос по информации с кинопоиск.
Как я понял, вся загруженная информация сохраняется в поле Properties[mpiIMDBinfo], однако в какой-то неясной кодировке.
Есть ли возможность извлечь эту информацию в других скриптах (например, обработка ресурсов или в веб-интерфейсе) в удобочитаемом формате?
Классы для обработки только в скриптах загрузки информации из интернет баз данных, удобного доступа в других скриптах нет, но теоретически возможно,
распакованная информация

Code: Select all

var
  MediaItem: THmsScriptMediaItem;
...
  HmsDecompressString(Copy(MediaItem.Properties[mpiIMDBInfo], 5, $FFFFFFF))
...
Формат информации

Code: Select all

<информация>::=<версия - I4><список элементов>
<список элементов>::=<количество элементов - I4>(<элемент>)
<элемент>::=<название - строка><значение - строка><эскиз - строка><список дочерних элементов - список элементов>
<строка>::=<количество символов - I4>(<символ>)
I4 - 4-х байтовое целое.
VVS1234
Posts: 44
Joined: Sat Oct 13, 2012 10:41 pm

Re: Загрузка инфы с сайта "Кинопоиск"

Post by VVS1234 »

Eugene wrote:теоретически возможно,
распакованная информация

Code: Select all

var
  MediaItem: THmsScriptMediaItem;
...
  HmsDecompressString(Copy(MediaItem.Properties[mpiIMDBInfo], 5, $FFFFFFF))
...
Формат информации

Code: Select all

<список элементов>::=<количество элементов - I4>(<элемент>)
<элемент>::=<название - строка><значение - строка><эскиз - строка><список дочерних элементов - список элементов>
<строка>::=<количество символов - I4>(<символ>)
I4 - 4-х байтовое целое.
Спасибо, Eugene. Работает!

Единственно, что хотелось бы понять, это как можно конвертировать нечитаемые символы (напр., ї ) в символы формата (::=, >, и т.д.):

Code: Select all

      	   Кинопоиск              Название   Игра без правил-   http://st.kinopoisk.ru/images/film/448239.jpg       Год   2010           Страна   США, ОАЭ           Слоган   «Жена. Мать. Шпион.»           Режиссер 
   Даг Лайман           Сценарий9   Джез Баттеруорт, Джон-Генри Баттерворт, Джозеф Уилсон,...           Продюсер/   Джез Баттеруорт, Акива Голдсман, Даг Лайман,...           Оператор
   Даг Лайман        
   Композитор   Джон Пауэлл           Жанр   триллер, драма, биография,...           Бюджет   $22 000 000           Премьера (мир)   20 мая 2010,...        
   Премьера (РФ)   2 июня 2011, «Парадиз»           Релиз на DVD    7 июля 2011, «Парадиз Медиа»,...           Релиз на Blu-Ray!   28 июля 2011, «Парадиз Медиа»,...           Время   108 мин./ 01:48           Рейтинг IMDB
   6.80 (25 311)           Описаниеї  Грязные интриги Белого дома, тайны политики президента Буша, сенсационные факты о войне в Ираке… Один из самых громких политических скандалов США закручивается вокруг семьи посла Джона Уилсона и секретного агента Валери Плейм. Чтобы наказать бывшего дипломата, придавшего огласку секретным материалам, власти обвиняют его жену в шпионаже и угрожают расправой над семьей. Но Джо и Валери сломить невозможно, чтобы выжить, они готовят ответный удар.           В главных ролях        
      Наоми Уоттс    .   http://www.kinopoisk.ru/images/actor/27221.jpg       Шон Пенн    -   http://www.kinopoisk.ru/images/actor/1293.jpg       Ананд Тивари    0   http://www.kinopoisk.ru/images/actor/1579692.jpg    
   Джессика Хехт    .   http://www.kinopoisk.ru/images/actor/21656.jpg       Ребекка Ригг    .   http://www.kinopoisk.ru/images/actor/85178.jpg    	   Брук Смит    .   http://www.kinopoisk.ru/images/actor/22535.jpg       Томас МакКарти    -   http://www.kinopoisk.ru/images/actor/9215.jpg       Майкл Келли    .   http://www.kinopoisk.ru/images/actor/20437.jpg       Кристоффер Райан Уинтерс    .   http://www.kinopoisk.ru/images/actor/34385.jpg    	   Шон Махон    .   http://www.kinopoisk.ru/images/actor/29982.jpg    
Eugene
Posts: 2805
Joined: Tue Sep 16, 2008 7:30 pm

Re: Загрузка инфы с сайта "Кинопоиск"

Post by Eugene »

Пример для текущего файла в списке фильмов, показывает список тегов

Code: Select all

function ReadInteger(const aText: string; var aPosition: Integer): Integer;
begin
  Result := Ord(aText[aPosition + 1]) + Ord(aText[aPosition + 2]) shl 8 + 
            Ord(aText[aPosition + 3]) shl 16 + Ord(aText[aPosition + 4]) shl 24;
  aPosition := aPosition + 4           
end;

function ReadString(const aText: string; var aPosition: Integer): string;
var
  iLength: Integer;
begin
  iLength := ReadInteger(aText, aPosition);
  Result := Copy(aText, aPosition + 1, iLength);
  aPosition := aPosition + iLength
end;

function ReadItems(const aText: string; aPosition: Integer): Integer;
var
  i, iCount: Integer;
  sName, sValue, sThumbnail, sInfo: string;
begin
  Result := aPosition;
  if Result < Length(aText) then begin
    iCount := ReadInteger(aText, Result);
    if iCount > 0 then begin
      for i := 0 to iCount - 1 do begin
        sName  := ReadString(aText, Result);
        sValue := ReadString(aText, Result);
        sThumbnail := ReadString(aText, Result);
        sInfo := sName + ': ' + sValue;
        if Copy(sThumbnail, 1, 5) = 'http:' then
          sInfo := sInfo + ': ' + sThumbnail; 
        ShowMessage(sInfo);
        Result := ReadItems(aText, Result);
      end  
    end
  end  
end;

var
  iVersion, iPosition: Integer;
  sImdbInfo: string;
begin
  iPosition := 0;
  sImdbInfo := HmsCurrentMediaListItem.Properties[mpiIMDBInfo];
  if sImdbInfo <> '' then begin
    sImdbInfo := HmsDecompressString(Copy(sImdbInfo, 5, $FFFFFFF));
    if sImdbInfo <> '' then begin
      iVersion := ReadInteger(sImdbInfo, iPosition);
      if iVersion = 1 then
        ReadItems(sImdbInfo, iPosition);
    end
  end      
end.
VVS1234
Posts: 44
Joined: Sat Oct 13, 2012 10:41 pm

Re: Загрузка инфы с сайта "Кинопоиск"

Post by VVS1234 »

Eugene wrote:Пример для текущего файла в списке фильмов, показывает список тегов
Огромное спасибо -- то, что нужно, и все работает.
VVS1234
Posts: 44
Joined: Sat Oct 13, 2012 10:41 pm

Re: Загрузка инфы с сайта "Кинопоиск"

Post by VVS1234 »

Хотелось бы уточнить:
1) Авто Подгрузка IMDB данных возможна только для списка внутри конкретной папки (или для списка серий эпизода). В этой связи --
а) возможно ли вызвать скрипт подгрузки из скрипта обработки ресурсов?
б) возможно ли запустить подгрузку IMDB для из нескольких папок?

2) Альтернативно: возможно ли заполнить поле Properties[mpiIMDBInfo] из скрипта обработки ресурсов?

Основная цель -- получить максимум мета-информации для большого объема медиа-ресурсов -- максимально автоматизированно.
Спасибо
Eugene
Posts: 2805
Joined: Tue Sep 16, 2008 7:30 pm

Re: Загрузка инфы с сайта "Кинопоиск"

Post by Eugene »

VVS1234 wrote:Хотелось бы уточнить:
1) Авто Подгрузка IMDB данных возможна только для списка внутри конкретной папки (или для списка серий эпизода). В этой связи --
а) возможно ли вызвать скрипт подгрузки из скрипта обработки ресурсов?
б) возможно ли запустить подгрузку IMDB для из нескольких папок?

2) Альтернативно: возможно ли заполнить поле Properties[mpiIMDBInfo] из скрипта обработки ресурсов?

Основная цель -- получить максимум мета-информации для большого объема медиа-ресурсов -- максимально автоматизированно.
Спасибо
Скрипты обработки медиа-ресурсов позволяют загрузить мета-информацию из произвольного источника и запомнить в существующих свойствах или определенных пользователем, но без использования классов THmsIMDBInfo, THmsIMDBItem (доступны с версии 1.30.4).

Скрипты загрузки информации из интернет баз данных позволяют загрузить мета-информацию из произвольного источника и запомнить в существующих свойствах (в том числе mpiIMDBInfo) или определенных пользователем с использованием классов THmsIMDBInfo, THmsIMDBItem. Пример загрузки мета-информации для произвольного списка медиа-ресурсов - скрипт TheTVDB.com.

В скриптах можно использовать произвольные диалоговые формы (пример - http://www.homemediaserver.ru/forum/vie ... =16&t=2100).
rvlad1987
Posts: 2
Joined: Thu Oct 03, 2013 11:55 am

Re: Загрузка инфы с сайта "Кинопоиск"

Post by rvlad1987 »

Подправил скрипт, а то добавляеться постоянно "... слова" в жанр.
Функция AddMediaInfo ;)
[+] Скрипт

Code: Select all

const
  csKinopoiskTitle         = '<title>(.*?)</title>';
  csKinopoiskImage         = 'src="([^"]*/images/film.*?/.*?)"';
  csKinopoiskOriginalName  = '<span style="color: \#666; font-size: 13px">(.*?)</span>';
  csKinopoiskRatingMPAA    = '<img src='#39'/images/mpaa/(.*?).gif'#39' height=11 alt';
  csKinopoiskCast          = 'В главных ролях:(.*?)</div>';
  csKinopoiskCastActor     = '<li.*?<a href="/name/(.*?)/".*?>(.*?)</a>';                                         
  csKinopoiskIMDB          = 'IMDB: (.*?)</div>';
  csKinopoiskRating        = 'text-decoration: none">(.*?)<span style="font:100';
  csKinopoiskDescripton    = 'itemprop="description".*?>(.*?)</td></tr>';  

  csKinopoiskActorImage    = 'src='#39'/images/actor/(.*?)'#39;  

function GetLink(const aLink: string): string;
begin
  if aLink <> '' then
    if Pos('://', aLink) > 0 then
      Result := aLink
    else
      Result := 'http://www.kinopoisk.ru' + aLink
  else
    Result := ''        
end;  
  
function FindMediaInfo(const aRegEx: string; var aMatch: string): Boolean;
begin
  with TRegExpr.Create(aRegEx, PCRE_SINGLELINE) do try
    Result := Search(HtmlText);
    if Result then       
      aMatch := Match;      
  finally
    Free
  end    
end;

function TrimCommas(const aText: string): string;
var
  i, j: Integer;
begin
  Result := '';
  if aText <> '' then begin
    i := 1; j := Length(aText);
    while (i <= j) and (aText[i] in ['.', ',']) do
      Inc(i);
    while (j > i) and (aText[j] in ['.', ',']) do
      Dec(j);
    if i <= j then
      Result := Copy(aText, i, j - i + 1)
  end         
end;

function AddMediaInfo(aImdbItem: THmsIMDBItem; const aRegExpr, aCaption: string; 
                      const aImageRegExpr: string = ''): THmsIMDBItem;
var
  sMatch, aCaptionValue: string;
begin
  Result := nil;
  if FindMediaInfo(aRegExpr, sMatch) then begin
    // *** Если добавляем жанр, то убираем ',... слова' иначе как всегда - 03/10/2013
    if aCaption = 'Жанр' then    
      aCaptionValue := ReplaceStr(TrimCommas(ReplaceStr(HmsHtmlToText(sMatch), '|', '')), ',... слова', '')
    else
      aCaptionValue := TrimCommas(ReplaceStr(HmsHtmlToText(sMatch), '|', ''));
    // ***   
    Result := aImdbItem.ChildList.AddItem(aCaption, aCaptionValue);
    if (aImageRegExpr <> '') and FindMediaInfo(aImageRegExpr, sMatch) then
      Result.Image := GetLink(sMatch)
  end
end;

procedure AddMediaInfoMulti(aImdbItem: THmsIMDBItem; const aParams: array of string);
var
  i: Integer;
begin
  i := 0;
  while i < Length(aParams) do begin
    AddMediaInfo(aImdbItem, aParams[i], aParams[i + 1]);
    Inc(i, 2)
  end  
end;

procedure AddMediaInfoGeneric(aImdbItem: THmsIMDBItem; const aPrefixRegEx: array of string);
const
  GenericRegEx = '</td>(.*?)(</td>|keywordLink).*?</tr>';
var
  i: Integer;
  sCaption: string;
begin
  for i := 0 to Length(aPrefixRegEx) - 1 do begin
    sCaption := ReplaceStr(aPrefixRegEx[i], '\', '');
    AddMediaInfo(aImdbItem, aPrefixRegEx[i] + GenericRegEx, 
        UpperCase(Copy(sCaption, 1, 1)) + Copy(sCaption, 2, Length(sCaption) - 1))
  end               
end;

procedure AddCastInfo(aImdbItem: THmsIMDBItem);
var
  CastItem: THmsIMDBItem;                     
  i: Integer;
  sCastInfo, sPriorActor: string;
begin
  if FindMediaInfo(csKinopoiskCast, sCastInfo) then begin
    CastItem := aImdbItem.ChildList.AddItem('В главных ролях', '');    
    i := Pos('Роли дублировали', sCastInfo);
    if i > 0 then
      sCastInfo := Copy(sCastInfo, 1, i - 1);
    with TRegExpr.Create(csKinopoiskCastActor, PCRE_SINGLELINE) do try    
      sPriorActor := '';
      if Search(sCastInfo) then repeat      
        if sPriorActor <> Match(2) then begin        
          sPriorActor := Match(2); 
          CastItem.ChildList.AddItem(HmsHtmlToText(sPriorActor), '', 'http://www.kinopoisk.ru/images/actor/' + Match + '.jpg')
        end            
      until not SearchAgain; 
    finally
      Free
    end    
  end
end;

procedure SetMediaItemProperties(aImdbItem: THmsIMDBItem; const aParams: array of string);
var
  i: Integer;
  ImdbParam: THmsIMDBItem;               
  sPropertyName, sPropertyValue: string;
begin
  i := 0;
  while i < Length(aParams) do begin  
    ImdbParam := aImdbItem.ChildList.FindItem(aParams[i]);
    if ImdbParam <> nil then begin    
      sPropertyName  := aParams[i + 1];
      sPropertyValue := ImdbParam.Value;      
      if (sPropertyName = 'mpTitle') and (mpTrack > 0) then      
        sPropertyValue := sPropertyValue + Format(' [%d]', [mpTrack])
      else if sPropertyName = 'mpYear' then
        HmsRegExMatch('(\d+)', sPropertyValue, sPropertyValue);   
      HmsSetMediaItemProperty(sPropertyName, sPropertyValue);
    end;   
    Inc(i, 2)
  end  
end;

var
  i: Integer;
  IMDBItem, ActorItem, TitleItem: THmsIMDBItem;
  IMDBInfo: THmsIMDBInfo;  
  sActorList, sHeader, sLink: string;
begin
  if ResultsViewMode = 2 then begin  
    sLink := HmsGetResultsValue(10);    
    if (sLink <> '') and HmsRegExMatch('http://www\.kinopoisk\.ru(/.*)', sLink, sLink) then     
      HtmlText := HmsSendRequestEx('www.kinopoisk.ru', sLink, 'GET', '',
           'http://www.kinopoisk.ru'#13#10'Accept: */*'#13#10'Accept-Encoding: gzip, deflate', '', 80, 0, sHeader, True)
    else              
      HtmlText := '';      
  end;
  if HtmlText <> '' then begin
    IMDBInfo := THmsIMDBInfo.Create;
    try                            
      IMDBItem := IMDBInfo.AddItem('Кинопоиск', '');
      AddMediaInfo(IMDBItem, csKinopoiskTitle, 'Название', csKinopoiskImage); 
      AddMediaInfo(IMDBItem, csKinopoiskOriginalName, 'Оригинальное название');
      AddMediaInfoGeneric(IMDBItem, ['год', 'страна', 'слоган', 'режиссер', 
                                    'сценарий', 'продюсер', 'оператор', 
                                    'композитор', 'жанр', 'бюджет', 
                                    'премьера \(мир\)', 'премьера \(РФ\)',
                                    'релиз на DVD', 'релиз на Blu-Ray', 'время']);
      AddMediaInfoMulti(IMDBItem, [csKinopoiskRatingMPAA, 'Рейтинг MPAA',
                                  csKinopoiskIMDB,       'Рейтинг IMDB',
                                  csKinopoiskRating,     'Рейтинг',
                                  csKinopoiskDescripton, 'Описание']);
      AddCastInfo(IMDBItem);                            
      MediaInfo := IMDBInfo.SaveToString;
      SetMediaItemProperties(IMDBItem, ['Название', 'mpTitle', 'Жанр', 'mpGenre',
                 'Продюсер', 'mpProducer', 'Режиссер', 'mpDirector', 
                 'Год', 'mpYear', 'Рейтинг MPAA', 'mpRating', 
                 'Описание', 'mpComment']);
  {    ActorItem := IMDBItem.ChildList.FindItem('В главных ролях\0');
      if ActorItem <> nil then
        HmsSetMediaItemProperty('mpActor', ActorItem.Name);}      
     // Actor List  
      ActorItem := IMDBItem.ChildList.FindItem('В главных ролях');
      if ActorItem <> nil then begin
        sActorList := '';
        for i := 0 to ActorItem.ChildList.Count - 1 do begin           
          if sActorList <> '' then 
            sActorList := sActorList + ', ';
          sActorList := sActorList + ActorItem.ChildList[i].Name;
        end;
        if sActorList <> '' then
          HmsSetMediaItemProperty('mpActor', sActorList);  
      end;
      TitleItem := IMDBItem.ChildList.FindItem('Название');
      if (TitleItem <> nil) and (TitleItem.Image <> '') then
        HmsSetMediaItemProperty('mpThumbnail', TitleItem.Image);
    finally
      IMDBInfo.Free
    end    
  end    
end.
Post Reply