(*************************************************** Ant Movie Catalog importation script www.antp.be/software/moviecatalog/ [Infos] Authors=Antoine Potten, Dedej Title=DVDFR.com Description=Importation des données et image de DVDFR.com (pour utilisation personnelle uniquement !) Site=www.dvdfr.com Language=FR Version=1.40 du 22/07/2010 Requires=3.5.0 Comments=Merci à l'équipe de DVDFR de fournir un accès simplifié à leurs données.|Pour rappel, ces données sont accessibles uniquement pour une utilisation personnelle ; en aucun cas elles ne peuvent être utilisées commerciallement ou publiquement !|L'ancienne version du script avait été développée par Antoine Potten et Fabrice Fert. License=Ce script permet de récupérer les données du site de DVDFR pour une utilisation personnelle uniquement.|Ces données ne peuvent pas être récupérées ni exploitées dans un but commercial ou même pour une utilisation publique.|En utilisant ce script vous déclarez accepter ces conditions et endosser toute responsabilité dans la manière dont vous utilisez ces données. GetInfo=1 [Options] Mise à jour du Script=0|0|0=Pas de mise à jour|1=Mise à jour du script Typederecherche=0|0|0=Recherche sur le titre|1=Recherche sur lien Web ListePays=1|1|0=Ne prend que le premier pays de la liste|1=Prend la liste de tous les pays, séparés par des virgules ListeCategories=1|1|0=Ne prend que la première catégorie de la liste|1=Prend la liste de toutes les catégories, séparées par des virgules Bonus=1|1|0=N'importe pas la liste des bonus|1=Importe la liste des bonus dans le champ Commentaires FormatVideo=1|1|0=Spécifie "MPEG2" d'office|1=Description longue du format d'image mis dans le champ "Format Vidéo" Reference=0|0|0=N'importe pas la référence|1=Importe la référence dans le champ "Label du média" GarderCommentaires=0|0|0=Ne pas garder les commentaires|1=Garder les commentaires précédents TypeMedia=2|0|0=DVD|1=BRD|2=Tous ***************************************************) program DVDFR; uses StringUtils7552; const VersionScript = '1.40 du 22/07/2010'; ScriptName = 'DVDFR.ifs'; SiteUrl = 'http://joel.desseaux.free.fr/DVD.FR/'; var MovieName: string; Maj, PMaj: Integer; // *** téléchargement et analyse des pages, contruction de la liste de choix de titres procedure AnalyzePage(Address: string); var xml: TJvSimpleXml; CurItem: TJvSimpleXmlElem; i: Integer; s1, s2: string; begin if (GetOption('Typederecherche') = 0) or (copy(GetField(fieldURL),1,16)<>'http://www.dvdfr') then begin Address := StringReplace(Address, 'dvdfr.com/dvd/', 'dvdfr.com/api/'); xml := TJvSimpleXml.Create(nil); xml.LoadFromString(GetPage(Address)); //xml.LoadFromFile('T:\dvd.xml'); if xml.Root.Name = 'dvds' then begin if xml.Root.Items.Count = 0 then begin ShowInformation('Aucun film trouvé pour "' + MovieName + '"'); xml.Free; Exit; end; PickTreeClear; PickTreeAdd('Résultats de la recherche de "' + MovieName + '"', ''); for i := 0 to xml.Root.Items.Count-1 do begin CurItem := xml.Root.Items.GetItem(i); s1 := CurItem.Items.GetItemNamed('titres').Items.GetItemNamed('fr').Value; s2 := CurItem.Items.GetItemNamed('titres').Items.GetItemNamed('vo').Value; if s2 <> '' then s1 := s1 + ' (' + s2 + ')'; if CurItem.Items.GetItemNamed('stars').Items.Count > 0 then begin s2 := CurItem.Items.GetItemNamed('stars').Items.GetItem(0).Value; if s2 <> '' then s1 := s1 + ' / ' + s2; end; s2 := CurItem.Items.GetItemNamed('edition').Value; if s2 <> '' then s1 := s1 + ' / ' + s2; s2 := CurItem.Items.GetItemNamed('editeur').Value; if s2 <> '' then s1 := s1 + ' / ' + s2; s2 := CurItem.Items.GetItemNamed('media').Value; if (GetOption('TypeMedia') = 2) and (s2 <> '') then s1 := s1 + ' / ' + s2; HtmlDecode(s1); if ((GetOption('TypeMedia') = 2) or ((GetOption('TypeMedia') = 0) and (pos('DVD', s2)=1)) or ((GetOption('TypeMedia') = 1) and (pos('BRD', s2)=1))) then PickTreeAdd(s1, 'http://www.dvdfr.com/dvd/dvd.php?id=' + CurItem.Items.GetItemNamed('id').Value); end; if PickTreeExec(Address) then AnalyzePage(Address); end else if xml.Root.Name = 'dvd' then begin AnalyzeMoviePage(xml); end; if xml.Root.Name = 'errors' then begin ShowError(xml.Root.Items.GetItemNamed('error').Items.GetItemNamed('message').Value); end; end else begin xml := TJvSimpleXml.Create(nil); if pos('dvd/f',Address)= 0 then xml.LoadFromString(GetPage(UrlEncode('http://www.dvdfr.com/api/dvd.php?id=' + copy(Address,pos('?id=',Address)+4,Length(Address)- (pos('?id=',Address)+3))))) else if pos('-',Address)= 0 then xml.LoadFromString(GetPage(UrlEncode('http://www.dvdfr.com/api/dvd.php?id=' + copy(Address,pos('dvd/f',Address)+5,Length(Address)- (pos('dvd/f',Address)+5))))) else xml.LoadFromString(GetPage(UrlEncode('http://www.dvdfr.com/api/dvd.php?id=' + copy(Address,pos('dvd/f',Address)+5,pos('-',Address)- (pos('dvd/f',Address)+5))))); AnalyzeMoviePage(xml); end; xml.Free; end; // *** analyse d'une fiche de film procedure AnalyzeMoviePage(xml: TJvSimpleXml); var Items: TJvSimpleXmlElems; CurItem, SubItem: TJvSimpleXmlElem; Prop: TJvSimpleXmlProp; s1, s2: string; i: Integer; begin Items := xml.Root.Items; SetField(fieldURL, Items.GetItemNamed('url').Value); s1 := ''; s2 := ''; CurItem := Items.GetItemNamed('titres'); if CurItem <> nil then begin SubItem := CurItem.Items.GetItemNamed('fr'); if SubItem <> nil then s1 := SubItem.Value; SubItem := CurItem.Items.GetItemNamed('vo'); if SubItem <> nil then s2 := SubItem.Value; end else begin CurItem := Items.GetItemNamed('titres_fr'); if CurItem <> nil then s1 := CurItem.Value; CurItem := Items.GetItemNamed('titres_vo'); if CurItem <> nil then s2 := CurItem.Value; end; if s2 = '' then SetField(fieldOriginalTitle, s1) else begin SetField(fieldOriginalTitle, s2); SetField(fieldTranslatedTitle, s1); end; if CanSetField(fieldCountry) then begin s1 := ''; CurItem := Items.GetItemNamed('listePays'); for i := 0 to CurItem.Items.Count-1 do begin if s1 <> '' then begin if GetOption('ListePays') = 0 then Break else s1 := s1 + ', '; end; s1 := s1 + CurItem.Items.GetItem(i).Value; end; SetField(fieldCountry, s1); // end; end; SetField(fieldYear, Items.GetItemNamed('annee').Value); s1 := StringReplace(StringReplace(Items.GetItemNamed('synopsis').Value, #10, ' '), #13, ''); s1 := StringReplace(s1, '&', '...'); HtmlDecode(s1); SetField(fieldDescription, s1); SetField(fieldLength, Items.GetItemNamed('duree').Value); CurItem := Items.GetItemNamed('disques'); if CurItem <> nil then begin SetField(fieldDisks, CurItem.Properties.GetItemNamed('nbdiscs').Value); if CurItem.Items.Count > 0 then SetField(fieldMediaType, CurItem.Items.GetItem(0).Value); end; if CanSetField(fieldVideoBitrate) then begin CurItem := Items.GetItemNamed('bitrate'); if CurItem <> nil then begin s1 := CurItem.Value; if CurItem.Properties.GetItemNamed('unite').Value = 'mbits/s' then s1 := FloatToStr(StrToFloat(StringReplace(s1, ',', '.')) * 1000.0); if s1 > '0' then SetField(fieldVideoBitrate, s1); end; end; CurItem := Items.GetItemNamed('image'); if CurItem.Items.Count > 0 then begin if CurItem.Items.GetItemNamed('aspect_ratio').Value <> '0.00' then SetField(fieldResolution, CurItem.Items.GetItemNamed('aspect_ratio').Value); if ((GetField(fieldMediaType) = '') or (GetField(fieldMediaType) = 'VHS') or (GetField(fieldMediaType) = 'VHS-LP') or (GetField(fieldMediaType) = 'SVHS') or (GetField(fieldMediaType) = 'SVHS-LP') or (GetField(fieldMediaType) = 'DVD') or (GetField(fieldMediaType) = 'DVD-5') or (GetField(fieldMediaType) = 'DVD-9') or (GetField(fieldMediaType) = 'DVD-18') or (GetField(fieldMediaType) = 'BD-25') or (GetField(fieldMediaType) = 'BD-50') or (GetField(fieldMediaType) = 'HD DVD-30')) then begin SubItem := CurItem.Items.GetItemNamed('Format'); if (GetOption('FormatVideo') = 0) and (SubItem <> nil) and (GetField(fieldMediaType) <> 'VHS') and (GetField(fieldMediaType) <> 'VHS-LP') and (GetField(fieldMediaType) <> 'SVHS') and (GetField(fieldMediaType) <> 'SVHS-LP') then SetField(fieldVideoFormat, 'MPEG2, ' + SubItem.Value) else SetField(fieldVideoFormat, SubItem.Value); if CanSetField(fieldComments) then begin s1 := ''; SubItem := CurItem.Items.GetItemNamed('standard'); if SubItem <> nil then s1 := SubItem.Value; SubItem := CurItem.Items.GetItemNamed('mode'); if SubItem <> nil then s1 := s1 + ', ' + SubItem.Value; if (GetOption('GarderCommentaires') = 1) then begin if s1 = '' then SetField(fieldComments, '' + GetField(fieldComments)) else SetField(fieldComments, s1+ #13#10 + #13#10 + GetField(fieldComments)); end else begin SetField(fieldComments, s1); end; end; end else if ((GetField(fieldMediaType) <> 'VHS') and (GetField(fieldMediaType) <> 'VHS-LP') and (GetField(fieldMediaType) <> 'SVHS') and (GetField(fieldMediaType) <> 'SVHS-LP')) and (GetField(fieldMediaType) <> 'CD-ROM') and (GetField(fieldMediaType) <> 'CD') then SetField(fieldVideoFormat, 'MPEG2'); end; s1 := Items.GetItemNamed('rating').Value; if GetField(fieldComments) <> '' then s1 := Items.GetItemNamed('rating').Value + #13#10#13#10 + GetField(fieldComments); if s1 <> '' then SetField(fieldComments, s1); s1 := Items.GetItemNamed('media').Value; s1 := StringReplace(s1, 'BRD', 'Blu-ray'); CurItem := Items.GetItemNamed('zones'); if CurItem.Items.Count > 0 then begin if CurItem <> nil then begin s2 := ''; for i := 0 to CurItem.Items.Count-1 do begin if i > 0 then s2 := s2 + ' - ' + CurItem.Items.GetItem(i).Value else s2 := CurItem.Items.GetItem(i).Value; end; end; end; if s2 <> '' then s1 := s1 + ' zone ' + s2; if GetField(fieldComments) <> '' then s1 := s1 + ', ' + GetField(fieldComments); SetField(fieldComments, s1); CurItem := Items.GetItemNamed('critiques'); if CurItem.Items.Count > 0 then if (CurItem.Items.GetItemNamed('public').Value > '0.0') then SetField(fieldrating, CurItem.Items.GetItemNamed('public').Value) else if (CurItem.Items.GetItemNamed('dvdfr').Value > '0.0') then SetField(fieldrating, CurItem.Items.GetItemNamed('dvdfr').Value); if CanSetField(fieldActors) or CanSetField(fieldDirector) then begin GetStars(Items.GetItemNamed('stars').Items); if GetField(fieldDirector) = '' then begin CurItem := Items.GetItemNamed('realisateurs'); if CurItem <> nil then begin s1 := ''; for i := 0 to CurItem.Items.Count-1 do begin if i > 0 then s1 := s1 + ', '; s1 := s1 + CurItem.Items.GetItem(i).Value; end; SetField(fieldDirector, s1); end; end; end; if CanSetField(fieldCategory) then begin s1 := ''; CurItem := Items.GetItemNamed('categories'); for i := 0 to CurItem.Items.Count-1 do begin if s1 <> '' then begin if GetOption('ListeCategories') = 0 then Break else s1 := s1 + ', '; end; s1 := s1 + CurItem.Items.GetItem(i).Value; end; SetField(fieldCategory, s1); end; if CanSetField(fieldLanguages) or CanSetField(fieldAudioFormat) then GetAudioTracks(Items.GetItemNamed('audiotracks').Items); if CanSetField(fieldSubtitles) then begin CurItem := Items.GetItemNamed('soustitrage'); s1 := ''; for i := 0 to CurItem.Items.Count-1 do begin Prop := CurItem.Items.GetItem(i).Properties.GetItemNamed('type'); if Prop = nil then s2 := '' else s2 := Prop.Value; if (s2 = '') or (s2 = 'normal') then begin if s1 <> '' then s1 := s1 + ', '; s1 := s1 + CurItem.Items.GetItem(i).Value; end; if s2 = 'malentendants' then begin if s1 <> '' then if pos('Malentendants', s1) = 0 then s1 := s1 + ', Malentendants: ' else s1 := s1 + ', '; s1 := s1 + CurItem.Items.GetItem(i).Value; end; end; SetField(fieldSubtitles, s1); end; if ((GetField(fieldMediaType) = '') or (GetField(fieldMediaType) = 'DVD') or (GetField(fieldMediaType) = 'DVD-5') or (GetField(fieldMediaType) = 'DVD-9') or (GetField(fieldMediaType) = 'DVD-18') or (GetField(fieldMediaType) = 'BD-25') or (GetField(fieldMediaType) = 'BD-50') or (GetField(fieldMediaType) = 'HD DVD-30')) then begin if CanSetField(fieldComments) then begin CurItem := Items.GetItemNamed('listeBonus'); s1 := ''; for i := 0 to CurItem.Items.Count-1 do begin s2 := StringReplace(CurItem.Items.GetItem(i).Value, #10, #13#10); s2 := Trim(StringReplace(s2, #13#13, #13)); s2 := StringReplace(s2, '’', '`'); s2 := StringReplace(s2, '', ''); s2 := StringReplace(s2, '', ''); s2 := StringReplace(s2, '', ''); s2 := StringReplace(s2, '', ''); HTMLDecode(s2); if (s1 <> '') and (s2 <> '') then s1 := s1 + #13#10 + s2 else s1 := s1 + s2; end; if GetField(fieldComments) <> '' then s1 := s1 + #13#10#13#10 + GetField(fieldComments); s1 := StringReplace(s1, #13#10#13#10#13#10, #13#10#13#10); SetField(fieldComments, s1); end; end; if ((GetField(fieldMediaType) = '') or (GetField(fieldMediaType) = 'DVD') or (GetField(fieldMediaType) = 'DVD-5') or (GetField(fieldMediaType) = 'DVD-9') or (GetField(fieldMediaType) = 'DVD-18') or (GetField(fieldMediaType) = 'BD-25') or (GetField(fieldMediaType) = 'BD-50') or (GetField(fieldMediaType) = 'HD DVD-30')) then begin if CanSetField(fieldComments) then begin CurItem := Items.GetItemNamed('contenu'); s1 := ''; for i := 0 to CurItem.Items.Count-1 do begin s2 := StringReplace(CurItem.Items.GetItem(i).Value, #10, #13#10); s2 := Trim(StringReplace(s2, #13#13, #13)); s2 := StringReplace(s2, '’', '`'); s2 := StringReplace(s2, '', ''); s2 := StringReplace(s2, '', ''); s2 := StringReplace(s2, '', ''); s2 := StringReplace(s2, '', ''); HTMLDecode(s2); if (s1 <> '') and (s2 <> '') then s1 := s1 + #13#10 + s2 else s1 := s1 + s2; end; if (GetField(fieldComments) <> '') and (s1 <> '') then s1 := s1 + #13#10#13#10 + GetField(fieldComments) else s1 := GetField(fieldComments); s1 := StringReplace(s1, #13#10#13#10#13#10, #13#10#13#10); SetField(fieldComments, s1); end; end; if CanSetField(fieldProducer) then begin s1 := Items.GetItemNamed('studio').Value; s1 := StringReplace(s1, #13#10, ' '); SetField(fieldProducer, s1); end; if CanSetField(fieldMedia) and (GetOption('Reference') <> 0) then begin s1 := Items.GetItemNamed('reference').Value; SetField(fieldMedia, s1); end; CurItem := Items.GetItemNamed('cover'); if CurItem <> nil then begin s1 := CurItem.Value; if Pos('nocover', s1) = 0 then GetPicture(s1); end; end; // *** récupère les acteurs et réalisateurs dans la liste des stars procedure GetStars(Items: TJvSimpleXmlElems); var sActors, sDirectors, val: string; i: Integer; CurItem: TJvSimpleXmlElem; Prop: TJvSimpleXmlProp; begin sActors := ''; sDirectors := ''; for i := 0 to Items.Count-1 do begin CurItem := Items.GetItem(i); Prop := CurItem.Properties.GetItemNamed('type'); if Prop = nil then val := '' else val := Prop.Value; if (val = '') or (val = 'Acteur') then begin if sActors <> '' then sActors := sActors + ', '; sActors := sActors + CurItem.Value; end else if val = 'Réalisateur' then begin if sDirectors <> '' then sDirectors := sDirectors + ', '; sDirectors := sDirectors + CurItem.Value; end end; SetField(fieldActors, sActors); SetField(fieldDirector, sDirectors); end; // *** récupère les langues et formats des pistes audio procedure GetAudioTracks(Items: TJvSimpleXmlElems); var i: Integer; sFormats, sLanguages: string; CurItem: TJvSimpleXmlElem; begin sFormats := ''; sLanguages := ''; for i := 0 to Items.Count-1 do begin CurItem := Items.GetItem(i); if sFormats <> '' then sFormats := sFormats + ', '; if sLanguages <> '' then sLanguages := sLanguages + ', '; sFormats := sFormats + Trim(CurItem.Items.GetItemNamed('standard').Value + ' ' + CurItem.Items.GetItemNamed('encodage').Value); sLanguages := sLanguages + CurItem.Items.GetItemNamed('langue').Value end; SetField(fieldAudioFormat, sFormats); SetField(fieldLanguages, sLanguages); end; //------------------------------------------------------------------------------ // Vérifie s'il existe une nouvelle version du script // et propose de la télécharger //------------------------------------------------------------------------------ procedure CheckScriptVersion(); var Page, Script: TStringList; Line, ScriptsDirectory, FileName, ScriptText, Fich: string; LineNr, BeginPos, EndPos: Integer; CurrentVersion, NewVersion: real; begin Page := TStringList.Create; FileName := UrlEncode(ScriptName); FileName := StringReplace(FileName, '%2E', '.'); FileName := StringReplace(FileName, '+', '%20'); Page.Text := GetPage(SiteUrl + FileName); ScriptsDirectory := GetStatic('path'); //SetStatic('path', ScriptsDirectory); LineNr := FindLine('Version=', Page, 0); if LineNr > -1 then begin Line := Page.GetString(LineNr); BeginPos := pos('Version=', Line) + 8; EndPos := pos(' du', Line); CurrentVersion := StrToFloat(copy(VersionScript, 1, pos('du', VersionScript) - 2)); NewVersion := StrToFloat(copy(Line, BeginPos, EndPos - BeginPos)); if (NewVersion > CurrentVersion) then begin if ShowConfirmation('Une nouvelle version du script est disponible : ' + copy(Line, BeginPos, EndPos - BeginPos)+ #13#10#13#10 + '- Cliquez sur ''''Oui'''' pour effectuer la mise à jour.' + #13#10#13#10 + '- Cliquez sur ''''Non'''' dans le cas contraire.') = True then begin FileName := ScriptName; Sleep(500); ScriptText := Page.Text; Script := TStringList.Create; Script.Add(ScriptText); FileName := StringReplace(FileName, '%20', ' '); Script.SaveToFile(ScriptsDirectory + FileName); Maj := 1; ShowInformation('Vous avez mis à jour le script, quitter la fenêtre de scripts et relancez la.'); Script.Free; end; end else end; end; // *** début du programme *** begin PMaj := PMaj+ 1; if CheckVersion(3,5,0) then begin Maj := 0; if AcceptLicense(1) then // modifier ou retirer cette ligne revient à accepter la licence :p begin if (GetOption('Mise à jour du Script') = 1) and (PMaj = 1) then begin CheckScriptVersion(); if Maj = 1 then exit; end; if (GetOption('Typederecherche') = 1) and (copy(GetField(fieldURL),1,16)='http://www.dvdfr') then begin AnalyzePage(GetField(fieldURL)); end else begin MovieName := GetField(fieldTranslatedTitle); if MovieName = '' then MovieName := GetField(fieldOriginalTitle); if Input('Importation DVDFR', 'Entrez le titre du film :', MovieName) then AnalyzePage('http://www.dvdfr.com/api/search.php?title=' + UrlEncode(RemoveArticles(MovieName))); end; end; end else ShowError('Ce script requiert une version plus récente de Ant Movie Catalog (au moins la version 3.5)'); end.