Page 1 of 1

Création fichier NFO pour Kodi

Posted: 2023-11-25 12:16:43
by cialis
Bonjour,
est-il possible, pour chaque film, de créer un fichier .nfo utilisable par Kodi ?

Bonne journée...

Hello,
is it possible, for each movie, to create an .nfo file usable by Kodi?

Have a nice day...

Re: [EN+others] NEW SCRIPTS REQUESTS : CLICK HERE TO DO THEM

Posted: 2023-11-29 06:46:48
by antp
Bonjour, techniquement oui. En pratique je ne sais pas si quelqu'un l'a déjà fait sous forme de script.
Par contre en utilisant la fonctionnalité d'export HTML (menu Fichier -> Exporter) c'est peut-être plus simple : on peut définir un modèle de page "individuelle" (1 page / film), il suffirait donc de faire un modèle pour le NFO.

Re: [EN+others] NEW SCRIPTS REQUESTS : CLICK HERE TO DO THEM

Posted: 2023-11-29 13:45:19
by cialis
antp wrote: 2023-11-29 06:46:48 Bonjour, techniquement oui. En pratique je ne sais pas si quelqu'un l'a déjà fait sous forme de script.
Par contre en utilisant la fonctionnalité d'export HTML (menu Fichier -> Exporter) c'est peut-être plus simple : on peut définir un modèle de page "individuelle" (1 page / film), il suffirait donc de faire un modèle pour le NFO.
Je vous remercie pour votre réponse...
Voici un exemple de nfo...comment faire sur AMC ?

<?xml version="1.0" encoding="utf-8"?>
<movie xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id type="imdb">tt0056197</id>
<uniqueid type="imdb" default="true">tt0056197</uniqueid>
<uniqueid type="tmdb" default="false">9289</uniqueid>
<title>Le jour le plus long</title>
<originaltitle>The Longest Day</originaltitle>
<language>fr-FR</language>
<year>1962</year>
<country>United States</country>
<rating>7,7</rating>
<votes>55824</votes>
<ratings>
<rating name="imdb" max="10" default="true">
<value>7.7</value>
<votes>55824</votes>
</rating>
</ratings>
<genre>Guerre</genre>
<director>Ken Annakin</director>
<director>Bernhard Wicki</director>
<director>Andrew Marton</director>
<plot>1944. Les Alliés se préparent pour la grande offensive qu'ils ont prévue en Normandie et qui devrait définitivement débarrasser l'Europe du fléau nazi. Chaque état-major est en effervescence. Le général Eisenhower hésite quant à la date fixée, le 6 juin, en raison du mauvais temps. L'atterrissage des troupes aéroportées et le débarquement sur cinq plages normandes s'annoncent difficiles. Il faut créer des diversions pour semer la confusion chez l'ennemi. Pendant ce temps, la plus grande tranquillité règne dans le camp allemand. Le maréchal Rommel est même reparti en Allemagne. Puis soudain, la radio laisse tomber la seconde partie du vers de Verlaine qui annonce le début de l'opération.</plot>
<runtime>178</runtime>
<dateadded>2016-03-07 11:02:59</dateadded>
<datemodified>2022-08-03 10:51:16</datemodified>
<actor>
<name>John Wayne</name>
<role>Col. Benjamin Vandervoort</role>
<thumb>https://m.media-amazon.com/images/M/MV5 ... jpg</thumb>
</actor>
<actor>
<name>Robert Mitchum</name>
<role>Brig. Gen. Norman Cota</role>
<thumb>http://image.tmdb.org/t/p/original/4Spu ... jpg</thumb>
</actor>
<actor>
<name>Henry Fonda</name>
<role>Brig. Gen. Theodore Roosevelt jr.</role>
<thumb>http://image.tmdb.org/t/p/original/9Dtu ... jpg</thumb>
</actor>
<actor>
<name>Sean Connery</name>
<role>Pvt. Flanagan</role>
<thumb>http://image.tmdb.org/t/p/original/jYCw ... jpg</thumb>
</actor>
<actor>
<name>Richard Burton</name>
<role>Flight Officer David Campbell</role>
<thumb>https://m.media-amazon.com/images/M/MV5 ... jpg</thumb>
</actor>
<fileinfo>
<streamdetails>
<audio>
<bitrate>768</bitrate>
<channels>6</channels>
<codec>dca</codec>
<language>fra</language>
<longlanguage>French</longlanguage>
</audio>
<audio>
<bitrate>1509</bitrate>
<channels>6</channels>
<codec>dca</codec>
<language>eng</language>
<longlanguage>English</longlanguage>
</audio>
<audio>
<bitrate>640</bitrate>
<channels>6</channels>
<codec>ac3</codec>
<language>fra</language>
<longlanguage>French</longlanguage>
</audio>
<audio>
<bitrate>640</bitrate>
<channels>6</channels>
<codec>ac3</codec>
<language>fra</language>
<longlanguage>French</longlanguage>
</audio>
<subtitle>
<language>fra</language>
<longlanguage>French</longlanguage>
<forced>false</forced>
<type>Embedded</type>
</subtitle>
<subtitle>
<language>fra</language>
<longlanguage>French</longlanguage>
<forced>false</forced>
<type>Embedded</type>
</subtitle>
<subtitle>
<language>eng</language>
<longlanguage>English</longlanguage>
<forced>false</forced>
<type>Embedded</type>
</subtitle>
<video>
<aspect>1.778</aspect>
<bitrate>12.0</bitrate>
<codec>h264</codec>
<durationinseconds>10700</durationinseconds>
<height>1080</height>
<scantype>Progressive</scantype>
<width>1920</width>
<filesize>20839490018</filesize>
</video>
</streamdetails>
</fileinfo>
<locked>false</locked>
</movie>

