Programmation questions

If you made a script you can offer it to the others here, or ask help to improve it. You can also report here bugs & problems with existing scripts.
VERSEAU44
Posts: 45
Joined: 2015-08-01 17:35:25

Post by VERSEAU44 »

Bonjour,

Comme beaucoup, appréciant l'énorme travail réalisé par Antoine puis Mickaël et les "majors" des scripts (soulsnake, ScorEpioN, Raoul, etc.), je me lance à mon tour.

Après qques jours à m'y frotter, j'ai plusieurs questions :

1°/ comment lancer un script à partir d'un autre script ? La procedure Launch ne semble pas le permettre ...

2°/ Via 1 script, on peut lire/modifier ses options et paramètres, vérifier si ses champs modifiables sont cochés ou non (CanSetField/CanSetExtraField). Est-il possible, toujours via un script, de cocher/décocher ces champs modifiables pour permettre, par exemple, de contrôler plusieurs lancement de scripts (Cf. question 1°/) ?

3°/ Les commandes ANT sont-elles scriptables ou exécutables par ligne de commande batch ? L'objectif serait de lancer un import ou un export sans devoir cocher/décocher manuellement les mêmes paramètres ...

4°/ Quelle est la syntaxe pour lancer une recherche IMdB avec en paramètre d'entrée le titre du film ET le réalisateur ? A défaut, je me plongerai dans BatchCommon7552.pas mais pour un débutant comme moi, il n'est pas simple ...

