Filmotech ScriptEdit - Guide utilisateur

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

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
Ouvre la fenêtre de recherche Internet et permet de tester le script.
Compile les 4 parties du script et signale les erreurs.
Créé un nouveau script.
Ouvre un script existant.
Enregistre le script en cours.
Enregistre le script en cours sous un nouveau nom.
Recherche de texte dans le texte en cours d’édition.
Affiche l’aide (wiki).
Réglage des préférences de l’éditeur.
Quitte l’éditeur de scripts.

La barre latérale

Informations sur le script

Champ Commentaire
Auteur Auteur du script (informatif)
Date Date de mise à jour du script. L'icône renseigne la date du jour.
Version 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.
Langue de recherche Précise la langue de recherche du script. Dans Filmotech, cette valeur permet d'afficher le script dans la bonne catégorie.
Commentaire Commentaire sur le script (informatif)

Informations sur le site

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

Aide à la saisie

Champ Commentaire
Insérer une fonction Insère la fonction fmt_ sélectionnée à la position courante du curseur dans la fenêtre d'édition.
Indenter le texte Permet de ré-indenter le texte, si nécessaire.
Afficher 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 titres Affichage du script de préparation de la requête de recherche des titres.
Analyse des titres Affichage du script d’analyse de la liste des titres.
Requête du détail Affichage du script d’analyse du détail d'un titre.
Analyse du détail Affichage du script d’analyse de la page de détail du film.
Compilation Affichage du résultat de la précompilation.
Editeur 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
Message Affichage des messages d'état du fichier.
Compteur 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

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.


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.

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_AfficheMessage( msg )

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_DebugMsg( msg , niveau )

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

Les différents niveau

Niveau Icône Commentaire
0 (Pas d'icône) Message simple (par défaut)
1 OK OK
2 Erreur Erreur
3 Information Information
4 Avertissement Avertissement

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

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_EncodagePage( encoding )

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_EncodeURL( url_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_HeaderDetail( champ , 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_HeaderListe( champ , 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_MemoriseDernierTitre( valeur )

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_MemoriseTitre( identifiant , 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_MemoriseValeur( champ , 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)
Acteurs La 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_RequeteDetail( methode, requete )

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_RequeteImage( methode, requete )

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_RequeteListe( methode, requete )

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_RequetePageSuivanteListe( methode, requete, numero_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_Valeur( champ , 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_ValeurLigne( numero_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.