Association du Grand Avignon des utilisateurs de Linux / *BSD, et de logiciels libres.

Mot-clé - Vala

Fil des billets

jeudi 14 juillet 2016

Voir et revoir les vidéos disponibles sur le site Arte.tv

Ces derniers temps, j'explore les capacités du site arte.tv afin de (re)voir certaines vidéos.

Je peux désormais récupérer la véritable URL d'une vidéo à partir de leur playlist (j'y reviendrais dans un futur billet). Mais cette fois-ci je me suis intéressé au cas, où l'on connaît déjà le lien.

j'ai donc écrit un script avec le langage Vala. Pour utiliser le programme il vous faut installer les bibliothèques suivantes [1] :

  • glib
  • libsoup
  • json-glib

Il faut ensuite le compiler :

valac --pkg=glib-2.0 --pkg=libsoup-2.4 --pkg=json-glib-1.0 artetv.vala

Si tout se passe bien, on peut le lancer de la manière suivante [2] :

./artetv http://www.arte.tv/guide/fr/057398-000-A/quand-l-amerique-sera-latine
http://arte.gl-systemhaus.de/am/tvguide/EUR_DE_FR/057398-000-A_EQ_2_VOF-STF_02421848_MP4-1500_AMM-Tvguide.mp4

Le script par défaut recherche les vidéos dont le conteneur est MP4 (il est tout a fait possible de voir les vidéos en streaming, grâce au protocole RTMP).

Je n'ai pas prévu de fonctionnalité pour télécharger le fichier (ce n'était pas le but premier, je voulais surtout m'intéresser aux données au format JSON). Cependant on peut utiliser un utilitaire prévu pour ça (par exemple avec wget) :

wget `./artetv http://www.arte.tv/guide/fr/057398-000-A/quand-l-amerique-sera-latine`

Ou tout simplement, visualiser directement la vidéo avec la bibliothèque GStreamer.

gst-launch-1.0 playbin uri=`./artetv http://www.arte.tv/guide/fr/048078-000-A/papouasie-expedition-au-coeur-d-un-monde-perdu`

