Author Topic: conky : affichage de la pochette  (Read 8770 times)

Astier

  • Newbie
  • *
  • Posts: 11
    • View Profile
    • My Own Memory Hole
conky : affichage de la pochette
« on: March 17, 2010, 16:48:18 »
Salut Quentin,

Je suis revenu à conky et ai mis un peu de temps à saisir le fonctionnement de certains scripts proposés sur le lien donné dans la doc (http://ubuntuforums.org/showthread.php?t=947335)
J'utilise dans un premier temps les informations renvoyées par le plugin nowplaying renseigné ainsi :
Code: [Select]
tee ~/.config/gmusicbrowser/nowplaying.infopour afficher dans conky les infos suivantes : titre, artiste, album ainsi
Code: [Select]
${execi 1 cat /home/bbrice/.config/gmusicbrowser/nowplaying.info | grep "Title" | cut -d"=" -f2}
${execi 1 cat /home/bbrice/.config/gmusicbrowser/nowplaying.info | grep "Artist" | cut -d"=" -f2}
${execi 1 cat /home/bbrice/.config/gmusicbrowser/nowplaying.info | grep "Album" | cut -d"=" -f2}

Pour la barre de progression, j'utilise l'un des scripts proposés par loomsen (nommé gmusicforconky.sh) :
Code: [Select]
#!/bin/bash
# gmusicbrowser script by loomsen
# if you want to contact me: loomsen<at>googlemail.com
#
## requires this script to access dbus and get std output:
# http://squentin.free.fr/gmusicbrowser/dokuwiki/doku.php?id=dbus_api
###
## Put path to your tempfile holding the song info here
songinfo=~/.config/gmusicbrowser/nowplaying
## ------- insert path to perl script here
DBUSINFO=~/Scripts/gmusic-dbus.pl
## -------
INFO=`perl $DBUSINFO > $songinfo`
time_tot=`awk /length/ $songinfo | awk '{print $3}'`
elapsed=`dbus-send --print-reply --dest=org.gmusicbrowser /org/gmusicbrowser org.gmusicbrowser.GetPosition | grep "double" | awk '{print $2}' | cut -d '.' -f1`
function tmp_cur
{
MINS=`expr $elapsed / 60`
REST=`expr $elapsed % 60`
SECS=`expr $REST % 60`
printf "%02d:%02d" "$MINS" "$SECS"
}

function tmp_tot
{
MINS=`expr $time_tot / 60`
REST=`expr $time_tot % 60`
SECS=`expr $REST % 60`
printf "%02d:%02d" "$MINS" "$SECS"
}

function progress
{
expr $elapsed \* 100 / $time_tot
}

## here it starts, you may either
case "$1" in
cur_pos ) tmp_cur
;;
length ) tmp_tot
;;
progress ) progress
;;
  *)
if [ "$1" != "" ];then
for i in "[email protected]";do
# ----------------- FIXME: uncomment if you prefer RAW values (without tags)
#######                                      ?
awk /"$i"/ $songinfo    | cut -d ':' -f2
# -----------------
done
else
# ------------------ FIXME: uncomment if you prefer RAW values (without tags)
#######                            ?
awk /""/ $songinfo  | cut -d ':' -f2
# ------------------
fi
;;
esac

exit 0
Puis dans conky :
Code: [Select]
${color 445F70}${execbar /home/bbrice/Scripts/gmusicforconky.sh progress}
${font}${voffset -18}$color${exec /home/bbrice/Scripts/gmusicforconky.sh cur_pos}$alignr${exec /home/bbrice/Scripts/gmusicforconky.sh length}

Depuis la version 1.7, il est possible d'afficher des images nativement.

Je souhaite donc récupérer l'image dont le chemin peut être renvoyé soit grâce au script de loomsen :
Code: [Select]
12:42:17 [email protected]:~/Scripts $ ./gmusicforconky.sh album_picture
 /Multimedia/Musique/Les Têtes Raides/Tetes Raides - Gratte Poil/cover.jpeg
ou même avec
Code: [Select]
$ dbus-send --print-reply --dest=org.gmusicbrowser /org/gmusicbrowser org.gmusicbrowser.CurrentSong|grep album_picture -A1|tail -1
mais là cela nécessite un petit traitement supplémentaire.

J'ai essayé d'écrire un petit script bash me permettant de copier cette image vers un répertoire afin de la renommer simplement (genre cover) mais je coince du fait d'espaces dans les chemins et malgré mes recherches je coince totalement.

