{"name":"memos/1038", "uid":"nZo3BpL67CvZVMqCwsoxaD", "rowStatus":"ACTIVE", "creator":"users/1", "createTime":"2025-09-08T16:52:52Z", "updateTime":"2025-09-08T17:01:04Z", "displayTime":"2025-09-08T16:52:52Z", "content":"```javascript\nconst getImages = () => Array.from(document.querySelectorAll('div[data-image-url] > img[src][data-iml]')).map(img => ({ image: img.src.split('&')[0], author: img.parentElement.dataset.authorName, source: img.parentElement.dataset.authorUrl }));\nconst images = {};\nimages.Astratta = getImages()\nimages.Arte = getImages()\nimages.Affari = getImages()\nimages.Ricorrenze = getImages()\nimages.Intrattenimento = getImages()\nimages.Famiglia = getImages()\nimages.Cibi_e_bevande = getImages()\nimages.Salute_e_bellezza = getImages()\nimages.Hobby_e_artigianato = getImages()\nimages.Casa_e_giardino = getImages()\nimages.Natura = getImages()\nimages.Motivi = getImages()\nimages.Ricreazione = getImages()\nimages.Scienza = getImages()\nimages.Shopping = getImages()\nimages.Tecnologia = getImages()\nimages.Trame = getImages()\nimages.Trasparente = getImages()\nimages.Viaggi = getImages()\nJSON.stringify(images)\n```\n\n💖💣, [08/09/2025 12:45]\nScrivi uno script Python per parsare un JSON del seguente formato:\n```json\n{\n  \"Categoria\": [\n    {\n      \"image\": \"https://themes.googleusercontent.com/image?id=...\",\n      \"author\": \"...\",\n      \"source\": \"...\"\n    },\n    ...\n  ],\n  ...\n}\n```\nPer ogni categoria crea una cartella. Per ogni elemento di ciascuna categoria, scarica l'immagine dall'URL \"image\" e salvala nella cartella con il formato del nome \"{id}.{estensione}\", l'estensione è determinata dal content-type della risposta HTTP. Per ogni immagine, crea nella stessa directory un file di testo INI con lo stesso nome dell'immagine (\"{id}.ini\"), e scrivici dentro:\n```ini\nlink = {image}\nauthor = {author}\ndescription = {source}\n```\n\nMicrosoft Copilot, [08/09/2025 12:45]\nEcco uno script Python che fa esattamente ciò che hai descritto: legge un JSON strutturato per categorie, crea una cartella per ciascuna categoria, scarica le immagini, determina l'estensione dal content-type, e genera un file `.ini` associato a ogni immagine.\n**🐍 Script Python**\n```python\nimport os\nimport json\nimport requests\nimport mimetypes\nfrom urllib.parse import urlparse, parse_qs\n\n# Carica il JSON da file (oppure puoi usare json.loads() se lo hai come stringa)\nwith open('data.json', 'r', encoding='utf-8') as f:\n    data = json.load(f)\n\n# Funzione per ottenere l'estensione dal content-type\ndef get_extension(content_type):\n    ext = mimetypes.guess_extension(content_type)\n    return ext.lstrip('.') if ext else 'jpg'  # default a jpg se non riconosciuto\n\n# Funzione per estrarre un ID dall'URL (es. da ?id=abc123)\ndef extract_id_from_url(url):\n    parsed = urlparse(url)\n    query = parse_qs(parsed.query)\n    return query.get('id', [os.path.basename(parsed.path).split('.')[0]])[0]\n\n# Cicla sulle categorie\nfor category, items in data.items():\n    os.makedirs(category, exist_ok=True)\n\n    for item in items:\n        image_url = item.get('image')\n        author = item.get('author', 'Unknown')\n        source = item.get('source', 'Unknown')\n\n        try:\n            response = requests.get(image_url, timeout=10)\n            response.raise_for_status()\n\n            content_type = response.headers.get('Content-Type', '')\n            extension = get_extension(content_type)\n            image_id = extract_id_from_url(image_url)\n\n            image_filename = f\"{image_id}.{extension}\"\n            image_path = os.path.join(category, image_filename)\n\n            # Salva l'immagine\n            with open(image_path, 'wb') as img_file:\n                img_file.write(response.content)\n\n            # Crea il file INI\n            ini_filename = f\"{image_id}.ini\"\n            ini_path = os.path.join(category, ini_filename)\n\n            with open(ini_path, 'w', encoding='utf-8') as ini_file:\n                ini_file.write(f\"link = {image_url}\\n\")\n                ini_file.write(f\"author = {author}\\n\")\n                ini_file.write(f\"description = {source}\\n\")\n\n            print(f\"✓ Salvato: {image_filename} e {ini_filename} in '{category}'\")\n\n        except Exception as e:\n            print(f\"⚠️ Errore con l'immagine '{image_url}': {e}\")\n```\n**📌 Note**\n Assicurati di avere il file `data.json` nello stesso percorso dello script, oppure modifica il path.\n Lo script usa `requests`, quindi se non lo hai installato, puoi farlo con `pip install requests`.\n L’ID viene estratto dall’URL usando il parametro `id`, oppure dal nome del file se non presente.\nSe vuoi estendere lo script per gestire logging, retry automatici o validazioni più robuste, posso aiutarti anche con quello. Vuoi aggiungere qualcosa come supporto per immagini duplicate o verifica dell’autore?\n", "nodes":[{"type":"CODE_BLOCK", "codeBlockNode":{"language":"javascript", "content":"const getImages = () => Array.from(document.querySelectorAll('div[data-image-url] > img[src][data-iml]')).map(img => ({ image: img.src.split('&')[0], author: img.parentElement.dataset.authorName, source: img.parentElement.dataset.authorUrl }));\nconst images = {};\nimages.Astratta = getImages()\nimages.Arte = getImages()\nimages.Affari = getImages()\nimages.Ricorrenze = getImages()\nimages.Intrattenimento = getImages()\nimages.Famiglia = getImages()\nimages.Cibi_e_bevande = getImages()\nimages.Salute_e_bellezza = getImages()\nimages.Hobby_e_artigianato = getImages()\nimages.Casa_e_giardino = getImages()\nimages.Natura = getImages()\nimages.Motivi = getImages()\nimages.Ricreazione = getImages()\nimages.Scienza = getImages()\nimages.Shopping = getImages()\nimages.Tecnologia = getImages()\nimages.Trame = getImages()\nimages.Trasparente = getImages()\nimages.Viaggi = getImages()\nJSON.stringify(images)"}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"💖💣, [08/09/2025 12:45]"}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"Scrivi uno script Python per parsare un JSON del seguente formato:"}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"CODE_BLOCK", "codeBlockNode":{"language":"json", "content":"{\n  \"Categoria\": [\n    {\n      \"image\": \"https://themes.googleusercontent.com/image?id=...\",\n      \"author\": \"...\",\n      \"source\": \"...\"\n    },\n    ...\n  ],\n  ...\n}"}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"Per ogni categoria crea una cartella. Per ogni elemento di ciascuna categoria, scarica l'immagine dall'URL \"image\" e salvala nella cartella con il formato del nome \"{id}.{estensione}\", l'estensione è determinata dal content-type della risposta HTTP. Per ogni immagine, crea nella stessa directory un file di testo INI con lo stesso nome dell'immagine (\"{id}.ini\"), e scrivici dentro:"}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"CODE_BLOCK", "codeBlockNode":{"language":"ini", "content":"link = {image}\nauthor = {author}\ndescription = {source}"}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"Microsoft Copilot, [08/09/2025 12:45]"}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"Ecco uno script Python che fa esattamente ciò che hai descritto: legge un JSON strutturato per categorie, crea una cartella per ciascuna categoria, scarica le immagini, determina l'estensione dal content-type, e genera un file "}}, {"type":"CODE", "codeNode":{"content":".ini"}}, {"type":"TEXT", "textNode":{"content":" associato a ogni immagine."}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"BOLD", "boldNode":{"symbol":"*", "children":[{"type":"TEXT", "textNode":{"content":"🐍 Script Python"}}]}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"CODE_BLOCK", "codeBlockNode":{"language":"python", "content":"import os\nimport json\nimport requests\nimport mimetypes\nfrom urllib.parse import urlparse, parse_qs\n\n# Carica il JSON da file (oppure puoi usare json.loads() se lo hai come stringa)\nwith open('data.json', 'r', encoding='utf-8') as f:\n    data = json.load(f)\n\n# Funzione per ottenere l'estensione dal content-type\ndef get_extension(content_type):\n    ext = mimetypes.guess_extension(content_type)\n    return ext.lstrip('.') if ext else 'jpg'  # default a jpg se non riconosciuto\n\n# Funzione per estrarre un ID dall'URL (es. da ?id=abc123)\ndef extract_id_from_url(url):\n    parsed = urlparse(url)\n    query = parse_qs(parsed.query)\n    return query.get('id', [os.path.basename(parsed.path).split('.')[0]])[0]\n\n# Cicla sulle categorie\nfor category, items in data.items():\n    os.makedirs(category, exist_ok=True)\n\n    for item in items:\n        image_url = item.get('image')\n        author = item.get('author', 'Unknown')\n        source = item.get('source', 'Unknown')\n\n        try:\n            response = requests.get(image_url, timeout=10)\n            response.raise_for_status()\n\n            content_type = response.headers.get('Content-Type', '')\n            extension = get_extension(content_type)\n            image_id = extract_id_from_url(image_url)\n\n            image_filename = f\"{image_id}.{extension}\"\n            image_path = os.path.join(category, image_filename)\n\n            # Salva l'immagine\n            with open(image_path, 'wb') as img_file:\n                img_file.write(response.content)\n\n            # Crea il file INI\n            ini_filename = f\"{image_id}.ini\"\n            ini_path = os.path.join(category, ini_filename)\n\n            with open(ini_path, 'w', encoding='utf-8') as ini_file:\n                ini_file.write(f\"link = {image_url}\\n\")\n                ini_file.write(f\"author = {author}\\n\")\n                ini_file.write(f\"description = {source}\\n\")\n\n            print(f\"✓ Salvato: {image_filename} e {ini_filename} in '{category}'\")\n\n        except Exception as e:\n            print(f\"⚠️ Errore con l'immagine '{image_url}': {e}\")"}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"BOLD", "boldNode":{"symbol":"*", "children":[{"type":"TEXT", "textNode":{"content":"📌 Note"}}]}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":" Assicurati di avere il file "}}, {"type":"CODE", "codeNode":{"content":"data.json"}}, {"type":"TEXT", "textNode":{"content":" nello stesso percorso dello script, oppure modifica il path."}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":" Lo script usa "}}, {"type":"CODE", "codeNode":{"content":"requests"}}, {"type":"TEXT", "textNode":{"content":", quindi se non lo hai installato, puoi farlo con "}}, {"type":"CODE", "codeNode":{"content":"pip install requests"}}, {"type":"TEXT", "textNode":{"content":"."}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":" L’ID viene estratto dall’URL usando il parametro "}}, {"type":"CODE", "codeNode":{"content":"id"}}, {"type":"TEXT", "textNode":{"content":", oppure dal nome del file se non presente."}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}, {"type":"PARAGRAPH", "paragraphNode":{"children":[{"type":"TEXT", "textNode":{"content":"Se vuoi estendere lo script per gestire logging, retry automatici o validazioni più robuste, posso aiutarti anche con quello. Vuoi aggiungere qualcosa come supporto per immagini duplicate o verifica dell’autore?"}}]}}, {"type":"LINE_BREAK", "lineBreakNode":{}}], "visibility":"PUBLIC", "tags":[], "pinned":false, "resources":[{"name":"resources/23", "uid":"EXkacEj8bJ8gcH9xx5EmVV", "createTime":"2025-09-08T16:47:55Z", "filename":"Blogger.json", "content":"", "externalLink":"", "type":"application/json", "size":"97902", "memo":"memos/1038"}], "relations":[], "reactions":[], "property":{"tags":[], "hasLink":false, "hasTaskList":false, "hasCode":true, "hasIncompleteTasks":false}, "snippet":"const getImages = () => Array.from(document.querySelectorAll('div[data-image-url] > img[src][data-im..."}