Programmation questions
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
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
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 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
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 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
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.
Soulsnake.
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?
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?
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
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é
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
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é
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...
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...
-
- Posts: 8
- Joined: 2014-03-05 19:47:43
Extract string
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?
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?
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
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...
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...
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 :
Voici un exemple simple détaillé pour récupérer la largeur et la hauteur depuis le champ résolution en utilisant les RegExpr :
Soulsnake.
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.
Pour un cas comme ici, la solution avec mes fonctions est sans doute plus concise :
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
Code: Select all
W := StrToInt(TextBefore(InputStr, 'x', ''), 0);
H := StrToInt(TextAfter(InputStr, 'x'), 0);
-
- Posts: 8
- Joined: 2014-03-05 19:47:43
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?
EDIT: reduction du code au plus élémentaire
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;
Last edited by EricTraveling on 2016-04-10 11:43:21, edited 2 times in total.
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).EricTraveling wrote:D'ailleurs, comparé à du C#, Java ou Python par ex, je ne suis pas fan du code Pascal, mais bon...
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, ',', '.'));
-
- Posts: 8
- Joined: 2014-03-05 19:47:43
Oui je sais bien que c est Hejlsberg qui a crée TurboPascal, Delphi et C#.antp wrote: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).EricTraveling wrote:D'ailleurs, comparé à du C#, Java ou Python par ex, je ne suis pas fan du code Pascal, mais bon...
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, ',', '.'));
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.
-
- Posts: 11
- Joined: 2005-07-07 16:05:44
- Location: Nice
Vider un champs
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 !
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 !
AMC database charset
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?
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?
-
- Posts: 744
- Joined: 2007-04-28 05:46:43
- Location: Italy
Re: AMC database charset
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.