Melodious

Un lecteur audio avec Ocsigen

Source - le Sam 04 février à 02:09:12

Bonjour, bonjour,

Je vais vous présenter ici un projet personnel, Melodious.

Vous pouvez en voir une instance tourner sur http://lakaban.net/melodious. Le code est disponible sur https://github.com/def-lkb/melodious.

Présentation générale

Melodious est un lecteur audio développé en OCaml avec le framework Ocsigen.

Il a été conçu pour répondre avant tout a un besoin partagé avec quelques amis, ensuite pour mettre on œuvre Ocsigen et OCaml dans un projet concret, et enfin pour toucher un peu au « web ». Il a été testé avec succès sur Firefox, Opera et certains webkits, sur plateformes de bureau et plateformes mobiles.

Son utilisation passe par le moteur de recherche. Voici une présentation succincte de sa syntaxe :

  • valeur1 valeur2, liste les éléments satisfaisant valeur1 et valeur2, ex « mozart requiem »
  • clé:valeur, liste les éléments dont le tag « clé » satisfait « valeur », ex « artist:mozart »
  • -mot1 ou -clé:valeur, négation des requêtes ci-dessous
  • clé? effectue un aggrégat sur le tag « clé », en effectuant plusieurs aggrégats on obtient une vue hiérarchique.

Voici quelques exemples pour illustrer des cas intéressants : « genre? artist? album? » ou encore « mozart album? ». Les tags principaux sont : artist, album, title, genre, date.

Les plus perspicaces d'entre vous auront pu noter que l'interface graphique n'a pas reçu énormément d'attention :).

Premières impressions sur Ocsigen

Dans l'ensemble, développer avec Ocsigen est une expérience agréable et enrichissante. Le système de types d'OCaml est efficacement mis à profit pour encadrer le développement.

Les idiomes du web sont très bien intégrés : ils s'ajoutent naturellement aux outils à disposition, sans entraver le reste du code. Évidemment ma comparaison s'appuie au mieux sur du code php daté d'une demi-douzaine d'années… Quoi qu'il en soit, les techniques plus modernes se sont imposées d'elles-mêmes avec Ocsigen.

Au niveau de la méthodologie de développement, faire le tutoriel permet de saisir les concepts clés autour desquels Eliom est bâti. J'ai abordé le framework côté serveur, notamment avec des services simples et en touchant à l'intégration des fonctionnalités web : cookies, paramètres GET et POST, etc.

Ensuite, j'ai dû coder le binding des balises media pour js_of_ocaml. Cette implication m'a forcé à saisir le rôle des différents composants d'Ocsigen, une étape nécessaire pour envisager une application dans son ensemble.

La distinction entre le code / les bibliothèques et la documentation côté serveur et client assimilé, le développement s'est fait sans difficulté.

À l'exécution : Ocsigen est très léger, avec une base SQlite, le service se laisse complètement oublier, même sur un serveur atom. Le code javascript semble imposant (~ 200k ici) et un peu long à générer compte tenu des temps de compilation habituels d'OCaml, mais ce n'est qu'une gêne mineure.

Le futur

Je compte faire évoluer le code de Melodious jusqu'à avoir une solution relativement autonome, un peu plus élégante et agréable à utiliser. Les conseils/remarques/avis sont évidemment les bienvenus. J'aimerai beaucoup privilégier un code concis, expressif, usant des techniques astucieuces et élégantes dont regorge la programmation fonctionnelle.

L'exercice de synthèse n'étant pas facile, si j'ai oublié certains points importants ou soulevé certaines interrogations sur Ocsigen, je vous invite à me le faire remarquer :).

Merci à vous.

4 réponse(s)

Poulet # - le Sam 04 février à 09:46:40 - Répondre - Source
Avatar

Merci beaucoup d'avoir posté ça sur PM. On en a déjà discuté tous les deux, et je n'ai plus grand chose à ajouter. Je vais continuer à regarder le code.

gasche # - le Sam 04 février à 12:04:53 - Répondre - Source
Avatar

Je trouve ça très sympa, en plus ça peut faire un bon exemple de programme Ocsigen si on veut se lancer. Le code se lit bien (ou plutôt "survole bien" dans mon cas) dans l'ensemble; il utilise des fonctionnalités un peu avancées qui pourraient perdre le débutant OCaml, mais c'est déjà inhérent au niveau d'abstraction de OCsigen; par endroits c'est même drôle.

Dans la catégorie "détails", regrette un peu (il fallait le dire) le choix de la plateforme github pour le code drop, quand on a des alternatives libres raisonnables (genre gitorious). J'aime bien la licence AGPLv3. Pourquoi n'as-tu pas publié l'historique du développement (je ne dis pas que c'est mal, c'est juste surprenant) ?

Plus sur l'application, je trouve que la recherche est mal spécifiée. La sémantique de "foo bar", "foo:bar" et "-foo" est claire, ce sont des prédicats sur les morceaux dont on fait l'intersection. La sémantique de "foo?" est compréhensible (la requête renvoie, pour chaque valeur prise par foo, l'ensemble des objets ayant cette valeur), pa" contre la sémantique de "foo? bar?" me semble obscure, et n'est pas compatible avec l'interprétation "espace comme intersection des prédicats".
Par ailleurs, le code qui parse la requête et renvoie le résultat est, il faut bien le dire, très laid (enfin surtout caché au beau milieu de nulle part, etc.). Comme c'est le point clé de ton interface utilisateur, ce serait bien d'avoir quelque chose d'un peu plus central.

Def # - le Sam 04 février à 12:23:49 - Répondre - Source
Avatar

J'apprécie la remarque sur la catégorie détails, après quelques hésitations, j'ai choisi github par « défaut ».

Le développement s'est fait sur une instance de Gitlab, http://labo.lakaban.net, mais au moment de rendre le code public je me suis rabattu sur le site « standard de-facto » (et sur lequel j'avais déjà un compte, sans en abuser). Le principal soucis était de rendre simple l'accès au code, je prend note de gitorious (je ne savais d'ailleurs pas que c'était libre).

La recherche est effectivement mal spécifiée, la syntaxe est apparu par raffinement successif d'idées. Au départ, une liste statique de fichiers, après pouvoir filtrer par tag, enfin cette histoire d'aggrégat puis de « vue hiérarchique ». L'architecture n'a donc pas été pensée autour du cette fonctionnalité, mais s'est développée en parallèle − un nettoyage est à prévoir.

Des résidus de syntaxe trainent a des endroits improbables (tu es tombé sur la belle expression rationnelle, d'un autre côté la soustraction se fait en préfixant les tags de « - » dans le code de la base de données, il y a des morceaux de codes gérant des phrases entre guillemets mais pas entièrement… ahem). Pour le « parsing » des requêtes, j'ai pris le premier outil qui tombait à portée de clavier, je ne sais pas quelle serait la solution la plus adaptée en OCaml.

grds # - le Sam 04 février à 13:31:57 - Répondre - Source
Avatar

En tant qu'utilisateur, et non lecteur du code, j'aime beaucoup et ça marche bien, je me suis habitué au symboles [+], [>>], [>-] en 5 minutes. Tes musiques sont très bien (j'ai juste cherché Haendel et Bach pour l'instant).

Bon courage pour la suite.

Répondre à "Melodious"

Vous devez être connecté pour poster.