Nautilus : remplacer l'icône du dossier par une photo

Xorg, Compiz, KDE / Gnome / Xfce / Fluxbox / e17 / fvwm ... GDM/KDM/XDM...
Avatar de l’utilisateur
Archie
yeomen
Messages : 257
Inscription : jeu. 28 juin 2007, 22:18
Localisation : France (33)

Nautilus : remplacer l'icône du dossier par une photo

Message par Archie »

Salut ;
Dans mon répertoire photo, lui même segmenté en sous répertoire qui contient les photos, j'aimerai remplacer l'icone du dossier par une des photos présentes à l'intèrieur.
J'ai bien vu la possibilité de le réaliser via un clique droit sur le dossier --> Proprièté --> image du dossier --> puis sélection d'une photo
Mais évidemment je voudrai pouvoir le faire en ligne de commande pour éviter le fastidieux boulot de le faire à la main.
L'un des problèmes, c'est que j'ignore ou ce fait l'association entre le nom du dossier et la photos.
Quelqu'un serait expliquer comment réaliser cela, ou aurait une partie de la réponse ?
Avatar de l’utilisateur
warnaud
Maître du Kyudo
Messages : 1640
Inscription : ven. 11 août 2006, 17:05
Localisation : Rolle (CH)

Message par warnaud »

tu dois avoir un fichier caché à la racine de ton répertoire, un fichier .quelquechose (note le '.' devant) et c'est dans ce fichier que tu trouveras ton bonheur
Plus ça rate, plus ça a de chance de réussir. En somme, un succès n'est qu'une erreur qui a finit par réussir (même par erreur). Ne déséspérez donc pas et perseverez. Utilisez La Rache™
Patientia quod lard quod barrus planto diligo ut licentia
—¤÷(`[¤*Powered By *¤]´)÷¤—
Archlinux ~ Fvwm ~ Irssi ~ URxvt
Avatar de l’utilisateur
Archie
yeomen
Messages : 257
Inscription : jeu. 28 juin 2007, 22:18
Localisation : France (33)

Message par Archie »

Aprés avoir associé de manière graphique une photo comme icone de dossier, il n'y a pas de fichier caché dans le répertoire en question, ni dans le répertoire parent d'ailleur :?
Avatar de l’utilisateur
Archie
yeomen
Messages : 257
Inscription : jeu. 28 juin 2007, 22:18
Localisation : France (33)

Message par Archie »

Bon, j'ai fini par trouver quelqu'un qui a fait le boulot. Je me disais bien que je pouvais pas être le seul à vouloir réaliser cette manipe.
http://dwayneb.free.fr/blog/index.php/2 ... splaycover

Chez moi le script marche :D
Je fais un copier/coller du script. Histoire que si le site disparait, j'ai un lieu ou le repiocher.

Code : Tout sélectionner

#!/usr/bin/python

#---------------------------------------------------------------------------
# @lincense CC-LGPL (http://creativecommons.org/licenses/LGPL/2.1/)
# @author   David Bernard
# @version  0.4
#---------------------------------------------------------------------------
#TODO : add option to use the first image as cover for directory with images
#       convert "$IMAGE" -thumbnail x200 -resize '200x<' -resize 50% -gravity center -crop 100x100+0+0 cover.png
#TODO : add option to create a snapshot of images directory (??)
#TODO : retreive cover from www for directories with mp3, ogg (eg: http://www.allcdcovers.com/api)
#TODO : generate thumbail
#TODO : convert jpg and gif to png (because KDE only support png)
#---------------------------------------------------------------------------
# CHANGELOG
# 0.4
#  * fix bug : in encoding of nautilus metafilename
#
import logging
from optparse import OptionParser

import sys
import os
import os.path
import posix

#for nautilus
import xml.dom.minidom
import urllib

options = None

nautilusMetaDirPath = os.path.join(posix.environ['HOME'], ".nautilus/metafiles")

freedesktopTemplate = """
[Desktop Entry]
Icon=%(iconPath)s
"""

emptyMetafile4Nautilus = """<?xml version="1.0"?>
<directory></directory>
"""

def defineCover(arg, dirname, names) :
  logging.info("analyse %s", dirname)
  iconPath = findIcon(dirname)
  if iconPath != None :
    setMeta4Freedesktop(dirname, iconPath)
    setMeta4Nautilus(dirname, iconPath)
  
def findIcon(dirPath):
  logging.debug("findIcon of %s", dirPath)
  iconPath = os.path.join(dirPath, options.iconName)
  if os.path.exists(iconPath) :
    return "./" + options.iconName
  return None

def setMeta4Freedesktop(dirPath, iconPath):
  if not options.freedesktop:
    return
  logging.debug("set meta for freedesktop of %s", dirPath)
  filePath =os.path.join(dirPath, ".directory") 
  if not isCreateFileAllowed(filePath, "replace"):
    return
  content = freedesktopTemplate % {'dirPath':dirPath, 'dirName': os.path.basename(dirPath), 'iconPath':iconPath}
  createFile(filePath, content)

def setMeta4Nautilus(dirPath, iconPath):
  if not options.nautilus:
    return
  logging.debug("set meta for nautilus of %s", dirPath)
  (parentPath, dirName) = os.path.split(dirPath)
  dirName = urllib.quote(dirName)
  filePath = "//" + parentPath + ".xml"
  filePath = urllib.quote(urllib.quote(filePath))
  filePath = "file:" + filePath.replace("/", "%2F")
  filePath = os.path.join(nautilusMetaDirPath, filePath)
  if not isCreateFileAllowed(filePath, "update"):
    return
  dom = None
  if (os.path.exists(filePath)):
    dom = xml.dom.minidom.parse(filePath)
  else :
    dom = xml.dom.minidom.parseString(emptyMetafile4Nautilus)
  targetNode = None
  for fileNode in  dom.getElementsByTagName("file"):
    if fileNode.getAttribute("name") == dirName :
      targetNode = fileNode
      break
  if targetNode is None:
    targetNode =  dom.createElement("file")
    targetNode.setAttribute("name", dirName)
    dom.getElementsByTagName("directory")[0].appendChild(targetNode)
  targetNode.setAttribute("custom_icon", iconPath)
  createFile(filePath, dom.toxml())
  
def isCreateFileAllowed(filePath, action):
  logging.debug("try create file : %s", filePath)
  if not(options.replaceAlways) and os.path.exists(filePath) :
    if options.keepFile or not prompt("meta already exists(%s),\n\t do you want to %s it" % (filePath, action)) :
      logging.debug("meta already exist, nothing to do : %s", filePath)
      return False
  return True

def createFile(filePath, content):
  logging.info("create file : %s", filePath)
  fileHandle = open(filePath, 'w' )
  fileHandle.write(content)
  fileHandle.close()

Y = True
y = True
yes = True
O = True
o = True
oui = True
N = False
n = False
no = False
non = False
def prompt(message):
  response = input(message + " (Y/N) :")
  return response

def main():
  parser = OptionParser(usage="usage: %prog [options] dir", version="%prog 0.3")
  parser.add_option("-i", "--icon", dest="iconName", default="cover.png", help="filename of icon image (default: cover.png)")
  parser.add_option("-f", "--freedesktop", action="store_true", dest="freedesktop", default=False, help="generate freedesktop, KDE .directory file (default: false)")
  parser.add_option("-n", "--nautilus", action="store_true", dest="nautilus", default=False, help="generate nautilus metafiles (default: false)")
  parser.add_option("-r", "--replaceAlways", dest="replaceAlways", default=False, action="store_true", help="always replace/update files (=> no prompt) (default: false)")
  parser.add_option("-k", "--keepFile", dest="keepFile", default=False, action="store_true", help="never replace files (=> no prompt) (default: false)")
  parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=True, help="don't print status messages to stdout")
  parser.add_option("-d", "--debug", action="store_true", dest="debug", default=False, help="print debug messages to stdout")
  (options, args) = parser.parse_args()
  if len(args) != 1:
    parser.error("incorrect number of arguments")
  if not options.nautilus and not options.freedesktop:
    parser.error("you must choose --nautilus and/or --freedesktop option")
  if options.verbose :
    logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s')
  elif options.debug :
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s')
  else :
    logging.basicConfig(level=logging.WARNING, format='%(asctime)s %(levelname)s %(message)s')
  if options.keepFile :
    options.replaceAlways = False

  globals()["options"] = options

  if options.nautilus and not os.path.exists(nautilusMetaDirPath) :
    if prompt("create %s (Y/N)" % nautilusMetaDirPath):
      os.path.mkdirs(nautilusMetaDirPath)
    else :
      options.nautilus = False

  dirPath = os.path.abspath(args[0])
  os.path.walk(dirPath, defineCover, None)

if __name__ == "__main__":
  main()
Répondre