Aurais-tu une idée afin de me sortir de cette impasse ?

Merci, à+

Astier

  • Newbie
  • *
  • Posts: 11
    • View Profile
    • My Own Memory Hole
Re : conky : affichage de la pochette
« Reply #1 on: March 17, 2010, 18:11:48 »
Je viens de me rendre compte que l'utilisation du plugin nowplaying pouvait poser un problème pour afficher des caractères spéciaux ; ainsi :
Code: [Select]
$ cat .config/gmusicbrowser/nowplaying.info
Title=Ginette
Artist=Les T?tes Raides
Album=1999 - Black Session
Length=4:52
Year=1999
Track=13
ce qui coince pour l'affichage dans conky.

J'ai donc modifié le .conkyrc pour utiliser le script de loomsen de cette façon :
Code: [Select]
${execi 1 /home/bbrice/Scripts/gmusicforconky.sh title}
${execi 1 /home/bbrice/Scripts/gmusicforconky.sh artist | tail -1}
${execi 1 /home/bbrice/Scripts/gmusicforconky.sh album | head -1}$color
${execbar /home/bbrice/Scripts/gmusicforconky.sh progress}
${voffset -18}$color${exec /home/bbrice/Scripts/gmusicforconky.sh cur_pos}$alignr${exec /home/bbrice/Scripts/gmusicforconky.sh length}

J'essaierai de faire un tuto et de mettre à jour le wiki (si je trouve le temps...)

Par contre, pour ce qui est de l'image, je n'ai pas avancé : je n'ignore pas qu'il faut protéger le chemin avec des guillemets (cp "/Mon répertoire/dossier de l'image/cover.jpg" ~/tmpcover) par exemple, mais au sein d'un script utilisant des variables, je n'avance pas.
J'ai commencé comme cela :
Code: [Select]
rep_cover=/home/bbrice/.conky/cover
cd /home/bbrice/Scripts
./gmusicforconky.sh album_picture > /home/bbrice/.conky/cover.tmp
chemin= cat /home/bbrice/.conky/cover.tmp
echo $chemin
j'ai bien le chemin qui s'affiche mais c'est ensuite que ça coince... pour copier l'image et la renommer dans ~/.conky/cover.

Merci et à+

Quentin Sculo

  • Administrator
  • Hero Member
  • *****
  • Posts: 1082
    • View Profile
Re: conky : affichage de la pochette
« Reply #2 on: March 18, 2010, 04:00:19 »
pour copier l'image en lui donnant un nouveau nom, ça devrais marcher :
Code: [Select]
cover=/home/bbrice/.conky/cover.jpg
file=$(/home/bbrice/Scripts/gmusicforconky.sh album_picture)
if [ "$file" = "" ] ;
 then  rm -f $cover ;
 else cp -f "$file" $cover;
fi

$(expression) est remplacé par la sortie de l'execution de expression  (c'est équivalent à `expression` )

Pour les accents avec nowplaying, c'est un bug, je le changerai pour sortir de l'utf8

Au passage, le script de loomsen est un peu plus compliqué que nécessaire, voilà un script un peu plus simple :
Code: [Select]
#!/bin/perl
use warnings;
use strict;
use Net::DBus;

my $bus = Net::DBus->session;
my $service = $bus->get_service('org.gmusicbrowser');
my $object = $service->get_object('/org/gmusicbrowser', 'org.gmusicbrowser');

my $info= $object->CurrentSong;
my $s0=$info->{length};
my $s1=$object->GetPosition;

$info->{total}= sprintf "%02d:%02d", $s0/60, $s0%60;
$info->{elapsed}= sprintf "%02d:%02d", $s1/60, $s1%60;
$info->{progress}= sprintf "%f", 100*$s1/$s0;

unless (@ARGV)
{ print "Usage examples :\n";
print $0.q( title)."\n";
print $0.q( '$title')."\n";
print $0.q( '$title by $artist from $album' '$elapsed / $total')."\n";
print "Available fields :\n";
printf "%-15s = %s\n", $_,$info->{$_} for sort keys %$info;
exit;
}

for my $string (@ARGV)
{ if ($string=~m/^\w+$/ && exists $info->{$string}) {$string='$'.$string }
$string=~s/\$(\w+)/$info->{$1}/g;
print "$string\n"
}