Re: [EN+others] NEW SCRIPTS REQUESTS : CLICK HERE TO DO THEM

Posted: 2023-12-03 15:04:50
by antp
À chaque endroit où il faut une valeur du film il faut utiliser un tag spécial commençant par $$, on peut les insérer via le menu "Insert tag" dans la fenêtre d'export.
Par exemple pour le titre, dans le modèle :
<title>$$LABEL_TRANSLATEDTITLE</title>
<originaltitle>$$LABEL_ORIGINALTITLE</originaltitle>
etc.
Les champs qui n'ont pas d'équivalent pour AMC peuvent être laissés vides ou supprimés.

Re: [EN+others] NEW SCRIPTS REQUESTS : CLICK HERE TO DO THEM

Posted: 2023-12-04 10:13:29
by cialis
antp wrote: 2023-12-03 15:04:50 À chaque endroit où il faut une valeur du film il faut utiliser un tag spécial commençant par $$, on peut les insérer via le menu "Insert tag" dans la fenêtre d'export.
Par exemple pour le titre, dans le modèle :
<title>$$LABEL_TRANSLATEDTITLE</title>
<originaltitle>$$LABEL_ORIGINALTITLE</originaltitle>
etc.
Les champs qui n'ont pas d'équivalent pour AMC peuvent être laissés vides ou supprimés.
Je n'y arrive pas...
Voici comment j'ai fait : Fichier/exporter/html...puis j'ai choisi individuel et j'ai copié mon exemple de nfo en remplaçant les items par les tags spéciaux.
Quand je veux "sauver sous"...AMC plante
Et si jamais j'arrive à sauvegarder il ne me propose que des template html...comment arriver à un fichier.nfo ?
Comment obtenir des thumbnails d'acteurs ?

Re: [EN+others] NEW SCRIPTS REQUESTS : CLICK HERE TO DO THEM

Posted: 2023-12-10 17:28:23
by antp
Il plante ? Avec quoi comme erreur ?
"Sauver sous" c'est pour le modèle lui-même.
Pour créer le NFO (il proposera du html évidemment comme il est prévu pour ça à la base) il faut cliquer le bouton 'Exporter' en bas à droite.

Re: Création fichier NFO pour Kodi

Posted: 2023-12-10 17:33:00
by antp
j'ai séparé cette discussion de l'autre, comme ça n'avait pas tellement de rapport avec l'autre finalement.

Re: Création fichier NFO pour Kodi

Posted: 2023-12-16 17:03:57
by boyerf
Bonjour,

Voici mon script qui permet de générer 1 nfo par film sélectionné.
Attention, il y a un chemin en dur dans le code, donc à modifier. C'est le chemin de ta base, et le préfixe de fichier image, auquel le script va rajouter le no :

Code: Select all