5°/ J'ai voulu récupérer le code ANSI de chaque caractère d'un champ : la fonction "ord" ne semble pas reconnue et, comme plusieurs autres, je ne trouve pas de doc sur les fonctions disponibles dans le moteur de script.
Plus globalement, existe-t-il une synthèse de TOUTES les fonctions/procédures de la version 2 d'Innerfuse Pascal Script utilisables par ANT ? Je m'explique : celles listées en aide F1, section scripts sont-elles exhaustives ? Je doute en lisant Antoine qui indique en bas du POST viewtopic.php?p=19570, "les scripts sont [...] en "Innerfuse Pascal Script" (Pascal/Delphi simplifié : seulement quelques fonctions sont disponibles, et des tas d'éléments du langage manquent)."
En téléchargeant le code source AMC, j'ai trouvé quelques infos complémentaires dans le répertoire \help\French mais pas de liste des fonctions/procédures (hormis celle affichée via F1)
Par exemple, le fichier ifps\readme.txt indique : "Documentation can be found in a seperate archive on my website." [http://carlo-kok.com]. Mais après plusieurs recherches ... rien.

MERCI pour votre aide
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

1. pas possible a priori

2. non

3. je ne pense pas, mais avec des outils externes on peut peut-être y arriver (AutoIt peut-être, comme mentionné sur l'autre thread)

4. je ne comprends pas la question :D Si la question porte sur l'URL à utiliser pour la requête, je ne suis pas sûr que le site le prévoie

5. il me semble que c'est faisable mais je ne sais plus comment ; si soulsnake passe par là il aura peut-être une idée
Pour la liste des fonctions dispo, je n'en sais trop rien, je ne sais pas s'il y a une liste quelque part
soulsnake
Posts: 756
Joined: 2011-03-14 15:42:20
Location: France

Post by soulsnake »

5. Si tu as téléchargé le code source, tu trouveras la doc de Innerfuse Pascal Script dans le dossier ifps/doc/index.html où les fonctions de base implémentées sont listées. Les fonctions avancées sont toutes décrites dans l'aide d'AMC. Les fonctions Ord(C : Char) : Byte et Chr(B : Byte) : Char existent belles et biens.

Soulsnake.
mosk79
Posts: 9
Joined: 2014-08-12 22:53:50

Post by mosk79 »

I need help to modify IAFD script.
Now actress and actors are all mixed up, in alphabetical order (before you had actresses in one table, actors in another)

I need a code, that search for an specific condition (gender=f) between an html table (where actors names are)

So, the code must do this:

search inside <actors_table>
the actress name begin with (html_code), and end with (html_code)
do while gender=f is in the html code.

The result has to be all actresses names separated by ,

Someone know how to do that?
VERSEAU44
Posts: 45
Joined: 2015-08-01 17:35:25

Post by VERSEAU44 »

Rajout d'une question (retour sur les 5 premières à la suite) :
6/ Peut-on afficher une fenêtre SANS boutons, ne suspendant pas l'execution du script ? Quand j'ai plusieurs lourds fichiers à copier, j'aimerai savoir où j'en suis dans la progression de cette copie (sans devoir acquitter un "OK" à l'affichage d'un ShowMessage après chacun d'eux) ...

1/ Dommage de ne pouvoir enchainer l'exe de plusieurs scripts :( Voici la réponse de Carlo KOK (développeur d'Innerfuse Pascal Script V2) : "ifps2 has nothing built in to do that. It would be up to to the host to provide that functionality".

2/ Je croyais que C:\ProgramData\Ant Movie Catalog\script.ini conservait justement les champs modifiables cochés ou non (ce qui aurait permit de les modifier par script) mais il ne semble pas. Pourtant, leur état est bien conservé d'un script à l'autre (SAUF pour les champs CUSTOM) ...

3/ Oui, AutoIt devrait pouvoir le faire ...

4/ Oui, c'est bien de l'URL à passer en requête dont je parlais :grinking:

5/ Effectivement, dans ifspas.html, il est fait référence à la fonction ord() (non documentée mais, bon, on peut trouver ailleurs). Désolé :/
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

6. Y a peut-être moyen de construire une Form via les éléments intégrés de base dans IFPS2 mais je ne me suis jamais penché là dessus

2. C'est en effet stocké là (clé = Fields.Excluded) ; c'est vrai qu'un script pourrait aller attaquer ce fichier mais ce n'est pas très propre et de toute façon de mémoire le fichier n'est lu qu'à l'ouverture de la fenêtre des scripts et écrit à la fermeture, du coup les modifs faites entre les deux (le seul moment où le script peut le faire) seraient perdues.
Et puis l'intérêt de ces options est justement de contrôler le script plutôt que d'être contrôlées par le script...
EricTraveling
Posts: 8
Joined: 2014-03-05 19:47:43

Extract string

Post by EricTraveling »

Cela fait bien longtemps que je n ai plus touché du pascal (genre TB7 il y a 15-20 ans), je suis tout rouillé pour les trucs de base.

Je cherche à calculer le "compression ratio" ou "Bits/(Pixel*Frame)" et l'enregistrer dans un champ supplémentaire sous AMC 4.2
ratio = bitrate in bytes / (width * height * framerate).

Parfois, ce ratio est directement dispo sous MediaInfo, mais pas toujours.

On peut récupérer directement le bitrate et le framerate dans AMC. Mais le width * height doivent être extrait du champ resolution il me semble.

Quelle est la façon la plus propre ds AMC pour extraire ces valeurs ?
Ds bcp d autres langages, on a une fonction split ou explode à dispo.
Est ce que AMC supporte le Delphi RTL, qui contient SplitString ds System.StrUtils ?
Sinon, avec une fonction définie ds les StringUtils de AMC peut etre?
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

Il y a un support pour les regex qui a été rajouté par soulsnake mais je n'ai jamais compris comment l'utiliser dans les scripts d'AMC :D
Dans StringUtils1.pas il y a quelques fonctions que j'utilise souvent dans les scripts qui permettent de manipuler des chaînes en récupérant des morceaux avant/après des éléments fixes, si ça peut aider...
soulsnake
Posts: 756
Joined: 2011-03-14 15:42:20
Location: France

Post by soulsnake »

L'utilisation des RegExpr dans les scripts peut paraître un peu compliqué la première fois mais une fois compris c'est très simple à utiliser et surtout très puissant.
Il y a effectivement beaucoup de fonctions de disponibles, ce qui peut sembler compliqué, mais c'est pour fournir toute la puissance des RegExpr.
Toutes les fonctions sont détaillées dans l'aide d'AMC mais la plupart du temps, les fonctions suivantes suffisent :

Code: Select all

function RegExprSet(ExprStr: string): Boolean;

function RegExprExec(InputStr: string): Boolean;

function RegExprMatch(SubExprIdx: Integer): string;
ou
function RegExprSubstitute(TemplateStr: string): string;

Voici un exemple simple détaillé pour récupérer la largeur et la hauteur depuis le champ résolution en utilisant les RegExpr :

Code: Select all

program ParseResolutionFieldUsingRegExpr;
var
  ExprStr : string;
  InputStr : string;
  W, H : Integer;
begin
  // Init variables
  ExprStr := '([0-9]+)x([0-9]+)'; // e.g. 640x352
  InputStr := GetField(fieldResolution);
  W := 0;
  H := 0;
  
  // Set RegExpr
  RegExprSet(ExprStr);
  
  // Exec RegExpr on InputStr
  if RegExprExec(InputStr) then
  begin
    // Get SubExpr 1 with RegExprMatch
    W := StrToInt(RegExprMatch(1), 0);
    // or use RegExprSubstitute
    // W := StrToInt(RegExprSubstitute('$1'), 0);
    
    // Get SubExpr 2 with RegExprMatch
    H := StrToInt(RegExprMatch(2), 0);
    // or use RegExprSubstitute
    // H := StrToInt(RegExprSubstitute('$2'), 0);
  end;
  
  ShowMessage(IntToStr(W) + ' ' + IntToStr(H));
end.

Soulsnake.
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

Pour un cas comme ici, la solution avec mes fonctions est sans doute plus concise :

Code: Select all

W := StrToInt(TextBefore(InputStr, 'x', ''), 0);
H := StrToInt(TextAfter(InputStr, 'x'), 0);
Mais en effet les regex c'est très puissant, je ne sais pas ce que j'avais mal fait quand j'avais tenté de les utiliser, j'essaierai de retrouver cet exemple-ci la prochaine fois que j'en ai besoin :)
EricTraveling
Posts: 8
Joined: 2014-03-05 19:47:43

Post by EricTraveling »

Merci. Regex pour un truc si simple, c est un peu le rouleau compresseur pour écraser une mouche... J en reste aux fonctions d'Antoine, même si je ne trouve pas cela très élégant. D'ailleurs, comparé à du C#, Java ou Python par ex, je ne suis pas fan du code Pascal, mais bon...

Mon script fonctionne presque.
Mais j ai un soucis avec la fonction StrToFloat. Par défaut, elle ne fonctionne sur mon système (Windows 10 US, locale FR) qu'avec un point comme séparateur décimal et plante avec une virgule alors que la virgule est utilisée ds mes valeurs (framerate 23,976)
Du coup, j essaie de spécifier cela ds un TFormatSettings mais e type ne semble pas être reconnu par AMC (erreur à la ligne 8).
D ailleurs, la fonction GetLocaleFormatSettings ne semble exister qu'à partir de Delphi7.
Une idée?

Code: Select all

function StrToFloat2(const Value: String): real;
var
  myFormatSettings: TFormatSettings;
begin
  GetLocaleFormatSettings(GetThreadLocale, myFormatSettings);
  myFormatSettings.DecimalSeparator := ',';
  Result := StrToFloat(Value, myFormatSettings);
end;
  
//------------------------------------------------------------------------------
// CALCUL CompressionRatio
//------------------------------------------------------------------------------
procedure compressionRatio();
var
  ratio, framerate : real;
  width, height, bitrate, selectedField : Integer;
  res, frameStr : String;
begin
	res := GetField(fieldResolution);
	width := StrToInt(TextBefore(res, 'x', ''), 0);
	height := StrToInt(TextAfter(res, 'x'), 0);		
	bitrate := StrToInt(GetField(fieldVideoBitrate), 0);	
	frameStr := GetField(fieldFramerate);
	framerate := StrToFloat2(frameStr);
	
end;
EDIT: reduction du code au plus élémentaire
Last edited by EricTraveling on 2016-04-10 11:43:21, edited 2 times in total.
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

EricTraveling wrote:D'ailleurs, comparé à du C#, Java ou Python par ex, je ne suis pas fan du code Pascal, mais bon...
C# est pourtant fort proche de Delphi pour pas mal de choses, ça a été conçu en partie par un ancien de Delphi (et en tant qu'ex-programmeur Delphi reconverti au C#, ça a facilité le passage de l'un à l'autre).
Bon ça reste avec une syntaxe plus proche du C++ alors qu'en Pascal avec les begin/end on a une syntaxe qui paraît plus lourde.

Ici on est dans un moteur de scripts très basique, inspiré de Pascal/Delphi, donc pas mal de trucs n'existent pas ou ont dû être adaptés.
Pour le problème des nombres flottants, un coup de StringReplace sera plus simple...

Result := StrToFloat(StringReplace(Value, ',', '.'));
EricTraveling
Posts: 8
Joined: 2014-03-05 19:47:43

Post by EricTraveling »

antp wrote:
EricTraveling wrote:D'ailleurs, comparé à du C#, Java ou Python par ex, je ne suis pas fan du code Pascal, mais bon...
C# est pourtant fort proche de Delphi pour pas mal de choses, ça a été conçu en partie par un ancien de Delphi (et en tant qu'ex-programmeur Delphi reconverti au C#, ça a facilité le passage de l'un à l'autre).
Bon ça reste avec une syntaxe plus proche du C++ alors qu'en Pascal avec les begin/end on a une syntaxe qui paraît plus lourde.

Ici on est dans un moteur de scripts très basique, inspiré de Pascal/Delphi, donc pas mal de trucs n'existent pas ou ont dû être adaptés.
Pour le problème des nombres flottants, un coup de StringReplace sera plus simple...

Result := StrToFloat(StringReplace(Value, ',', '.'));
Oui je sais bien que c est Hejlsberg qui a crée TurboPascal, Delphi et C#.
C est justement les begin/end que je trouve trop lourd.
Tient d ailleurs, en moteur de script équivalent à celui d'AMC, j avais utilisé en dotNet le language 'boo' il y a 8 ans, plus proche du python
( https://en.wikipedia.org/wiki/Boo_%28pr ... anguage%29 )
Il doit y avoir plein de solutions plus modernes maintenant...

Bon, tu as raison, un simple stringReplace suffit très bien ici.

Du coup, mon script complet et fonctionnel:

Code: Select all

program CompressionRatio;
uses  
  StringUtils1, FieldsUtils;

procedure compressionRatio();
var
  ratio, framerate : real;
  width, height, bitrate, selectedField : Integer;
  res : String;
begin
	res := GetField(fieldResolution);
	width := StrToInt(TextBefore(res, 'x', ''), 0);
	height := StrToInt(TextAfter(res, 'x'), 0);		
	bitrate := StrToInt(GetField(fieldVideoBitrate), 0);	
	framerate := StrToFloat(StringReplace(GetField(fieldFramerate), ',', '.'));	
	
	if (width > 0) and (height > 0) and (bitrate > 100) and (framerate > 10) then
    begin
		ratio := (bitrate * 1000) / (width * height * framerate);
		selectedField := GetFieldOrCustomFieldIdx('CompressionRatio');
		if (CanSetFieldOrCustomField(selectedField)) then
  		SetFieldOrCustomField(selectedField, FloatToStr(ratio))
    end;
end;

begin  
  compressionRatio();
end.
Cela tient plutôt de la curiosité. Sur ma collection de film, en appliquant le calcul sur tous, j obtient quasi une gaussienne centrée sur 0,21. Cela correspond à l indice recommandé pour les DVD Rip en Xvid, qui forment encore les 3/4 de la collection qui date des années 2002-2005 ...
jeanfran59
Posts: 11
Joined: 2005-07-07 16:05:44
Location: Nice

Post by jeanfran59 »

Bonjour,

j'ai des questions simples (enfin pas pour moi).
Quel est le nom de champs d'un extra ? est ce que c'est juste le nom donné ou il y a un nom devant ?
Comment attribuer une valeur a un extra ? Est ce qu'on utilise SetExtraField ?

Merci.
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

Bonjour,
C'est soulsnake qui avait rajouté tout ça donc je ne sais pas exactement comment ça marche, mais tu as regardé la liste des fonctions dans le fichier d'aide ? Ça peut déjà donner une piste.
VERSEAU44
Posts: 45
Joined: 2015-08-01 17:35:25

Vider un champs

Post by VERSEAU44 »

Bonjour le forum,

Je n'arrive pas à mettre à blanc le champ fieldMediaType (le vider), ni avec la fonction SetField(fieldMediaType, ''), ni avec le script "Update Fields" de ScorEpioN, Dedej, SoulSnake ...

Pourtant, le champ est bien modifiable !

Pour l'instant, je fais un SetField(fieldMediaType, ' '), avec un espace : mais ce n'est pas satisfaisant ...

MERCI pour votre aide !
antp
Site Admin
Posts: 9629
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

Bonjour,
En haut à droite de la fenêtre de scripts il y a une option "Permettre de vider les champs" ; il me semble que par défaut elle est désactivée, pour le cas où on combine plusieurs scripts ne trouvant pas tous toutes les infos.
VERSEAU44
Posts: 45
Joined: 2015-08-01 17:35:25

Post by VERSEAU44 »

SUPER Antoine : c'est bien LA solution
J'avais complètement zappé cette option ;o)
MERCI encore et bonne journée ...
mrobama
Posts: 85
Joined: 2009-04-03 12:34:34

AMC database charset

Post by mrobama »

Hi,

which charset is used by Ant Movie Catalog? If I try to use T-Comma in the title field ( https://en.wikipedia.org/wiki/T-comma ) I see it but when I save and reopen my amc file I only see "?" char. T-Comma is a valid UTF-8 char, so I think AMC does not support UTF-8 but another charset: which one? By the way, I known there is "RemoveBadChars" to fix bad characters but I would like to know which is the right charset used.

Thank you

UPDATE: maybe Windows-1252 / CP1252 ... can anyone confirm this?
fulvio53s03
Posts: 744
Joined: 2007-04-28 05:46:43
Location: Italy

Re: AMC database charset

Post by fulvio53s03 »

mrobama wrote: 2020-07-07 13:59:51 UPDATE: maybe Windows-1252 / CP1252 ... can anyone confirm this?
credo proprio di si!
In uno script che avevo realizzato per rinominare i files (partendo da titolo-rigista-anno i caratteri accentati ed altri rimanevano mal tradotti.
Su suggerimento di Ant avevo aggiunto chcp 1252 in testa al file .bat prodotto.
:)
Post Reply