begin process at 2008 05 16 04:27:00
1 173 209 membres
51 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

XML DE DESCRIPTION DE DOSSIERS NAUTILUS




Description

cette source d'adresse aux utilisateurs de gnome.

nautilus permet de personaliser l'affichage des dossiers, mettre une image a la place de l'icone par exemple. Pour ceux qui telechargent de la musique libre sur jamendo, vous pouvez constater qu'une fois que vous avez telecharge 100 albums, il devient difficile de changer chaque image de chaque album...

ce script automatise la tache, il va chercher dans le dossier, la premiere image vennue (recursivement), et il la place comme icone.

dans la source, j'ai mis ces deux lignes :

$dir='/media/Yakumo/Musique/musique libre';
$dest='/home/max/.nautilus/metafiles/file:%2F%2F%2Fmedia%2FYakumo%2FMusique%2Fmusique%2520libre.xml';

il faut les remplacer par le dossier du dossier qui contient les sous-dossiers a "colorier", et le chemin du fichier de conf qui correspond.

pour lancer, il suffit de taper en ligne de commande :
$php iconize.php

Source

  • <?php
  • /**
  • * @file iconize.php
  • * @brief le fichier qui permet d'afficher dans un dossier, une icone par sous dossier, en prennant la premiere image vennue :)
  • * @test php iconize.php
  • */
  • include('top.php');
  • function first_icon($path){
  • $a=opendir($path);
  • while ($b=readdir($a)){
  • if ($b{0}!='.'){
  • if (is_dir($path.$b)){
  • if ($c=first_icon($path.$b.'/')) return $c;
  • }else if (substr($b, strlen($b)-3)=='jpg'){
  • return $path.$b;
  • }
  • }
  • }
  • return false;
  • }
  • function encode($str, $a=true){
  • $b=array(' ', 'é', ']', '[', ',', 'î');
  • $c=array('%20', '%C3%A9', '%5D', '%5B', '%2C', '%C3%A');
  • if ($a) {$b[]='/'; $c[]='%2F';}
  • return str_replace( $b, $c, $str );
  • }
  • $dir='/media/Yakumo/Musique/musique libre';
  • $dest='/home/max/.nautilus/metafiles/file:%2F%2F%2Fmedia%2FYakumo%2FMusique%2Fmusique%2520libre.xml';
  • $a=new GnomeDirXml();
  • $b=opendir($dir);
  • while ($c=readdir($b)){
  • if ($c{0}!=='.'){
  • $a->appendChild($d=new TemplateXML('file'));
  • $d->setAttribute('name', encode($c));
  • $d->setAttribute('timestamp', time()+10000);
  • $d->setAttribute('custom_icon', encode(substr(first_icon($dir.'/'.$c.'/'), strlen($dir)+2+strlen($c)), false));
  • }
  • }
  • $fd=fopen($dest, 'w');
  • fputs($fd, $a->show());
  • fclose($fd);
  • ?>
<?php
/**
* @file iconize.php
* @brief le fichier qui permet d'afficher dans un dossier, une icone par sous dossier, en prennant la premiere image vennue :)
* @test php iconize.php
*/
include('top.php');

function first_icon($path){
	$a=opendir($path);
	while ($b=readdir($a)){
		if ($b{0}!='.'){
			if (is_dir($path.$b)){
				if ($c=first_icon($path.$b.'/')) return $c;
			}else if (substr($b, strlen($b)-3)=='jpg'){
				return $path.$b;
			}
		}
	}
	return false;
}

function encode($str, $a=true){
	$b=array(' ',	'é',		']',	'[',	',', 'î');
	$c=array('%20',	'%C3%A9',	'%5D',	'%5B',	'%2C', '%C3%A');
	if ($a) {$b[]='/'; $c[]='%2F';}
	return str_replace( $b, $c, $str );
}

$dir='/media/Yakumo/Musique/musique libre';
$dest='/home/max/.nautilus/metafiles/file:%2F%2F%2Fmedia%2FYakumo%2FMusique%2Fmusique%2520libre.xml';
$a=new GnomeDirXml();
$b=opendir($dir);
while ($c=readdir($b)){
	if ($c{0}!=='.'){
		$a->appendChild($d=new TemplateXML('file'));
		$d->setAttribute('name', encode($c));
		$d->setAttribute('timestamp', time()+10000);
		$d->setAttribute('custom_icon', encode(substr(first_icon($dir.'/'.$c.'/'), strlen($dir)+2+strlen($c)), false));
	}
}
$fd=fopen($dest, 'w');
fputs($fd, $a->show());
fclose($fd);

?>

Conclusion

