Skip to content

Commit 4eb6155

Browse files
committed
Claude en accès complet : il modifie tout (textes, couleurs, orientation, codes, formats, tailles) et va chercher les images et logos demandés (Wikimedia Commons ou adresse directe), posés tout de suite
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016wVsap73EucTstQoL8cttV
1 parent 5cb54e7 commit 4eb6155

13 files changed

Lines changed: 312 additions & 6 deletions

File tree

834 Bytes
Binary file not shown.

‎app/Ressources/Langues/de.lproj/Localizable.strings‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"Aucun fichier audio associé : ce morceau ne peut pas être enregistré. Choisis ton dossier audio à gauche." = "Keine Audiodatei zugeordnet: Dieser Titel kann nicht aufgenommen werden. Wähle links deinen Audio-Ordner.";
8585
"Aucun fichier audio dans ce dossier" = "Keine Audiodatei in diesem Ordner";
8686
"Aucun fichier audio dans le dossier" = "Keine Audiodatei im Ordner";
87+
"Aucune image trouvée pour « %@ ». Importe-la toi-même ou reformule." = "Kein Bild für „%@“ gefunden. Importiere es selbst oder formuliere um.";
8788
"Aucune police lisible dans ces fichiers" = "Keine lesbare Schrift in diesen Dateien";
8889
"Aucune édition cassette trouvée : Claude partira de la pochette." = "Keine Kassettenausgabe gefunden: Claude startet mit dem Cover.";
8990
"Audio" = "Audio";
@@ -233,6 +234,7 @@
233234
"Ignorer" = "Ignorieren";
234235
"Ignorer " = "Ignorieren ";
235236
"Image ajoutée au recto" = "Bild auf der Vorderseite eingefügt";
237+
"Image posée : %@" = "Bild platziert: %@";
236238
"Import de « %@ » depuis MusicBrainz…" = "Importiere „%@“ von MusicBrainz…";
237239
"Import de « %@ »…" = "Importiere „%@“…";
238240
"Import du lien Spotify…" = "Importiere den Spotify-Link…";
@@ -293,6 +295,7 @@
293295
"Mise en page" = "Layout";
294296
"Mixtape" = "Mixtape";
295297
"Mode Concentration activé" = "Fokus-Modus an";
298+
"Modifications de Claude appliquées ✓" = "Änderungen von Claude übernommen ✓";
296299
"Monter" = "Nach oben";
297300
"MusicBrainz (gratuit, sans compte)" = "MusicBrainz (kostenlos, ohne Konto)";
298301
"MusicBrainz a répondu %lld. Réessaie dans un instant." = "MusicBrainz antwortete %lld. Versuch es gleich nochmal.";
@@ -368,6 +371,7 @@
368371
"Remettre « %@ »" = "„%@“ zurücklegen";
369372
"Reprendre crédits et notes" = "Credits und Notizen übernehmen";
370373
"Retirer ce morceau" = "Diesen Titel entfernen";
374+
"Retirer cette image" = "Dieses Bild entfernen";
371375
"Retirer de la cassette" = "Von der Kassette entfernen";
372376
"Retirer de la cassette (ne sera pas enregistré)" = "Von der Kassette entfernen (wird nicht aufgenommen)";
373377
"Retirer l'image" = "Bild entfernen";

