Guide utilisateur

ScriptEdit

Principe de base

Les scripts utilisent le langage XojoScript, complété par un ensemble de fonctions permettant de dialoguer avec l’application de recherche sur Internet. 

La recherche sur Internet s’effectue en 4 phases : 

  • Envoi d’une requête de recherche 
  • Analyse de la page de réponse, récupération des titres et des identifiants 
  • Envoi d’une requête de détail 
  • Analyse de la page de réponse, récupération des informations sur le film 

Chaque script est donc constitué de 4 parties qui reprennent les 4 phases. 

L’interface permet donc de renseigner ces éléments, ainsi que d’indiquer des informations complémentaires sur le script (auteur, versions, site concerné, …) 

Le langage XojoScript étant compilé à la volée, l’interface permet de précompiler le script afin de vérifier sa syntaxe. Si le script est correct, il est alors possible de le tester à l’aide d’une fenêtre de recherche similaire à celle de Filmotech. 


Interface de l’éditeur

Fenêtre principale

ScriptEdit fenêtre principale
La fenêtre principale

L’interface est constituée d’une barre d’icône permettant d’accéder aux fonctions de l’éditeur, d’un bandeau de paramétrage sur la gauche, d’une fenêtre de saisie principale sur la droite et d’une barre d’état en bas de la fenêtre. 

Nous allons maintenant voir en détail les différents éléments de cette interface. 

La barre d’icônes

Icône Utilisation 
TesterOuvre la fenêtre de recherche Internet et permet de tester le script. 
PrécompilerCompile les 4 parties du script et signale les erreurs. 
Nouveau scriptCréé un nouveau script. 
OuvrirOuvre un script existant. 
EnregistrerEnregistre le script en cours. 
Enregistrer sousEnregistre le script en cours sous un nouveau nom. 
RechercherRecherche de texte dans le texte en cours d’édition. 
AideAffiche l’aide. 
PréférencesRéglage des préférences de l’éditeur. 
QuitterQuitte l’éditeur de scripts. 

La barre latérale

Informations sur le script

