J'ai suffisament avancé dans la programmation de mes classes pour mettre à disposition une version du code.
Sachant qu'elles vont être exploitées pour un plugin de démo nommé "AMetaData", j'ai créé sur le dépôt des plugins un répertoire "AMetaData".
Pour l'instant, point de plugin dans le répertoire, celui-ci viendra d'ici quelques semaines.
Seule la classe "JpegMetaData" y est présente, dans le sous-répertoire "JpegMetaData" (je ne vais pas chercher loin pour les noms...)
Le code est mis à disposition pour :
- que vous ayez un aperçu de ce que çà fait
- me faire des retours
Avant de recevoir 5000 messages, il est à noter :
- c'est encore en cours de réalisation, certaines fonctions peuvent changer de nom, de méthode d'appel, ou autres
=> si vous jetez un oeil sur le code et que quelque chose vous gène, vous pouvez me faire vos remarques
=> je sais déjà qu'il y a certains points à revoir
=> j'ai commenté un maximum le code, mais il me reste encore certains fichiers à commenter
- bien que le système de traduction soit en place, les fichiers de traduction ne sont pas à jour :
=> seuls les fichiers "en_UK" sont disponibles
=> les 'traductions' consistent pour l'instant à un "******"+la clef à traduire ; çà me permet juste de valider le système, et de bien voir qu'il s'agit d'un élément traduit et non pas de la clef
=> la classe ne fourni pas directement d'éléments traduits : elle fournie les clefs, il faut les traduire après coup. C'est voulu (flemme d'expliquer pourquoi pour l'instant)
=> pas la peine de se lancer dans la traduction des fichiers .po ; enfin si vous voulez, çà ne sera pas 100% perdu, mais disons que çà me semble prématuré pour l'instant
- concernant les métadonnées EXIF spécifiques aux fabricants, pour l'instant seul Pentax est implémenté
=> les autres viendront après, au fur et à mesure
=> pas la peine de se jeter sur l'adaptation des autres fabricants : lorsque j'aurais livré une version où je serais certain de ne pas revenir sur des points structurants, on abordera cette partie
Comment tester ?
Côté "utilisateur"
Dans le répertoire AMetaData/JpegMetaData/test, il y a un fichier index.php et deux images (07.jpg et 08.jpg)
- ce sont deux de mes photos, avec des métadonnées
- vous pouvez rajouter vos propres images dans ce répertoire pour tester la classe
Copier le tout sur un serveur local, et allez sur l'url correspondante au répertoire test
La page va s'afficher avec en haut, l'url des images présentes dans le répertoire.
Choisissez une image, la page se recharge avec l'analyse des métadonnées de celle-ci.
Je vous laisse découvrir à quoi çà ressemble, mais autant vous prévenir :
- c'est du brut
- c'est fait pour débugger
Au niveau des retours, j'attends surtout des photos qui ne passeraient pas, des tags inconnus, des tags connus et non implémentés qu'il semble indispensable d'implémenter, des tags connus mals implémentés, ...
Côté programmeur
L'idée c'est de jeter un oeil sur la classe proposée, voir si elle réponds aux besoins, s'il est possible de simplifier son usage.
JpegMetaData s'utilise de cette façon
Pour connaitre la liste des métadonnées connues et exploitables par la classe, indépendamment d'un fichier :
$list = JpegMetaData::getTagList();
Retourne un tableau d'éléments :
- la clef : l'identifiant de la métadonnée
exemples : 'exif.tiff.DateTime', 'exif.Pentax.LensType', 'iptc.Date Sent', 'xmp.photoshop:CaptionWriter'
- la valeur :
'name' => le nom de la métadonnée (donnée pouvant être traduite via la fonction Locale::get() )
'implemented' => un booléen indiquant si l'interprétation de la métadonnée est implémentée ou non
Pour analyser une image :
$jmd = new JpegMetaData($fileName);
ou l'option alternative :
$jmd = new JpegMetaData(); $jmd->load($fileName);
on récupère les métadonnées avec getTags() :
$list = $jmd->getTags()
Retourne un tableau d'élements :
- la clef : l'identifiant de la métadonnée (même formalisme que celui décrit pour la fonction getTagList)
- la valeur : un object de type Tag
l'objet dispose des méthodes suivantes :
getName : retourne le nom du tag, peut être traduit au moyen de la fonction Locale::get()
getValue : retourne la valeur brute, non interprétée, du tag
getLabel : retourne la valeur interprétée du tag, peut être traduit au moyen de la fonction Locale::get()
getIsKnown : indique si le tag est connu
getIsImplemented : indique si l'interprétation du tag est implémentée
getIsTranslatable : indique si la valeur interprétée du tag peut être traduite
getId : retourne l'Id 'brut' du tag (pour un exif, retourne par exemple 0x9202 pour 'ApertureValue')
C'est à peu près tout.
Je vous laisse regarder le code, les fonctions présentés ont des paramètres optionnels que je n'ai pas décrit ici...
Je ne vais pas avoir beaucoup de temps pour continuer d'avancer, je pars au ski dans une semaine et j'ai tout un tas de choses à préparer d'ici là.
Disons que pour fin février, on devrait avoir Canon + Nikon au niveau des exifs constructeurs, plus peut-être un premier plugin ;-)
Hors ligne
Bravo Grum ! Super !
Je vais regarder le plus vite possible, c'est-à-dire.......... euh, très bientôt :-/ !
Hors ligne
J'ai bien entendu déjà commencé de lire.
Rien que pour le plaisir de lire du code clair et propre, j'ai encore à apprendre.
Merci Grum.
;-)
Hors ligne
VDigital a écrit:
Rien que pour le plaisir de lire du code clair et propre, j'ai encore à apprendre.
Merci Grum.
;-)
De rien ;)
Et Dieu sait que le PHP n'est pas aidant de ce côté là. Même le Basic me semblait être moins permissif.... ;o)
Hors ligne
ça m'a l'air très bien, ça.
vivement que ça soit fini.
Bon ski, en attendant.
grum a écrit:
getIsKnown : indique si le tag est connu
getIsImplemented : indique si l'interprétation du tag est implémentée
getIsTranslatable : indique si la valeur interprétée du tag peut être traduite
Juste une remarque: 2 verbes à la suite c'est trop. Retire le get pour celles-ci.
Hors ligne
mathiasm a écrit:
grum a écrit:
getIsKnown : indique si le tag est connu
getIsImplemented : indique si l'interprétation du tag est implémentée
getIsTranslatable : indique si la valeur interprétée du tag peut être traduiteJuste une remarque: 2 verbes à la suite c'est trop. Retire le get pour celles-ci.
Dans ce cas, je préfèrerais retirer le "Is", pour rester cohérent dans le nommage des méthodes.
getKnown
getImplemented
getTranslatable
?
Hors ligne
Excellent tout ça :-) Je vais tester ça dans la semaine et faire un retour. Souhaites-tu que je fasse une traduction de ce topic sur le forum central anglophone pour tenter d'obtenir des retours "internationaux" ?
Je déplace également ce topic dans la section "beta test", c'est tout à fait opportun, et on est loin du divers.
grum a écrit:
getKnown
getImplemented
getTranslatable
?
Si la fonction renvoie un boolean, c'est bien isKnown et pas getKnown. Le isXxx est un cas particulier du getXxx. Dans le code, si on écrit:
if (isKnown())
là c'est sans ambigüité
if (getKnown())
là c'est ambigu
Hors ligne
plg a écrit:
Souhaites-tu que je fasse une traduction de ce topic sur le forum central anglophone pour tenter d'obtenir des retours "internationaux" ?
il est vrai qu'à la base je me suis lancé sur ce projet suite à requête d'un utilisateur du forum anglophone. et que plus il y a aura de retours, mieux çà sera.
donc pourquoi pas, je veux bien (que tu le fasses, j'avoue que çà m'ôte une épine du pied)
plg a écrit:
Si la fonction renvoie un boolean, c'est bien isKnown et pas getKnown. Le isXxx est un cas particulier du getXxx. Dans le code, si on écrit:
Code:
if (isKnown())là c'est sans ambigüité
Code:
if (getKnown())là c'est ambigu
ok.
Hors ligne
Je reviens sur le nommage des fonctions.
j'avais getIsKnown et setIsKnown.
j'ai remplacé getIsKnown par isKnown mais le set a le même problème que le get (à savoir, 2 verbes) o_O
Hors ligne
grum a écrit:
Je reviens sur le nommage des fonctions.
j'avais getIsKnown et setIsKnown.
j'ai remplacé getIsKnown par isKnown mais le set a le même problème que le get (à savoir, 2 verbes) o_O
Sémantiquement parlant, ce que tu as retiré n'est pas neutre : 'set' et 'get', ça n'est pas la même chose !
C'est peut-être l'autre verbe qu'il fallait retirer ;-)
Hors ligne
Décidément, aujourd'hui tout le monde a des problèmes de lecture.
tosca, peux-tu relire le message de grum? (Il est de ton avis à priori).
Hors ligne
VDigital a écrit:
Décidément, aujourd'hui tout le monde a des problèmes de lecture.
Et d'autres des problèmes d'interprétation ? ;-)
VDigital a écrit:
tosca, peux-tu relire le message de grum? (Il est de ton avis à priori).
Je ne faisais que commenter, en disant que des 2 verbes, il avait retiré celui qui n'était pas le bon ...
MDR Je retourne à ma scie sauteuse ... qui ne critiquera pas ma manière de lire, au moins !
Hors ligne
Je n'ai pas charger le fichier mais, comme ça, de loin:
isKnown est une méthode "publique" qui permet de récupérer un booléen.
Pour le définir, setKnown, qui est une méthode privée appelée à l'intérieur d'une fonction de la classe, non ?
(librement inspiré de Qt, rubrique "Naming Boolean Getters, Setters, and Properties")
Hors ligne
setIsKnown est aussi une méthode publique.
A la lecture de la page que tu indique, il faut donc avoir :
isKnown() => récupérer la valeur
setKnown() => affecter la valeur
Hors ligne
En PHP 5.3 (que j'ai par défaut en local pour corriger des bugs qu'on nous a reporté avec cette version récente) la classe Locale fait parti du core de PHP, du coup:
Fatal error: Cannot redeclare class Locale in /home/pierrick/public_html/test/AMetaData/JpegMetaData/Common/Locale.class.php on line 91
Je vais désinstaller PHP 5.3 et remettre 5.2 pour faire les tests.
Hors ligne