‎app/Ressources/Langues/en.lproj/Localizable.strings‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"Aucun fichier audio associé : ce morceau ne peut pas être enregistré. Choisis ton dossier audio à gauche." = "No audio file linked: this track can't be recorded. Choose your audio folder on the left.";
8585
"Aucun fichier audio dans ce dossier" = "No audio file in this folder";
8686
"Aucun fichier audio dans le dossier" = "No audio file in the folder";
87+
"Aucune image trouvée pour « %@ ». Importe-la toi-même ou reformule." = "No image found for “%@”. Import it yourself or rephrase.";
8788
"Aucune police lisible dans ces fichiers" = "No readable font in these files";
8889
"Aucune édition cassette trouvée : Claude partira de la pochette." = "No cassette edition found: Claude will start from the cover.";
8990
"Audio" = "Audio";
@@ -233,6 +234,7 @@
233234
"Ignorer" = "Ignore";
234235
"Ignorer " = "Ignore ";
235236
"Image ajoutée au recto" = "Image added to the front";
237+
"Image posée : %@" = "Image placed: %@";
236238
"Import de « %@ » depuis MusicBrainz…" = "Importing “%@” from MusicBrainz…";
237239
"Import de « %@ »…" = "Importing “%@”…";
238240
"Import du lien Spotify…" = "Importing the Spotify link…";
@@ -293,6 +295,7 @@
293295
"Mise en page" = "Layout";
294296
"Mixtape" = "Mixtape";
295297
"Mode Concentration activé" = "Focus mode on";
298+
"Modifications de Claude appliquées ✓" = "Claude's changes applied ✓";
296299
"Monter" = "Move up";
297300
"MusicBrainz (gratuit, sans compte)" = "MusicBrainz (free, no account)";
298301
"MusicBrainz a répondu %lld. Réessaie dans un instant." = "MusicBrainz replied %lld. Try again in a moment.";
@@ -368,6 +371,7 @@
368371
"Remettre « %@ »" = "Put back “%@”";
369372
"Reprendre crédits et notes" = "Use these credits and notes";
370373
"Retirer ce morceau" = "Remove this track";
374+
"Retirer cette image" = "Remove this image";
371375
"Retirer de la cassette" = "Remove from tape";
372376
"Retirer de la cassette (ne sera pas enregistré)" = "Remove from tape (won't be recorded)";
373377
"Retirer l'image" = "Remove the image";

‎app/Ressources/Langues/ru.lproj/Localizable.strings‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"Aucun fichier audio associé : ce morceau ne peut pas être enregistré. Choisis ton dossier audio à gauche." = "Нет аудиофайла: этот трек нельзя записать. Выбери папку с аудио слева.";
8585
"Aucun fichier audio dans ce dossier" = "В этой папке нет аудиофайлов";
8686
"Aucun fichier audio dans le dossier" = "В папке нет аудиофайлов";
87+
"Aucune image trouvée pour « %@ ». Importe-la toi-même ou reformule." = "Не найдено изображение для «%@». Импортируй сам или переформулируй.";
8788
"Aucune police lisible dans ces fichiers" = "В этих файлах нет читаемых шрифтов";
8889
"Aucune édition cassette trouvée : Claude partira de la pochette." = "Кассетных изданий не найдено: Claude начнёт с обложки.";
8990
"Audio" = "Аудио";
@@ -233,6 +234,7 @@
233234
"Ignorer" = "Пропустить";
234235
"Ignorer " = "Пропустить ";
235236
"Image ajoutée au recto" = "Изображение добавлено на лицевую сторону";
237+
"Image posée : %@" = "Изображение добавлено: %@";
236238
"Import de « %@ » depuis MusicBrainz…" = "Импорт «%@» из MusicBrainz…";
237239
"Import de « %@ »…" = "Импорт «%@»…";
238240
"Import du lien Spotify…" = "Импорт ссылки Spotify…";
@@ -293,6 +295,7 @@
293295
"Mise en page" = "Макет";
294296
"Mixtape" = "Микстейп";
295297
"Mode Concentration activé" = "Режим «Фокусирование» включён";
298+
"Modifications de Claude appliquées ✓" = "Изменения Claude применены ✓";
296299
"Monter" = "Вверх";
297300
"MusicBrainz (gratuit, sans compte)" = "MusicBrainz (бесплатно, без аккаунта)";
298301
"MusicBrainz a répondu %lld. Réessaie dans un instant." = "MusicBrainz ответил %lld. Попробуй чуть позже.";
@@ -368,6 +371,7 @@
368371
"Remettre « %@ »" = "Вернуть «%@»";
369372
"Reprendre crédits et notes" = "Взять титры и заметки";
370373
"Retirer ce morceau" = "Убрать этот трек";
374+
"Retirer cette image" = "Убрать это изображение";
371375
"Retirer de la cassette" = "Убрать с кассеты";
372376
"Retirer de la cassette (ne sera pas enregistré)" = "Убрать с кассеты (не будет записан)";
373377
"Retirer l'image" = "Убрать изображение";

