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

Mot-clé - GLib

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 12 septembre 2015

Un logiciel au code source ouvert c'est bien

Certains d'entre vous le savent peut-être, mais je suis un utilisateur heureux du bureau Xfce [1], je suis avec attention tout ce qui touche de près ou de loin à ce projet. Or des développeurs de la distribution Xubuntu ont développé un petit logiciel [2] permettant de sauvegarder la disposition du (ou des) panel(s). Il repose sur Gtk3 (grâce à la couche GObject Introspection) et Python3.

Avec la dernière version (1.0.1), des pré-réglages [3] sont déjà disponibles (je me tâte à les laisser dans le paquet pour FreeBSD), seulement quand on en sélectionne un, et par mégarde on clique sur le bouton de suppression on obtient ceci :

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

xfpanel-switch-error.png

Je trouve que ce n'est pas élégant. J'ai donc proposé un patch qui vérifie si l'utilisateur est le propriétaire de l'archive. Si ce n'est pas le cas, une boîte de dialogue apparaît.

xfpanel-switch-rewrite-error.png

C'est mieux non ?

Notes

[1] Sous FreeBSD bien évidemment.

[2] Xfpanel-switch

[3] Pour Xubuntu et Debian

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.

samedi 31 janvier 2015

Jouons un peu avec la bibliothèque garcon (Xfce)

En ce moment, je découvre la bibliothèque garcon [1] du projet Xfce.

Comme je débute, le premier programme est relativement simple. Il affiche les applications présentes dans le menu. Il va analyser le fichier xfce-applications.menu présent dans $XDG_MENU_PREFIX pour rechercher les fichiers .desktop. Le résultat peut être différent en fonction des logiciels installés sur votre système.

Pour pouvoir l'utiliser il vous faut les fichiers d'en-tête pour GLib et bien évidemment garcon.

La ligne de commande que j'utilise sous FreeBSD (j'utilise encore gcc comme compilateur).

$ gcc -Wall xfce-menu.c -o xfce-menu `pkgconf --cflags --libs glib-2.0 garcon-1` -lc
$ ./xfce-menu

 * xfce4-run.desktop
----
 * exo-terminal-emulator.desktop
 * exo-file-manager.desktop
 * exo-mail-reader.desktop
 * exo-web-browser.desktop
----
Settings
 * xfce-settings-manager.desktop
----
 * xfce4-accessibility-settings.desktop
[...]
System
 * Thunar-bulk-rename.desktop
 * xfce4-taskmanager.desktop
 * Thunar.desktop
 * xterm.desktop
 * xfce4-terminal.desktop
----
 * xfce4-about.desktop
 * xfce4-session-logout.desktop

Si l'on souhaite utiliser la fonction xfce_menu_items2 () la sortie est différente, les fichiers .desktop sont suivis des catégories.

$ ./xfce-menu

xfce4-run.desktop X-Xfce-Toplevel;X-XFCE;Utility;
exo-terminal-emulator.desktop X-Xfce-Toplevel;X-XFCE;Utility;
exo-file-manager.desktop X-Xfce-Toplevel;X-XFCE;Utility;
exo-mail-reader.desktop X-Xfce-Toplevel;X-XFCE;Network;
exo-web-browser.desktop X-Xfce-Toplevel;X-XFCE;Network;
xfce-settings-manager.desktop DesktopSettings;Settings;X-XFCE;
xfce4-accessibility-settings.desktop X-XFCE-SystemSettings;X-XFCE-SettingsDialog;DesktopSettings;Settings;GTK;XFCE;
xfce-ui-settings.desktop X-XFCE-PersonalSettings;X-XFCE-SettingsDialog;DesktopSettings;Settings;GTK;XFCE;
[...]
Thunar.desktop FileManager;FileTools;GTK;Core;Utility;System;
xterm.desktop TerminalEmulator;System;
xfce4-terminal.desktop TerminalEmulator;System;GTK;
xfce4-about.desktop X-Xfce-Toplevel;X-XFCE;Utility;
xfce4-session-logout.desktop X-Xfce-Toplevel;X-XFCE;System;

Maintenant, il nous reste plus qu'à utiliser un GtkTreeView widget pour afficher le tout dans une fenêtre.

Note

[1] C'est un portage des spécifications définit par le consortium Freedesktop.org pour définir l'agencement d'un menu.

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 3 janvier 2014

Déterminer le nom du pays à partir de la locale du système

En ce moment je travaille sur le portage d'une application pour FreeBSD. Comme elle fait appel à des fonctions qui ne sont pas disponibles sous ce système, je passe par l'analyse des fichiers iso-codes [1] mis à notre disposition par Debian.

Il s'agit de mon premier programme en C, donc soyez indulgent.

J'utilise les bibliothèques suivantes :

Pour le compiler, il faut définir une variable (par exemple ISO_CODES_PREFIX), qui va nous servir de macro [2].

ISO_CODES_PREFIX=`pkgconf --variable=prefix iso-codes`
gcc -Wall -DISO_CODES_PREFIX=\"$ISO_CODES_PREFIX\" `pkgconf --cflags --libs glib-2.0 gio-2.0 libxml-2.0` locales.c -o locales

Note : Si pkgconf n'est pas disponible, essayez pkg-config.

Après compilation, on obtient une liste avec la locale suivi du nom du pays. Cela me sert pour renforcer les tests pour mon patch.

[...]
eu_ES.ISO8859-1 Spain
eu_ES.ISO8859-15 Spain
eu_ES.UTF-8 Spain
fi_FI.ISO8859-1 Finland
fi_FI.ISO8859-15 Finland
fi_FI.UTF-8 Finland
fr_BE.ISO8859-1 Belgium
fr_BE.ISO8859-15 Belgium
fr_BE.UTF-8 Belgium
fr_CA.ISO8859-1 Canada
fr_CA.ISO8859-15 Canada
fr_CA.UTF-8 Canada
fr_CH.ISO8859-1 Switzerland
fr_CH.ISO8859-15 Switzerland
fr_CH.UTF-8 Switzerland
fr_FR.ISO8859-1 France
fr_FR.ISO8859-15 France
fr_FR.UTF-8 France
he_IL.UTF-8 Israel
hi_IN.ISCII-DEV India
[...]

Notes

[1] Certains logiciels du projet GNOME utilisent le même procédé.

[2] Reportez-vous à cette page du wiki pour plus de détail.