//// ATTENTION A REFAIRE... (chemin en dur !!!)
xSource := dirApp+'Catalogs_NYC\'+'Base_NYC_'+GetField(fieldNumber)+'.jpg';
//// ATTENTION A REFAIRE...
Sinon le code complet :

Code: Select all

(***************************************************

Ant Movie Catalog importation script
www.antp.be/software/moviecatalog/

[Infos]
Authors=Boyerf
Title=Kodi_Maj_Data_nfo
Description=Kodi - Maj des données video des films et génération des affiches et .nfo dans l'arborescence
Site=
Language=FR
Version=2.0
Requires=4.0
Comments=
License=
GetInfo=0
RequiresMovies=1

[Options]

[Parameters]

***************************************************)

program XBMCmajdata;

var
FichierVideo: string;
MovieActors: string;
MovieGenre: string;
SavefileName: string;
DirSelected: string;
FormatedData: string;
OutToFile: TStringList;
xSource, xCible_image, xCible_nfo, xCible_image_old, xCible_FanArt: string;



// ******************************************************
// ******************** FONCTIONS ***********************
// ******************************************************
function ActorsToXml(actors: string): string;
  var
  lstActor: TStringList;
  iActor,iActorTaille,iDebut: Integer;
  sActor,sActorTotal,sRole,testRole:  string;
  begin
    lstActor := TStringList.Create;
    lstActor.Text := StringReplace(actors, ', ', #13#10);
    // Manque balises role et /role
    for iActor := 0 to lstActor.Count - iActor do
      begin
        sRole:='';
        sActorTotal := StringReplace(lstActor.GetString(iActor),'.','');
        iActorTaille := length(sActorTotal);
        testRole := copy(sActorTotal,iActorTaille , 1);
        if (testRole = ')') then
        begin
          // Un role existe
          iDebut := pos('(',sActorTotal);
          sRole:=copy(sActorTotal,idebut,iActorTaille);
          sActorTotal:=copy(sActorTotal,1,idebut - 1);
        End;
        sActor := '   <actor>' + #13#10 + '     <name>' + sActorTotal + '</name>' + #13#10 + '     <role>' + sRole + '</role>' + #13#10 + '   </actor>';
        if lstActor.GetString(iActor) <> #13#10 then lstActor.SetString(iActor, sActor);
      end;
        Result := lstActor.Text;
        lstActor.Free;
end;

// ******************************************************
function GenreToXML(genre: string): string;
  var
      lstGenre: TStringList;
      iGenre: Integer;
      sGenre: string;
      begin
      lstGenre := TStringList.Create;
      lstGenre.Text := StringReplace(genre, ', ', #13#10);
      for iGenre := 0 to lstGenre.Count -iGenre do
        begin
        sGenre :=  '   <genre>' + lstGenre.GetString(iGenre) + '</genre>';
        lstGenre.SetString(iGenre, sGenre);
        end
        Result := lstGenre.Text;
        lstGenre.Free;
end;

// ******************************************************
function ChooseTitle(Original: string; Translated: string): string;
     begin
      if Translated <> '' then Result := Translated else Result := Original
end;

// ******************************************************
// ******************** FIN FONCTIONS *******************
// ******************************************************

// ******************************************************
// MAJ des données vidéo
// ******************************************************
begin
FichierVideo := ansilowercase(GetField(FieldFilePath));
SetCustomField('Chemin', FichierVideo);
If LoadMedia(FichierVideo) then
	begin
	SetField (fieldSize, GetMediaInfoLS(mediaSize));
	SetField (fieldResolution, GetMediaInfo(mediaResolution));
	SetField (fieldFramerate, GetMediaInfo(mediaFramerate));
    SetField (fieldVideoFormat, GetMediaInfo(mediaVideoCodec));
    SetField (fieldVideoBitrate, GetMediaInfo(mediaVideoBitrate));
    SetField (fieldAudioFormat, GetMediaInfo(mediaAudioCodec));
    SetField (fieldAudioBitrate, GetMediaInfo(mediaAudioBitrate));
    SetField (fieldLanguages, GetMediaInfo(mediaLanguages));
    SetField (fieldSubtitles, GetMediaInfo(mediaSubtitles));
	end;
	
// Generation des TBN et NFO

//// ATTENTION A REFAIRE... (chemin en dur !!!)
xSource := dirApp+'Catalogs_NYC\'+'Base_NYC_'+GetField(fieldNumber)+'.jpg';
//// ATTENTION A REFAIRE...

xCible_image := ChangeFileExt(FichierVideo,'-poster.jpg');
xCible_image_old := ChangeFileExt(FichierVideo,'.tbn');
xCible_nfo := ChangeFileExt(FichierVideo,'.nfo');
xCible_FanArt := ChangeFileExt(FichierVideo,'-fanart.jpg');

//ShowMessage(xSource);
//ShowMessage(xCible_image);
//ShowMessage(xCible_nfo);

      OutToFile := TStringList.Create;
//      SaveFileName := IncludeTrailingPathDelimiter(DirSelected) + GetField(fieldOriginalTitle) + '.nfo';
      FormatedData := FormatedData +'<movie>'+#13#10;
      FormatedData := FormatedData +'   <title>'+ ChooseTitle(GetField(fieldOriginalTitle), GetField(fieldTranslatedTitle)) + '</title>'+#13#10;
      FormatedData := FormatedData +'   <originaltitle>'+GetField(fieldOriginalTitle)+'</originaltitle>'+#13#10;
      FormatedData := FormatedData +'   <sorttitle>'+GetField(fieldMedia)+'</sorttitle>' + #13#10;
      FormatedData := FormatedData +'   <set>'+GetField(fieldSource)+'</set>' + #13#10;
      FormatedData := FormatedData +'   <rating>'+GetField(fieldRating)+'</rating>'+#13#10;
      FormatedData := FormatedData +'   <year>'+GetField(fieldYear)+'</year>'+#13#10;
//    FormatedData := FormatedData +'   <top250>'+GetFeild(fieldWhatever)+'</top250>'+#13#10;
//    FormatedData := FormatedData +'   <votes>'+GetField(fieldWhatever)+'</votes>'+#13#10;
//    FormatedData := FormatedData +'   <outline>'+GetField(Whatever)+'</outline>'+#13#10; 
      FormatedData := FormatedData +'   <plot>'+GetField(fieldDescription)+'</plot>'+#13#10;
      FormatedData := FormatedData +'   <tagline></tagline>'+#13#10;
      FormatedData := FormatedData +'   <runtime>'+GetField(fieldLength)+'min</runtime>'+#13#10;
//      FormatedData := FormatedData +'   <thumb>'+GetField(fieldURL)+'</thumb>'+#13#10;
      FormatedData := FormatedData +'   <mpaa></mpaa>'+#13#10;
      FormatedData := FormatedData +'   <playcount>0</playcount>'+#13#10;
//    FormatedData := FormatedData +'   <id>Not available</id>'+#13#10;
      FormatedData := FormatedData +'   <filenameandpath></filenameandpath>'+#13#10;
//      FormatedData := FormatedData +'   <trailer></trailer>'+#13#10;
//      FormatedData := FormatedData +'   <genre></genre>'+#13#10;
//      FormatedData := FormatedData +'   <credits></credits>'+#13#10;
      FormatedData := FormatedData +'   <director>'+GetField(fieldDirector)+'</director>'+#13#10;
      FormatedData := FormatedData +'<fileinfo>'+#13#10;
      FormatedData := FormatedData +'<streamdetails>'+#13#10;
      FormatedData := FormatedData +'</streamdetails>'+#13#10;
      FormatedData := FormatedData +'</fileinfo>'+#13#10;


(* Run Actor Script here*)
      MovieActors := ActorsToXML(GetField(fieldActors));
      MovieGenre  := GenreToXML(GetField(fieldCategory));
      OutToFile.Append(UTF8Encode(FormatedData + MovieGenre + MovieActors + '</movie>'));
      OutToFile.SaveToFile(xCible_nfo);
      OutToFile.Free;
      FormatedData := '';
//      if CopyFile(xSource, xCible_image, True) = True then ShowMessage('Probleme avec : ' + xCible_image);
      DeleteFile(xCible_image_old);
      DeleteFile(xCible_image);
      DeleteFile(xCible_FanArt);
//      CopyFile(xSource, xCible_image, False);
      ExportPicture(xCible_image);
      ExportExtraPicture(0, xCible_FanArt);

end.
Bien a toi,
François