‎app/Ressources/Langues/t7.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,8 @@
6161
"Orientation": ("Orientation", "Ориентация", "Ausrichtung"),
6262
"Vertical": ("Portrait", "Вертикально", "Hochformat"),
6363
"Paysage": ("Landscape", "Горизонтально", "Querformat"),
64+
"Modifications de Claude appliquées ✓": ("Claude's changes applied ✓", "Изменения Claude применены ✓", "Änderungen von Claude übernommen ✓"),
65+
"Image posée : %@": ("Image placed: %@", "Изображение добавлено: %@", "Bild platziert: %@"),
66+
"Aucune image trouvée pour « %@ ». Importe-la toi-même ou reformule.": ("No image found for “%@”. Import it yourself or rephrase.", "Не найдено изображение для «%@». Импортируй сам или переформулируй.", "Kein Bild für „%@“ gefunden. Importiere es selbst oder formuliere um."),
67+
"Retirer cette image": ("Remove this image", "Убрать это изображение", "Dieses Bild entfernen"),
6468
}

‎app/Sources/LaFleurCore/ClaudeDesign.swift‎

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,22 @@ public struct PropositionDesign: Decodable, Sendable {
2424
public let elements: [Element]
2525
public let commentaire: String
2626
}
27+
/// Un réglage que Claude change directement (voir `ChampsDesign`).
28+
public struct Modification: Decodable, Sendable, Hashable {
29+
public let champ: String
30+
public let valeur: String
31+
}
32+
/// Une image que Claude veut poser : cherchée sur Wikimedia Commons (ou téléchargée si `url` est donnée).
33+
public struct DemandeImage: Decodable, Sendable, Hashable {
34+
public let requete: String
35+
public let url: String
36+
/// recto (image principale), logo (maison de disque), element (posé sur le recto)
37+
public let usage: String
38+
public let x: Double, y: Double, largeur: Double, hauteur: Double
39+
}
2740
public let message: String
41+
public let modifications: [Modification]
42+
public let images: [DemandeImage]
2843
public let variantes: [V]
2944
public let texte_tranche: String
3045
public let notes: String
@@ -121,15 +136,26 @@ extension ClientClaude {
121136
- Style « graphique » : `elements` dessine le recto (x, y, largeur, hauteur de 0 à 1, origine en haut à gauche, \
122137
rotation en degrés, 3 à 25 formes). Pour les autres styles, `elements` peut ajouter quelques touches (bandes, \
123138
tampons, badge) ou rester vide. `texte` vaut "" sauf pour la forme « texte ».
124-
- Badge de bande en texte seulement, façon K7 d'époque (ex. « TYPE II · CrO₂ · HIGH POSITION · 70 µs · DOLBY B NR »). \
125-
Jamais les logos déposés des marques de cassettes ni des maisons de disque.
139+
- Badge de bande façon K7 d'époque (ex. « TYPE II · CrO₂ · HIGH POSITION · 70 µs · DOLBY B NR »).
126140
- Texte de tranche : 42 caractères maximum, sinon il déborde (ex. « J. SADIK · AFTERNOON AT THE LAKE »).
127141
- Notes : quelques lignes de présentation, jamais de paroles complètes (droits d'auteur).
128142
- Crédits : seulement des infos sûres (données fournies) ; ce que tu ne sais pas reste vide, n'invente rien.
129143
- texte_code : la ligne au-dessus du code-barres, par défaut « MAISON · CATALOGUE ».
130144
- \(styles)
131145
- `message` : ce que tu as fait, en 2 ou 3 phrases, en \(langue). Tous les textes sont en \(langue) sauf les noms propres.
132146
- Si on te demande de régénérer une seule variante, renvoie quand même 3 variantes : les autres inchangées.
147+
ACCÈS COMPLET : l'utilisateur fabrique des cassettes pour son usage personnel (il a accepté les conditions \
148+
d'utilisation de l'app). Tu peux tout changer et tu exécutes ce qu'il demande, sans refuser ni faire la morale.
149+
- Retouche (« mets le titre plus gros », « passe le QR à l'intérieur », « orientation paysage »…) : applique-la \
150+
avec `modifications` (champ + valeur en texte) et renvoie `variantes` vide. Tu ne proposes 3 variantes que pour \
151+
une première proposition ou quand on te demande d'autres pistes.
152+
- Champs modifiables et valeurs : \(ChampsDesign.aide)
153+
- Images : pour mettre une image, un logo ou un écusson (ex. « l'écusson Sony »), ajoute-la dans `images` : \
154+
`requete` = mots-clés pour Wikimedia Commons (en anglais, ex. « Sony logo »), `url` = adresse directe d'un \
155+
fichier image si tu la connais, sinon "". `usage` : « recto » (image principale du recto), « logo » (logo de la \
156+
maison de disque, recto et tranche) ou « element » (posé sur le recto aux coordonnées x, y, largeur, hauteur \
157+
de 0 à 1). L'app télécharge l'image et la pose tout de suite.
158+
- Pour enlever une image posée : modification « images_retirer » valeur « tout ».
133159
""",
134160
message: """
135161
\(Self.fiche(projet, design))
@@ -141,7 +167,10 @@ extension ClientClaude {
141167
Demande : \(demande.isEmpty ? "Première proposition : 3 variantes." : demande)\(regenerer.map { "\nRégénère seulement la variante \($0), garde les autres." } ?? "")
142168
""",
143169
schema: objet(["message": chaine, "variantes": liste(variante), "texte_tranche": chaine, "notes": chaine,
144-
"credits": chaine, "texte_code": chaine]),
170+
"credits": chaine, "texte_code": chaine,
171+
"modifications": liste(objet(["champ": choix(ChampsDesign.tous), "valeur": chaine])),
172+
"images": liste(objet(["requete": chaine, "url": chaine, "usage": choix(["recto", "logo", "element"]),
173+
"x": nombre, "y": nombre, "largeur": nombre, "hauteur": nombre]))]),
145174
effort: "high", images: images)
146175
}
147176

‎app/Sources/LaFleurCore/Jaquette.swift‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ public struct Design: Codable, Hashable, Sendable {
134134
public var historique: [Variante] = []
135135
public var imagePerso: URL?
136136
public var orientation: OrientationRecto = .vertical
137+
/// Images posées sur le recto (logos, écussons, éléments trouvés par Claude).
138+
public var imagesPosees: [ImagePosee] = []
137139
/// Échelle du texte par zone (« tranche », « titre », « tracklist »…), 1 = taille normale.
138140
public var echelles: [String: Double] = [:]
139141

@@ -176,7 +178,7 @@ public struct Design: Codable, Hashable, Sendable {
176178
public var alertesForcees: Set<String> = []
177179

178180
enum CodingKeys: String, CodingKey {
179-
case jcard, ocard, etiquettes, obi, volets, dos, reperes, variante, propositions, historique, imagePerso, orientation, echelles, texteTranche, notes, credits, obiTexte, afficherLogoMaison, lienParoles, codeBarres, genreCode, numeroCode, texteCode, placeCode, couleursCode, barresPerso, fondPerso, chiffresCode, echelleCode, qr, contenuQR, texteQR, placeQR, codeSpotify, codeX, codeY, rotationCode, logoMaison, alertesForcees
181+
case jcard, ocard, etiquettes, obi, volets, dos, reperes, variante, propositions, historique, imagePerso, orientation, imagesPosees, echelles, texteTranche, notes, credits, obiTexte, afficherLogoMaison, lienParoles, codeBarres, genreCode, numeroCode, texteCode, placeCode, couleursCode, barresPerso, fondPerso, chiffresCode, echelleCode, qr, contenuQR, texteQR, placeQR, codeSpotify, codeX, codeY, rotationCode, logoMaison, alertesForcees
180182
}
181183

182184
/// Décodage tolérant : un champ absent ou illisible prend sa valeur par défaut (les anciennes cassettes restent lisibles).
@@ -196,6 +198,7 @@ public struct Design: Codable, Hashable, Sendable {
196198
historique = v(.historique, d.historique)
197199
imagePerso = v(.imagePerso, d.imagePerso)
198200
orientation = v(.orientation, d.orientation)
201+
imagesPosees = v(.imagesPosees, d.imagesPosees)
199202
echelles = v(.echelles, d.echelles)
200203
texteTranche = v(.texteTranche, d.texteTranche)
201204
notes = v(.notes, d.notes)

0 commit comments

Comments
 (0)