la fonction encode ne fonctionne pas parfaitement bien, mais ca reste utilisable.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de webdeb le 10/04/2008 14:09:59

    A titre d'information tu aurais pu gérer la récupération de l'extension du fichier à partir de la fonction pathinfo() et sa constante PATHINFO_EXTENSION.

  • signaler à un administrateur
    Commentaire de yoman64 le 11/04/2008 01:23:39

    Salut coucou747,

    Bon j'ai (étonnament) quelques remarques. Les mêmes que l'usuel et je suis certain que tu vas trouvé à me contredire, mais je les signales quand même :P

    Bon déja substr($b, strlen($b)-3) peut être remplacé par substr($b,-3) (au passage, si l'image a une extension .jpeg ton script le voit pas alors que c'est valide, c'est donc mieu d'isoler l'extension)

    Ensuite {0}, il serait judicieux d'utiliser les [ ] plutot. Pour la compatibilité éventuelle avec php6 qui ne les auras pu (entre autre) mais je sais que cet argument la vaut rien, c'était une remarque au passage.

    Il y a aussi les comparaison === lorsque tu compare un même type. Si je le signale c'est parce que des fois tu l'utilises et des fois non, donc manque de constance.

    Ta fonction encode à quel intêret sachant que urlencode remplace tous les chars spéciaux d'une chaine alors que la tiennes en fait juste quelques uns ?  Je crois comprendre que c'est à cause des slash que urlencode convertirait ? Mais du coup certains caractères que tu ne remplace pas (comme ; à ç ^ @=? " ' , la plupart des car ASCII passe dans le nom d'un fichier unix je crois) vont nuire au bon fonctionnement non ?

    Dernière chose: tes variables a, b, c, et compagnie: Ça serait mieu de leurs donner un noms représentatif de leur valeur. Il me semble que c'est une des premières règles à respecter quand on développe sinon on s'y perd...


    Bon c'était juste des petits trucs comme ça parce que ton code dans l'ensemble ya rien à redire... Code original même si moi je préfère xfce, ça fait changement des codes récurrent sur ce site.

  • signaler à un administrateur
    Commentaire de coucou747 le 11/04/2008 08:54:51

    :) merci.
    pour urlencode, ouais, je sais pas pourquoi, mais ca passait mal...
    pour $a, $b, $c, c'est un de mes gros defauts en prog...
    c'est un simple utilitaire pas forcement tres bien code, je l'ai mis comme ca parce-que meme imparfait, il ne presente pas de grosses erreurs, et conserve son utilite :)

    j'utilise en general fvwm ou gnome, mais toujours nautilus (sauf pour le sftp ou j'utilise alors konqueror), ca depend des periodes en fait, faudrait que je prenne le temps de scripter (un peu plus) pour fvwm.

  • signaler à un administrateur
    Commentaire de depression le 11/04/2008 09:00:10

    Merci pour cette source :-)

  • signaler à un administrateur
    Commentaire de codefalse le 11/04/2008 10:14:23 administrateur CS

    @Coucou : Tu utilse quelle version de php ? car php5, avec la classe DirectoryIterator, te permet de parcourir un dossier très facilement et plus agréablement qu'avec opendir et readdir :)

  • signaler à un administrateur
    Commentaire de coucou747 le 11/04/2008 10:37:41

    sisi, je pourrais, j'utilise regulierement la spl, mais plus pour des choses genre countable, arrayacces, itterator, ce genre de choses...
    http://www.php.net/~helly/php/ext/spl/

    en fait, c'est une partie que je trouve mal concue...
    meme pour les itterateurs, le typage de php fait que c'est bordelique, comme on a pas les generiques en php (normal vu le style du langage), bah tu fais un itterator sur n'importe quoi, t'as toujours un n'importe qui comme type de retour, tu ne peux pas faire comme la STL du Cpp genre vector<int>, ou des choses du genre... ca en php, c'est pas possible...

    faire un itterator<MonObjetPerso> ca peut sembler useless... mais par contre, quand j'avais teste la directoryitterator, j'avais pas vu un langage oriente objet... j'y avais vu un namespace...
    pourquoi ?
    parce-que tu ne peux pas dire a ton directoryitterator de creer des objets de ton propre type...
    personellement, j'avais besoin d'un truc qui me sorte plus d'infos sur les fichiers que la splFileInfo en donnait pour faire mon projet....
    class MonFichier extends SplFileInfo
    mais en fait, le probleme, c'est que le directoryitterator, lui il ne fait pas de classes personalises, il se contente d'un simple SplFileInfo...

    autant mettre ces classes avec un attribut final, et dire "si tu veux faire semblant de faire de l'objet, utilise moi"

  • signaler à un administrateur
    Commentaire de codefalse le 14/04/2008 17:20:27 administrateur CS

    je vois ce que tu veux dire, mais le fait que la spl soit là t'évite les tracas de faire un readdir ($resource) === false etc
    tu fait juste un
    foreach ($oDirectoryIt as $sKey=>$sValue) { // et hop ! }

    de plus tu a les fonctions isDot, bien sympa pour éviter les "." et ".." et quelques autres avatanges. Ca relève peut-etre plus du namespace, mais au final en quoi c'est genant ? la classe sert pour ce à quoi elle doit servir, c'est parfait.

    Apres c'est vrai que dans ton cas, pour l'attente que tu en as, c'est peut-etre d'un autre niveau que la spl ne te permet pas, mais la désolé j'ai pas les compétences nécéssaires pour comparer à du c++.

Ajouter un commentaire

Discussions en rapport avec ce code source

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS