Bonjour,
1-
Le problème avec certains fichiers ".cbz" est qu'ils sont compressés au format RAR, donc c'est le créateur de l'archive qui n'a pas mis la bonne extension.
J'ai réglé cela dans le nouveau script.
2-
L'autre problème est que l'archive contient des fichiers invisibles, ce sont des resources fork qui sont attachées au fichier Mac, ce problème survient quand les fichiers originaux sont créés sur un disque au format Mac et qu'ils sont transférés sur un disque au format Windows (les resources fork sont détachées du fichier et cela crée des fichiers inutiles) .
Si l'utilisateur (sur Windows) ne nettoie pas le dossier de ces fichiers inutile, l'utilitaire qui compresse les fichiers inclura les fichiers invisibles dans l'archive.
Donc, dans le nouveau script, j'exclus dans la liste de noms, les noms qui contient "__MACOSX/"
Pour l'erreur, je ne sais pas, mais je ne crois pas que cela fonctionne correctement pour
OS 10.11.x ou moins récent:
La méthode pour (10.11.x ou moins récent) serait comme ceci :
Ouvrir l'application "Éditeur de script" et sélectionnez le menu "Fichier" --> "Nouveau à partir d'un modèle" --> "
Cocoa-AppleScript Applet"
Copié/collé le script.
Ajouté
quit dans le script juste avant la ligne qui commence par
end open, comme ceci
Car cette application ne quittera pas automatiquement comme un droplet normal
On enregistre le script, c'est tout.
Note : pour les scripts de type "
Cocoa-Applescript", il est préférable de toujours compiler le script avant de l'enregistrer (il suffit de cliquer sur le bouton dont l'icône est un marteau), cela évite certaines erreurs.
J'ai activé mes messages personnels , si vous avez besoin de m'envoyer d'autres fichiers, vous pouvez le faire en privé.
Voici le nouveau script :
Bloc de code:
use framework "Foundation"
use framework "AppKit"
use scripting additions
on open cesArchives
tell application "Finder"
set p to (application file id "com.peternoriega.unrarx") as string -- on obtient le chemin de l'application UnRarX
set tempFolder to POSIX path of ((make new folder) as string) -- création d'un dossier temporaire (c'est pour extraire le premier JPEG dans l'archive)
end tell
set unrarPath to quoted form of ((POSIX path of p) & "/Contents/Resources/unrar") -- on obtient l'exécutable dans l'application "UnRarX"
repeat with archive in cesArchives -- boucle sur les fichiers déposés sur l'application (ce script)
set x to POSIX path of archive
set firstJPG to ""
set fauxCBZ to false
try
if x ends with ".cbr" then
set r to do shell script unrarPath & " vb " & (quoted form of x) & " | grep -v '__MACOSX/'" -- on obtient la liste des noms dans l'archive ".cbr"
else if x ends with ".cbz" then
try
set r to do shell script "unzip -Z -1 " & (quoted form of x) & " | grep -v '__MACOSX/'" -- on obtient la liste des noms dans l'archive ".cbz"
on error -- ce n'est pas une archive zip, c'est un ".cbz" compressé au format rar
set r to do shell script unrarPath & " vb " & (quoted form of x) & " | grep -v '__MACOSX/'" -- on obtient la liste des noms dans l'archive ".cbz"
set fauxCBZ to true
end try
end if
if r is not "" then set firstJPG to my trier(paragraphs of r) -- on tri les noms et on obtient le nom du premier fichier .JPG dans l'archive
end try
if firstJPG is not "" then
set tFile to ""
if x ends with ".cbr" or fauxCBZ then
do shell script "cd " & (quoted form of tempFolder) & "; " & unrarPath & " e " & (quoted form of x) & " " & quoted form of firstJPG -- on extrait le premier fichier dans l'archive et on le place dans le dossier temporaire
else if x ends with ".cbz" then
do shell script "cd " & (quoted form of tempFolder) & "; unzip -j " & (quoted form of x) & " " & quoted form of firstJPG -- on extrait le premier fichier dans l'archive et on le place dans le dossier temporaire
else -- ce n'est pas un fichier ".cbr" ou ".cbz"
set tFile to missing value
end if
if tFile is not missing value then
tell application "System Events" to tell (first file of folder tempFolder whose name extension is "jpg") to if exists then set tFile to POSIX path -- on obtient le chemin du fichier dans le dossier temporaire
if tFile is not "" then my setIcon(tFile, x)
end if
end if
end repeat
tell application "System Events" to delete folder tempFolder -- supprime le dossier temporaire
end open
on setIcon(f, f2)
set ca to current application
set image to ca's NSImage's alloc()'s initWithContentsOfFile:f -- on récupère l'image JPG (pleine grandeur)
set w to image's |size|()'s width()
set h to image's |size|()'s height()
if h > w then
set maxD to h
set centerH to 0
set centerW to (h - w) / 2
else
set maxD to w
set centerW to 0
set centerH to (w - h) / 2
end if
(* Le problème avec 'setIcon:theIcon' est qu'il crée une icône carré, donc si l'image originale est rectangulaire l'icône sera déformé
La solution est de créer une nouvelle image carré avec un fond invisible et on applique l'image originale au centre du fond invisible, les dimensions de l'image originale restera la même
*)
set centerBounds to ca's NSMakeRect(centerW, centerH, w, h)
set theIcon to ca's NSImage's alloc()'s initWithSize:{maxD, maxD} -- création d'une nouvelle image vide (elle est redimensionné pour faire un carré)
theIcon's lockFocus()
image's drawInRect:centerBounds fromRect:(ca's NSZeroRect) operation:(ca's NSCompositeCopy) fraction:1.0 -- on applique l'image originale au centre de l'image vide
theIcon's unlockFocus()
ca's NSWorkspace's sharedWorkspace()'s setIcon:theIcon forFile:f2 options:0 -- on ajoute une icône personnalisée à l'archive
tell application "System Events" to delete file f -- supprime le fichier dans le dossier temporaire
end setIcon
on trier(l) -- une méthode Cocoa-Applescript (Objective-C)
set theList to current application's NSMutableArray's arrayWithArray:l
set theDesc to current application's NSSortDescriptor's sortDescriptorWithKey:"self" ascending:true selector:"localizedStandardCompare:"
theList's sortUsingDescriptors:{theDesc} -- on tri la liste
((theList's pathsMatchingExtensions:{"jpg", "JPG", "jpeg", "JPEG"})'s objectAtIndex:0) as string -- on obtient le premier JPG dans la liste
end trier