Astier

  • Newbie
  • *
  • Posts: 11
    • View Profile
    • My Own Memory Hole
Re : conky : affichage de la pochette
« Reply #3 on: March 18, 2010, 17:52:17 »
Merci beaucoup Quentin :-)

Du coup je n'utilise plus que ton script pour afficher les infos et je fais appel à lui pour aller chercher le chemin de la jaquette de l'album en cours.

En fait j'étais parti d'un script proposé sur le forum de Fedora (http://forums.fedora-fr.org/viewtopic.php?pid=386567#p386567) pour modifier l'image selon le moment de la journée en gros.

Voilà le script permettant d'afficher l'image :
Code: [Select]
#!/bin/bash
coverSize="120x120"
cover=/home/bbrice/.conky/cover.jpg
file=$(perl /home/bbrice/.conky/gmusic_for_conky.pl '$album_picture')
if [ "$file" = "" ] ;
 then  rm -f $cover ;
 else cp -f "$file" $cover;
fi

echo "\${image $cover -p 180,821 -s $coverSize -n}"

exit 0
et l'appel dans conky se fait comme cela :
Code: [Select]
${execpi 10 ~/.conky/gmusic_cover.sh}
et voilà le résultat


Le seul problème : je fais exécuter le script toutes les dix secondes (pour éviter d'avoir un décalage trop important entre la pochette et les autres informations) mais du coup on efface et copie l'image pas mal de fois... L'idéal serait de pouvoir vérifier si les informations (le titre me semble la piste à suivre) ont changé ou pas et si elles n'ont pas changé, on ne copie pas l'image... J'essaierai de regarder cela un peu plus tard.

Je ferai un article consacré à conky sur mon site et mettrai à jour le wiki dans les prochains jours.

Merci encore et à+.

Quentin Sculo

  • Administrator
  • Hero Member
  • *****
  • Posts: 1082
    • View Profile
Re: conky : affichage de la pochette
« Reply #4 on: March 18, 2010, 22:25:24 »
Tu pourrais lancer ça à partir du plugin nowplaying.
Je pense que j'ajouterai dans le plugin la possibilité d'écrire les infos dans un fichier texte et aussi d'écrire l'image de couverture redimensionée dans un fichier.

Au passage, j'ai ajouté la semaine dernière, dans la version git, un plugin "desktop wigets" permettant d'afficher des layouts sur le bureau.

Astier

  • Newbie
  • *
  • Posts: 11
    • View Profile
    • My Own Memory Hole
Re : conky : affichage de la pochette
« Reply #5 on: March 19, 2010, 20:00:17 »
Pour le plugin, nowplaying, il faudrait que j'utilise l'argument cover donc, pour que la commande soit cela :
Code: [Select]
tee /home/bbrice/.config/gmusicbrowser/nowplaying.info %c
c'est bien ça ou je fais fausse route ?

En fait le truc serait sans doute de pouvoir récupérer la longueur de la chanson pour ne changer les infos que si elles ont changé. Sauf que conky ne recharge pas la config en cours de route il me semble, donc ça me semble complexe.

Sinon, pour les desktop widgets je regarderai cela. Disons que je ne me sens pas particulièrement à l'aise avec git... J'y travaillerai.

Merci et à+

FreelY

  • Newbie
  • *
  • Posts: 4
    • View Profile
Re : conky : affichage de la pochette
« Reply #6 on: April 22, 2010, 21:30:08 »
Salut!

Moi aussi je me refait doucement un conky en ce moment:
J'ai réussi a avoir la couverture de l'album au début de la création de mon conky avec le script d'Astier, mais depuis j'ai fait pas mal d'autres modifications et maintenant je ne parviens plus a l'affichée :-\
L'image n'est plus copiée dans le dossier "/home/freely/.conky", j'ai l'erreur suivante:
Code: [Select]
cp: impossible d'évaluer « album : Distractions\nalbum_artist : The RH Factor\nalbum_picture : /media/Caviar/Audio/Musique/- Jazz'y -/The RH factor/The RH factor - distractions (2006)/folder.jpg\nartist : The RH Factor\ndisc : 0\nfile : 07 - a place.mp3\nlength : 263\npath : /media/Caviar/Audio/Musique/- Jazz'y -/The RH factor/The RH factor - distractions (2006)\ntitle : A Place\ntrack : 7\nuri : file:///media/Caviar/Audio/Musique/-%20Jazz'y%20-/The%20RH%20factor/The%20RH%20factor%20-%20distractions%20(2006)/07%20-%20a%20place.mp3\nposition : 75.284875283 »: Aucun fichier ou dossier de ce typeJe n'y connais quasiment rien en scripts, donc si vous avez une idée/piste.
Merci d'avance
 
(PS: je suis avec gmusicbrowser 1.1.4 ...)

Astier

  • Newbie
  • *
  • Posts: 11
    • View Profile
    • My Own Memory Hole
Re : conky : affichage de la pochette
« Reply #7 on: April 22, 2010, 22:26:09 »
Salut,

Alors quel script utilises-tu au juste ? Celui que j'ai posté ou celui que Quentin a proposé par la suite ?

Si tu veux un tuto à jour (a priori), regarde ici :
http://boucard.brice.perso.neuf.fr/index.php?option=com_content&view=article&id=42%3Aafficher-les-infos-de-lecture-de-mpd-ou-gmusicbrowser-dans-conky

A+

FreelY

  • Newbie
  • *
  • Posts: 4
    • View Profile
Re : conky : affichage de la pochette
« Reply #8 on: April 22, 2010, 23:20:15 »
Bonsoir Astier,

Merci pour ta réponse rapide. L'erreur est pour le script bash que tu a posté (comme celui du lien).
Ce que j'ai du mal à comprendre c'est pourquoi mon script gmusic_cover.sh cherche toutes ces infos: "nartist nlength npath ntitle ntrack nuri nposition" alors qu'il demande uniquement "album_picture".
Ça viendrait donc du script perl?
Code: [Select]
#!/usr/bin/perl
use warnings;
use strict;
use Net::DBus;

my $bus = Net::DBus->session;
my $service = $bus->get_service('org.gmusicbrowser');
my $object = $service->get_object('/org/gmusicbrowser', 'org.gmusicbrowser');

my $info= $object->CurrentSong;
print "$_ : $info->{$_}\n" for sort keys %$info;
print "position : ".$object->GetPosition."\n";
Sinon dans mon cas je n'ai pas de chemin à indiquer à GMB en principe?
 

Astier

  • Newbie
  • *
  • Posts: 11
    • View Profile
    • My Own Memory Hole
Re : conky : affichage de la pochette
« Reply #9 on: April 23, 2010, 00:22:57 »
A priori il semblerait que tu n'aies pas l'intégralité du script perl...

Essaie donc avec le script au complet (sers-toi de la barre de défilement...)

A+

FreelY

  • Newbie
  • *
  • Posts: 4
    • View Profile
Re : conky : affichage de la pochette
« Reply #10 on: April 23, 2010, 01:34:19 »
Rooolala... autant pour moi. Ça fonctionne tout de suite beaucoup mieux quand il est complet.  ;D
Bon, j'ai un petit souci d'affichage mais je vais fouiné encore un peu, j'ai déjà réussi a l'avoir normalement

Merci pour ton aide  ;)

Astier

  • Newbie
  • *
  • Posts: 11
    • View Profile
    • My Own Memory Hole
Re : conky : affichage de la pochette
« Reply #11 on: April 23, 2010, 01:40:09 »
Tu as bien pensé à rendre *tous* les scripts exécutables ? La commande est-elle la bonne (tu n'aurais pas conservé des commandes liées au script bash par hasard ?)

Au pire poste l'ensemble des scripts utilisés avec leur chemin (l'endroit où ils sont placés) ainsi que la partie du conky qui nous intéresse ici.

A+

FreelY

  • Newbie
  • *
  • Posts: 4
    • View Profile
Re : conky : affichage de la pochette
« Reply #12 on: April 23, 2010, 05:46:51 »
Résolu en modifiant le script  :D

Code: [Select]
#!/bin/perl
use warnings;
use strict;
use Net::DBus;

my $bus = Net::DBus->session;
my $service = $bus->get_service('org.gmusicbrowser');
my $object = $service->get_object('/org/gmusicbrowser', 'org.gmusicbrowser');

my $info= $object->CurrentSong;

unless (@ARGV)
{ print "Usage examples :\n";

print "$_ : $info->{$_}\n" for sort keys %$info;

exit;
}

for my $string (@ARGV)
{ if ($string=~m/^\w+$/ && exists $info->{$string}) {$string='$'.$string }
$string=~s/\$(\w+)/$info->{$1}/g;
print "$string\n"
}