(Cliquez sur l'image pour la voir au format original)

gst-launch-1.0.png

Notes

[1] Ainsi que les paquets de développement, généralement.

[2] Par exemple avec cette URL, http://www.arte.tv/guide/fr/057398-000-A/quand-l-amerique-sera-latine

samedi 16 mai 2015

L'aventure est en marche

Dans un précédent billlet, j'expliquais que j'étais en train de « porter » le bureau (Pantheon Shell) sous FreeBSD, et bien cette après je me suis attaqué à un des plugins du gestionnaire de paramètres (en fixant au passage quelques bugs au niveau de la prise en charge des traductions).

Switchboard About plug

La capture d'écran a été faite sous Xfce (mon bureau) avec les thèmes d'icônes et Gtk, Elementary pour un meilleur rendu.

Stay tuned!

jeudi 14 mai 2015

Est-ce volontaire ou non ?

En ce moment, je travaille sur le portage de l'environnement de bureau Pantheon [1] pour FreeBSD. C'est long, fastidieux, car il faut sans cesse lire le code (voir plusieurs fois) pour vérifier qu'il n'y a pas de « linuxisme », et trouver des parades pour les résoudre (si il y en a).

Récemment je suis tombé sur une portion de code, qui m'a laissé perplexe. Pour simplifier, elle consiste à calculer la taille du disque dur [2].

En isolant cette partie (Cf. annexe, fichier hdd.vala), je fus surpris du résultat (au départ j'ai cru, que sous Linux le résultat serait différent, mais en fait non).

Pour l'éxecuter

valac --pkg=glib-2.0 --pkg=gio-2.0 hdd.vala

./hdd
33.2 GB

Le résultat sera sans doute différent chez vous, en fait, le calcul se fait uniquement pour la racine (/). Il crée un File object juste pour /, grâce à la méthode GLib.File.new_for_path.

Mais dans mon cas, mon disque dur est partitionné, je dois pouvoir retrouver la (quasi) totalité du disque, en faisant la somme de toutes mes partitions.

Mais comment fait-on ?

Ce bout de code s'inspire en fait, de ce que fait GNOME (via le paquet gnome-control-center). En parcourant le fichier panels/info/cc-info-panel.c, on constate, que c'est la fonction g_unix_mount_points_get qui est utilisée [3].

Avec le langage Vala, il faut utiliser la classe UnixMountEntry, et faire une boucle sur l'ensemble des points de montage.

Dans mon exemple (Cf. annexe), je stocke la taille de chacune des partitions dans une liste, et ensuite je fais la somme de toutes les tailles.

valac --pkg=glib-2.0 --pkg=gio-2.0 --pkg=gio-unix-2.0 hdd-02.vala


./hdd-02
266.5 GB

C'est déjà plus cohérent.

Il ne reste plus qu'à envoyer un patch aux développeurs.

Notes

[1] Issue du projet elementary OS.

[2] À partir de la ligne 234 du fichier src/Plug.vala (Switchboard-about-plug).

[3] Elle lit le fichier /etc/fstab ou /etc/mtab.

mercredi 21 janvier 2015

Go For It! sous FreeBSD

Sur le Planet Libre je suis tombé sur un post de la communauté elementary OS fr présentant un nouveau logiciel. Il s'agit d'un utilitaire pour gérer une liste de tâches à faire (to-do list). J'en ai fait un « port » pour l'essayer, et voici le résultat (Cliquez sur l'image pour voir la copie d'écran en taille réelle) :

go-for-it.png

mardi 27 mai 2014

Quel est l'équivalent de prctl () pour les BSD avec le langage Vala ?

J'écris ce billet ici, au lieu du wiki, pour qu'il ait plus de visibiliter.

Parfois dans certains projets écris en Vala on trouve ce bout de code :

[...]

[CCode (cheader_filename = "sys/prctl.h", cname = "prctl")]
extern int prctl (int option, string arg2, ulong arg3, ulong arg4, ulong arg5);

[...]

On dénomme ce fragement par C code attribut (ou CCode attribut). Il s'agit d'une particularité de ce langage, pour utiliser directement des fonctions « externes ».

Sous Linux la fonction prctl () permet de nommer un processus (on peut le voir avec top).

Sous les BSD (DragonFly, FreeBSD, NetBSD et OpenBSD) cette fonction n'existe pas. En fait elle s'appelle autrement, setproctitle ().

Or elle n'est pas présente au même endroit dans chacun des BSD.

Sous DragonFly et FreeBSD, on la retrouve dans unistd.h.

[...]

[CCode (cheader_filename = "unistd.h", cname = "setproctitle")]
extern static void setproctitle (string fmt, ...);

[...]

Sous NetBSD et OpenBSD, on la retrouve dans stdlib.h.

[...]

[CCode (cheader_filename = "stdlib.h", cname = "setproctitle")]
extern static void setproctitle (string fmt, ...);

[...]

Voilà, désormais on peut écrire du code « portable ».

vendredi 9 mai 2014

Déterminer l'origine d'une IP

Je viens de publier sur le wiki, un snippet, afin de déterminer l'origine d'une adresse IP écrit en Vala.

En testant ce programme avec différentes versions de ce langage, j'ai dû mettre en place des tests, qui sont évalués par le compilateur valac. On parle souvent de préprocesseur dans certains langages.

Si on dispose d'une version de Vala >= 0.22, il faut activer la directive VALA_0_22.

Si on dispose d'une version de libsoup >= 2.42, il faut activer la directive LIBSOUP_2_42.

Comment déterminer la version d'une bibliothèque ?

C'est très simple, on utilise l'exécutable pkg-config [1].

pkg-config --modversion libsoup-2.4
2.42.3.1

En fait pkg-config interroge les fichiers .pc, qui se trouve dans le dossier pkgconfig/. Pour savoir où il se trouve dans l'arborescence :

find /usr -type d -name 'pkgconfig' -print

Par exemple, sous Fedora, on le trouve dans les dossier /usr/share et /usr/lib. Sous FreeBSD, il est situé dans /usr/local/libdata.

Pour Vala :

valac --version
Vala 0.20.1

Maintenant nous avons toutes les informations, on peut compiler notre programme.

Compiler

Si Vala < 0.22.x

valac --target-glib=2.32 --pkg=glib-2.0 --pkg=libsoup-2.4 --pkg=json-glib-1.0 geoip.vala

Si Vala >= 0.22.x et libsoup >= 2.42.x

valac --define=VALA_0_22 --define=LIBSOUP_2_42 --pkg=glib-2.0 --pkg=libsoup-2.4 --pkg=json-glib-1.0 geoip.vala

Sous FreeBSD, on peut changer de compilateur, en utilisant par exemple clang.

valac --cc=clang --define=VALA_0_22 --pkg=glib-2.0 --pkg=libsoup-2.4 --pkg=json-glib-1.0 geoip.vala

Dans tout les cas, on obtient le même résultat :

./geoip
fr

Note

[1] Sous FreeBSD, on utilisera plutôt pkgconfig.

vendredi 27 septembre 2013

Contourner le bug #65002 dans Poppler avec Vala

Récemment, je me suis mis à apprendre le langage Vala (je ne connais pas encore toutes les suptilités), et en essayant de comprendre un des exemples, la compilation a échoué.

J'ai trouvé, qu'il avait déjà été mentionné ici.

En parcourant le fichier poppler-glib.deps, on constate qu'il y a une référence à Gtk+2 (en réalité c'est GDK 2).

Donc si on remplace le nom du package gdk-2.0 par gdk-3.0 tout fonctionne correctement.

Pour éviter de modifier un fichier sur le système, le plus simple consiste à le copier [1] (dans le dossier où se trouve notre programme vala).

$ cp /usr/share/vala-0.20/vapi/poppler-glib.* .

On fait le remplacement, et si l'on a besoin de compiler avec le support de Poppler, voici les options qu'il faut passer au compilateur.

$ valac --vapidir=. --pkg poppler-glib ...

Pour conclure, je vous présente un programme,qui va rechercher des informations contenu dans un fichier PDF.

Pour le compiler.

$ valac --vapidir=. --pkg poppler-glib --pkg glib-2.0 --pkg gio-2.0 pdf-info.vala

Si tout se passe bien (ne faites pas attention aux warnings), on le lance de cette manière.

$ ./pdf-info -h
Usage:
  pdf-info [OPTION...] 

Help Options:
  -h, --help         Show help options

Application Options:
  -f, --filename     Path to PDF file

$

Quelques exemples de résultats possibles

$ ./pdf-info -f ~/Documents/packaging-tutorial.fr.pdf
title: Tutoriel : la construction de paquets Debian
Nb pages: 78
pdfTeX-1.40.13
$

$ ./pdf-info -f ~/Téléchargements/accuseReception.pdf 
No title
Nb pages: 2
Apache FOP Version 1.0
$

$ ./pdf-info -f ~/Téléchargements/BSD_08_2013.pdf 
title: BSD Magazine
Nb pages: 48
Adobe PDF Library 9.9
$

Note

[1] La version de vala peut être différente, esayez find /usr/share/ -maxdepth 1 -type d -name 'vala-*' -print