Champ Commentaire 
AuteurAuteur Auteur du script (informatif
DateDate Date de mise à jour du script. L’icône calendrier renseigne la date du jour.
Version du scriptVersion du script Version actuelle du script (Majeur.Mineur.Bug). La mise à jour d’un script doit toujours incrémenter ce compteur. 
Version minimum de Filmotech Indique la version minimale de Filmotech pour utiliser le script. 
LangueLangue de recherche Précise la langue de recherche du script. Dans Filmotech, cette valeur permet d’afficher le script dans la bonne catégorie. 
CommentaireCommentaire Commentaire sur le script (informatif

Informations sur le site

Champ Commentaire 
Nom du siteNom Nom du site. C’est celui qui est affiché dans Filmotech, dans les préférences et dans la fenêtre de recherche. 
URL du siteURLAdresse du site. Depuis Filmotech, on accède au site en cliquant sur l’icône 

Aide à la saisie

Champ Commentaire 
Insérer une fonctionInsérer une fonction Insère la fonction fmt_ sélectionnée à la position courante du curseur dans la fenêtre d’édition. 
Indenter le texteIndenter le texte Permet de ré-indenter le texte, si nécessaire. 
Caractères invisiblesAfficher les caractères invisibles Affiche les caractères invisibles, tels que les retour à la ligne par exemple. 

Zone de saisie

La zone de saisie possède en haut 5 boutons permettant d’afficher les différentes parties du script et le résultat de la compilation. En dessous de ces boutons se situe la zone de saisie de l’éditeur ou de résultat de la compilation.

Champ Commentaire 
Requête des titresRequête des titres Affichage du script de préparation de la requête de recherche des titres. 
Analyse des titresAnalyse des titres Affichage du script d’analyse de la liste des titres. 
Requête du détailRequête du détail Affichage du script d’analyse du détail d’un titre. 
Analyse du détailAnalyse du détail Affichage du script d’analyse de la page de détail du film. 
CompilationCompilation Affichage du résultat de la précompilation. 
EditeurEditeur Zone de saisie de l’éditeur 

Barre d’état

Zone de saisie

Cette barre est affiché en bas de la fenêtre, à gauche et à droite.

Champ Commentaire 
MessageMessage Affichage des messages d’état du fichier. 
CompteursCompteur Positionnés en bas à droite, les compteurs indiquent le numéro de la ligne et de la colonne sur laquelle est positionné le curseur dans la zone de saisie du script. Entre parenthèse est affiché la longueur de la sélection. 

Recherche de texte

Si vous souhaitez recherche du texte dans la partie code de l’éditeur, cliquez sur l’icône Rechercher Rechercher. Vous pouvez préciser si vous souhaitez effectuer une recherche en tenant compte des majuscules et si vous souhaitez que la recherche s’effectue en boucle sur le texte.

Recherche
Recherche

Préférences de l’application

La fenêtre de préférences permet d’indiquer la taille et la police de caractères à utiliser dans la zone d’édition. Elle permet également de définir le nom par défaut pour l’auteur du script, ainsi que de définir un proxy si la connexion au réseau le nécessite.

Préférences
Préférences

Développement d’un script

Echanges entre les scripts et Filmotech

Les échanges entre les scripts et la fenêtre de recherche Internet de Filmotech se font à l’aide d’un ensemble de fonctions. Elles sont toutes préfixés par fmt_ et vous en trouverez la liste détaillés dans le chapitre suivant.

Analyse des pages HTML reçues

Lorsqu’une page HTML est reçue, elle est alors découpée en ligne, chaque balise HTML étant séparée. Ainsi, pour la page suivante :

<html>
  <head>
    <title>Titre de la page</title>
  </head>
  <body>
    <h1>Titre principal</h1>
    <p>Voici un mot <strong>en gras</strong></p>
  </body>
</html>

On va récupérer via le dialogue avec Filmotech :

<html>
<head>
<title>
Titre de la page
</title>
</head>
<body>
<h1>
Titre principal
</h1>
<p>
Voici un mot
<strong>
en gras
</strong>
</p>
</body>
</html>

La fonction fmt_ligne permet de récupérer chacune des lignes de la page reçue. Ainsi découpée, l’analyse de la page sera plus facile.

Lors de l’exécution du script, ScriptEdit affiche une fenêtre contenant le code HTML analysé. Cette fenêtre permet de recherche un texte dans la page, ou un numéro de ligne, afin de faciliter la mise au point du script.

Analyse HTML
Analyse HTML

Enchaînement des actions

Lors de la recherche sur Internet, l’utilisateur saisi les mots-clés. Ceux-ci sont alors récupéré par le premier script “Requête des titres” à l’aide de la fonction fmt_MotsCles. En utilisant ce paramètre, la requête de recherche peut être envoyé sur le site à l’aide de la fonction fmt_RequeteListe. Le site renvoi alors une page de liste, qui est découpée selon le mode décrit ci- dessus. Le script “Analyse des titres” est alors exécuté. En analysant la page reçue, on peut alors récupérer la liste des titres et les identifiants permettant d’accéder au détail d’un film. La fonction fmt_MemoriseTitre sers alors à remplir la liste des films. Il est également possible, si une page suivante est détectée, de relancer une requête de recherche de titre sur la page suivante à l’aide de la fonction fmt_RequetePageSuivanteListe.

Lorsque l’utilisateur clique sur un nom de film dans la liste, l’identifiant est récupéré est le script de “Requête du détail” est lancé. Celui-ci lance alors une seconde requête vers le site à l’aide de la fonction fmt_RequeteDetail. Une fois que le serveur à retourné la page HTML de détail, le script “Analyse du détail” est alors déclenché. Il ne reste plus qu’à analyser le résultat et à remplir les différentes zones à l’aide de la fonction fmt_MemoriseValeur. Lorsque l’adresse de l’affiche est identifié, un appel à la fonction fmt_RequeteImage en lancera le téléchargement.

Nous allons voir dans le chapitre suivant un exemple complet de recherche.

Pré-compiler


Exemple de script

Comme exemple nous allons prendre le cas de la recherche sur le site Filmstarts.

Requête de titre

dim chaine as string
chaine = "http://www.filmstarts.de/suche/1/?q=" + ReplaceAll(fmt_MotsCles," ","+") 
fmt_EncodagePage ("UTF8")
fmt_RequeteListe( "GET", chaine )

Analyse des titres

dim i,j,k,l,m,n as integer
dim strSearch as string
dim strRef, strFilm as String
dim startLink as boolean
 
for i=0 to fmt_NombreLignes  - 1
  strSearch = "href='/kritiken/"
  j = instr( fmt_ValeurLigne( i) , strSearch )
  if j<> 0 then
    k = instr( fmt_ValeurLigne( i+1) , "img src=" )
    l = instr( fmt_ValeurLigne( i+1) , "alt=" )
 
    if k<>0 and l<>0 then
      strRef =  NthField( NthField(  fmt_ValeurLigne( i ), "'" , 2 ), "/",  3)
      strRef = Left(strRef, len( strRef) -5)
      strFilm = ""
      startLink = false
      for m = i+2 to fmt_NombreLignes  - 1
        if not startLink and  instr( fmt_ValeurLigne( m) , "a href=" ) <> 0 then
          startLink = true
        end if
        if startLink and instr( fmt_ValeurLigne( m) , "<" ) = 0 then
          strFilm = strFilm +  fmt_ValeurLigne( m)
        end if
        if startLink and instr( fmt_ValeurLigne( m) , "</a>" ) <> 0 then
          exit
        end if
      next
      fmt_MemoriseTitre ( strRef , strFilm )
    end if
  end if
next

Requête de détail

dim chaine as string
chaine = "http://www.filmstarts.de/kritiken/" + fmt_IdentifiantDetail + ".html"
fmt_RequeteDetail( "GET", chaine )

Analyse du détail

dim chaine, chaine2, chaine3, text as string
dim i, j, k, l, indice, debut_1, fin_1 as integer
dim minRun as double
 
indice = 0
'Title/Year
for i=0 to fmt_NombreLignes - 1
  chaine = "<title>"
  j = instr( fmt_ValeurLigne( i ) , chaine )
  if j<>0 then
    text = left(  fmt_ValeurLigne( i+1 ), len(fmt_ValeurLigne( i+1 )) - 28 )
    text = trim(text)
    fmt_MemoriseValeur( "TitreVF" , text )
    text = mid( fmt_ValeurLigne( i+1 ), len(fmt_ValeurLigne( i+1 ))- 20, 4 )
    text = trim(text)
    fmt_MemoriseValeur( "Annee" , text )
    indice = i
    exit
  end if
next
 
'Cover
text = ""
for i=indice to fmt_NombreLignes - 1
  chaine = "<img src="
  j = instr( fmt_ValeurLigne( i ) , chaine )
  if j<>0 then
    text = NthField( fmt_ValeurLigne( i ) , "'" , 2 )
    fmt_RequeteImage( "GET" , text )
    indice = i
    exit
  end if
next
 
'Duration
text = ""
for i=indice to fmt_NombreLignes - 1
  chaine = "itemprop=""duration"
  j = instr( fmt_ValeurLigne( i ) , chaine )
  if j<>0 then
    text = NthField( fmt_ValeurLigne( i ) , """" , 4 )
    text = Replace(text,"PT","")
    text = Replace(text,"M","")
    minRun = 0
    if instr(text, "H") <> 0 then
      minRun = 60 *  Val( NthField( text, "H" , 1 ))
      minRun = minRun + Val( NthField( text, "H" , 2 ))
    else
      minRun = minRun + Val( text)
    end if
    indice = i
    exit
  end if
next
fmt_MemoriseValeur( "Duree" , Str(minRun ))

Quelques explications sur l’analyse

On s’aperçoit que l’analyse est assez simple. On boucle sur toutes les lignes de la page. On repère une chaîne de caractères indiquant le début de la zone à rechercher, on repère la fin de la zone de recherche, et si on trouve, on détecte les éléments à récupérer, on mémorise et on continue. Ensuite on repart de là où on était arrêté. Les fonctions de traitement de chaîne de caractères de XojoScript permettent de faire cela facilement (même s’il y a probablement des façons plus élégantes d’écrire la chose… )

Par contre il faut faire attention de ne pas faire de boucles infinies, car il n’y a pas de moyens d’interrompre un script en cours d’exécution (sauf à tuer la tâche).


Les fonctions fmt_

fmt_AfficheMessage

Affiche un message dans une fenêtre d’alerte.

Syntaxe

fmt_AfficheMessagemsg )

Variable Type Description 
msg String Le message à afficher 

Exemple 

fmt_AfficheMessage( "Erreur" )

fmt_DebugMsg

Affiche un message dans la fenêtre de Debug lors de l’exécution du script.

Syntaxe

fmt_DebugMsgmsg , niveau )

Variable Type Description 
msg String Le message à afficher 
niveau Integer Le niveau du message (optionnel) 

Les différents niveau

Niveau Icône Commentaire 
(Pas d’icôneMessage simple (par défaut) 
Process OKOK 
Process erreurErreur 
Process InformationInformation 
Process alerteAvertissement 

Exemple 

fmt_DebugMsg "Message d'erreur niveau 0" , 0
fmt_DebugMsg "Message d'erreur niveau 1" , 1
fmt_DebugMsg "Message d'erreur niveau 2" , 2
fmt_DebugMsg "Message d'erreur niveau 3" , 3
fmt_DebugMsg "Message d'erreur niveau 4" , 4

Affichage dans la fenêtre de Debug :

Debug
Debug

fmt_DernierTitre

Retourne le dernier titre entré dans la liste. Peut-être utilisé pour ajouter par exemple une information complémentaire.

Syntaxe

result = fmt_DernierTitre

Variable Type Description 
result String Le dernier titre mémorisé 

Exemple 

dim dernier_titre as String
dernier_titre = fmt_DernierTitre

fmt_EncodagePage

Permet de définir l’encodage de la page HTML renvoyée par le site. Actuellement les paramètres possibles sont ISOLATIN1 et UTF8.

Syntaxe

fmt_EncodagePageencoding )

Variable Type Description 
encoding String Le format d’encodage, ISOLATIN1 ou UTF8

Exemple 

fmt_EncodagePage("UTF8")

fmt_EncodeURL

Encode les composants URL de la chaine passée en paramètre.

Syntaxe

result = fmt_EncodeURLurl_a_encoder )

Variable Type Description 
result String URL encodée 
url_a_encoder String URL à encoder 

Exemple 

Dim url_encodee as string
url_encodee = fmt_EncodeURL("www.Bob&Ray.com") // retourne "www.bob%26ray.com"

fmt_HeaderDetail

Renseigne les champs de l’entête HTTP avant l’envoi de la requête de détail.

Syntaxe

fmt_HeaderDetailchamp , valeur )

Variable Type Description 
champ String Le nom du champ de l’entête HTTP
valeur String La valeur du champ 

Exemple 

fmt_HeaderDetail( "Accept-Language" , "fr" )

fmt_HeaderListe

Renseigne les champs de l’entête HTTP avant l’envoi de la requête de liste.

Syntaxe

fmt_HeaderListechamp , valeur )

Variable Type Description 
champ String Le nom du champ de l’entête HTTP
valeur String La valeur du champ 

Exemple 

fmt_HeaderListe( "Accept-Language" , "fr" )

fmt_IdentifiantDetail

Renvoi l’identifiant du film sélectionné par l’utilisateur dans la liste.

Syntaxe

result = fmt_IdentifiantDetail

Variable Type Description 
result String Valeur de l’identifiant sélectionné 

Exemple 

dim ID as string
ID = "http://www.filmstarts.de/kritiken/" + fmt_IdentifiantDetail + ".html"

fmt_MemoriseDernierTitre

Modifie le dernier titre mémorisé dans la liste. Peut-être utilisé par exemple pour compléter un titre déjà ajouté dans la liste avec la fonction fmt_MemoriseTitre.

Syntaxe

fmt_MemoriseDernierTitrevaleur )

Variable Type Description 
valeur String La valeur du champ 

Exemple 

dim titre as String = trim(fmt_DernierTitre)
fmt_MemoriseDernierTitre ( titre + " " + trim(fmt_ValeurLigne(i+1)))

fmt_MemoriseTitre

Mémorise le titre et son identifiant.

Syntaxe

fmt_MemoriseTitreidentifiant , titre )

Variable Type Description 
identifiant String L’identifiant du film 
titre String le tire du film 

Exemple 

dim identifiant as string
dim titre as string
identifiant = mid( fmt_ValeurLigne(i), j+len(chaine), 6 ) 
titre = (trim(fmt_ValeurLigne(i+1))) + " (" + trim((fmt_ValeurLigne(i+5))) + ")"
fmt_MemoriseTitre( identifiant, titre )

fmt_MemoriseValeur

Mémorise la valer d’un champ de la base.

Syntaxe

fmt_MemoriseValeurchamp , valeur )

Variable Type Description 
champ String Le nom du champ de la base Filmotech 
titre String la valeur du champ 

Liste des champs mémorisables

Champ Commentaire 
TitreVF Le titre en français 
TitreVO Le titre original 
Edition L’édition du DVD ou Blueray 
Pays Le(s) pays séparés par des – ou des / 
Genre Le(s) genre(s) séparés par des – ou des / 
Annee L’année 
Duree La durée (en minutes) 
ActeursLa liste des acteurs séparés par des CHR(13) 
Realisateurs La liste des réalisateurs séparés par des CHR(13) 
Synopsis Le synopsis. Les sauts de lignes sont des CHR(13) 
Bonus Le bonus. Les sauts de lignes sont des CHR(13) 
Langues Les langues séparées par des , 
Sous-Titres Les sous-titres, séparés par des , 
Audio Les pistes audio, séparées par des , 
BandeAnnonce L’URL vers la (les) bande(s)-annonce(s) 
Commentaires Les commentaires. Les sauts de lignes sont des CHR(13) 

Exemple 

dim titre as string = fmt_ValeurLigne(i+1)
fmt_MemoriseValeur( "TitreVF" , titre )

fmt_MotsCles

Retourne la liste des mots-clés saisis par l’utilisateur.

Syntaxe

result = fmt_MotsCles

Variable Type Description 
result String Liste des mots-clés 

Exemple 

dim keywords as string
keywords = "http://www.filmstarts.de/suche/1/?q=" + ReplaceAll(fmt_MotsCles," ","+")

fmt_NombreLignes

Retourne le nombre de ligne de la page HTML analysée.

Syntaxe

result = fmt_NombreLignes

Variable Type Description 
result Integer Nombre de lignes 

Exemple 

dim i as integer
for i=0 to fmt_NombreLignes - 1
  fmt_DebugMsg "Ligne " + str(i)
next

fmt_RequeteDetail

Envoi au site la requête de détail d’un film selon la méthode définie.

Remarque : Actuellement seule la méthode GET est gérée.

Syntaxe

fmt_RequeteDetailmethoderequete )

Variable Type Description 
methode String Méthode de l’appel : GET
requete String URL de la page 

Exemple 

dim url as string
url = "http://www.filmstarts.de/kritiken/" + fmt_IdentifiantDetail + ".html"
fmt_RequeteDetail( "GET", url )

fmt_RequeteImage

Envoi au site la requête de recherche de l’affiche d’un film selon la méthode définie.

Remarque : Actuellement seule la méthode GET est gérée.

Syntaxe

fmt_RequeteImagemethoderequete )

Variable Type Description 
methode String Méthode de l’appel : GET
requete String URL de l’image 

Exemple 

dim url_image as string = fmt_ValeurLigne( i )
fmt_RequeteImage( "GET" , NthField( url_image , """" , 2 ) )

fmt_RequeteListe

Envoi au site la requête de recherche de la liste des films selon la méthode définie.

Remarque : Actuellement seule la méthode GET est gérée.

Syntaxe

fmt_RequeteListemethoderequete )

Variable Type Description 
methode String Méthode de l’appel : GET
requete String URL de la page 

Exemple 

dim url as string
url = "http://www.filmstarts.de/suche/1/?q=" + ReplaceAll(fmt_MotsCles," ","+") 
fmt_EncodagePage ("UTF8")
fmt_RequeteListe( "GET", url )

fmt_RequetePageSuivanteListe

Envoi au site la requête de recherche d’un numéro de page de la liste des films selon la méthode définie. 

Remarque : Actuellement seule la méthode GET est gérée.

Syntaxe

fmt_RequetePageSuivanteListemethoderequetenumero_page )

Variable Type Description 
methode String Méthode de l’appel : GET
requete String URL de la page 
num_page String Numéro de la page 

Exemple 

dim url_page as string
url_page = "http://www.allocine.fr" + NthField(fmt_ValeurLigne( i-1 ),"""",2) 
fmt_RequetePageSuivanteListe( "GET", url_page , url_page(chemin,1) )

fmt_Valeur

Retourne la valeur déjà renseignée de l’élément. Permet par exemple de renseigner les langues au fur et à mesure.

Syntaxe

fmt_Valeurchamp , valeur )

Variable Type Description 
champ String Le nom du champ de la base Filmotech 
valeur String la valeur du champ 

Liste des champs gérés

Champ Commentaire 
Langues Les langues séparées par des , 

Exemple 

dim langues as string
langues = langues + " " + NthField( fmt_Valeur( "Langues" ) , "," , 1 )

fmt_ValeurLigne

Retourne la ligne de la page HTML analysée et découpée, selon la méthode décrite plus haut.

Syntaxe

result = fmt_ValeurLignenumero_ligne )

Variable Type Description 
result String Valeur de la ligne 
numero_ligne Integer Numéro de la ligne 

Exemple 

j = instr( fmt_ValeurLigne( i ) , chaine )

Annexes

Module CustomEditField

La coloration syntaxique de Filmotech ScriptEdit utilise le module CustomEditField.

Ce module est utilisé sous licence MIT.