Chartes-TNAH / imago-commentaires

0 stars 3 forks source link

Récupérer données d'un Json #12

Open Caillibot opened 6 years ago

Caillibot commented 6 years ago

Début de requête, pour remonter les items de la liste Json d'un manifeste Harvard ART Museum : ex : import requests

req = requests.get("https://iiif.harvardartmuseums.org/manifests/object/336788") print(req) print(req.status_code) print(req.headers) print(req.encoding)

print("@context :",req.json()["@context"]) print("@id :",req.json()["@id"]) print("@type :", req.json()["@type"]) print("titre :", req.json()["label"])

print("Métadonnées", req.json()["metadata"][0]["label"], ":", req.json()["metadata"][0]["value"]) print("Métadonnées", req.json()["metadata"][1]["label"], ":", req.json()["metadata"][1]["value"]) print("Métadonnées", req.json()["metadata"][2]["label"], ":", req.json()["metadata"][2]["value"]) print("Métadonnées", req.json()["metadata"][3]["label"], ":", req.json()["metadata"][3]["value"]) print("Métadonnées", req.json()["metadata"][4]["label"], ":", req.json()["metadata"][4]["value"]) print("Métadonnées", req.json()["metadata"][5]["label"], ":", req.json()["metadata"][5]["value"]) print("Métadonnées", req.json()["metadata"][6]["label"], ":", req.json()["metadata"][6]["value"]) print("Métadonnées", req.json()["metadata"][7]["label"], ":", req.json()["metadata"][7]["value"]) print("Métadonnées", req.json()["metadata"][8]["label"], ":", req.json()["metadata"][8]["value"]) print("Rendering@id :", req.json()["rendering"]["@id"]) print("Rendering_format :", req.json()["rendering"]["format"]) print("Renderinglabel :", req.json()["rendering"]["label"]) print("Sequences@id : ", req.json()["sequences"][0]["@id"]) print("Sequences@type :", req.json()["sequences"][0]["@type"]) print("canvases@id :", req.json()["sequences"][0]["canvases"][0]["@id"]) print("canvases_@type :", req.json()["sequences"][0]["canvases"][0]["@type"]) print("canvases_height :", req.json()["sequences"][0]["canvases"][0]["height"]) print("canvases_images0@id :", req.json()["sequences"][0]["canvases"][0]["images"][0]["@id"]) print("canvases_images0@type :", req.json()["sequences"][0]["canvases"][0]["images"][0]["@type"]) print("canvases_images_0_motivation :", req.json()["sequences"][0]["canvases"][0]["images"][0]["motivation"]) print("canvases_images_0_on :", req.json()["sequences"][0]["canvases"][0]["images"][0]["on"]) print("canvases_images_0ressource@id :", req.json()["sequences"][0]["canvases"][0]["images"][0]["resource"]["@id"]) print("canvases_images_0ressource@type :", req.json()["sequences"][0]["canvases"][0]["images"][0]["resource"]["@type"]) print("canvases_images_0_ressource_format :", req.json()["sequences"][0]["canvases"][0]["images"][0]["resource"]["format"]) print("canvases_images_0_ressource_height :", req.json()["sequences"][0]["canvases"][0]["images"][0]["resource"]["height"]) print("canvases_images_0_ressourceservice@context :", req.json()["sequences"][0]["canvases"][0]["images"][0]["resource"]["service"]["@context"]) print("canvases_images_0_ressourceservice@id :", req.json()["sequences"][0]["canvases"][0]["images"][0]["resource"]["service"]["@id"]) print("canvases_images_0_ressource_service_profile :", req.json()["sequences"][0]["canvases"][0]["images"][0]["resource"]["service"]["profile"]) print("canvases_images_0_ressource_width :", req.json()["sequences"][0]["canvases"][0]["images"][0]["resource"]["width"]) print("canvases_label :", req.json()["sequences"][0]["canvases"][0]["label"]) print("canvases_width :", req.json()["sequences"][0]["canvases"][0]["width"]) print("viewingHint :", req.json()["sequences"][0]["viewingHint"]) print("appartenance :", req.json()["within"])

=> A FAIRE :

AnZadykhina commented 6 years ago

premiers pas


def content(url_manifest):

    r = requests.get(url_manifest)
    data = r.json()
    simplified = []

    for item in data["metadata"]:
        try:

            identifier = item["label"]

            simplified.append(identifier)
        except (IndexError, KeyError) as e:
            # no description or scope and content found... skipping...
            pass

    # fetch the next page of data...
    if data.get("links") and data["links"].get("next"):
        simplified += content(data["links"]["next"])
    return simplified

content("http://gallica.bnf.fr/iiif/ark:/12148/btv1b8453687c/manifest.json")```
saroulle commented 6 years ago

Affichage des métadonnées avec requests.get


import requests

#affichage de l'ensemble des métadonnées du manifeste
req = requests.get("http://gallica.bnf.fr/iiif/ark:/12148/btv1b8453687c/manifest.json")

for resultat in req.json()["metadata"]:
    print("{label}" " : ""{valeur}".format(
        label=resultat["label"], 
        valeur=resultat["value"], 
    ))```
Caillibot commented 6 years ago

Code A TESTER pour compléter l'affichage des métadonnées par celui de l'image depuis un manifeste GALLICA : def commentaire(comment_id): import requests

    # On a bien sûr aussi modifié le template pour refléter le changement
    unique_commentaire = Comment.query.get(comment_id)
    utilisateur=User.query.get(unique_commentaire.comment_user_id)
    r = requests.get(unique_commentaire.comment_lien)
    data = r.json()
    simplified = []

    image_url = data["thumbnail"]["@id"]
    return render_template('pages/comment.html', nom='Imaginatiiif',
                           commentaire=unique_commentaire,
                           user=utilisateur,
                           data=data.get('thumbnail'))

    for item in data["metadata"]:
        try:
            identifier = item["label"]

            simplified.append(identifier)

        except:
            error = 'Pas pu récupérer les données'
            data = {}
    return render_template('pages/comment.html', nom='Imaginatiiif',
                           commentaire=unique_commentaire,
                           user=utilisateur,
                           data=data.get('metadata'))
    #return render_template("pages/comment.html",
                           #nom="Imaginatiiif",
                           #commentaire=unique_commentaire,
                           #user=utilisateur)
Caillibot commented 6 years ago

Code permettant de récupérer le titre et les images HD d'un manifeste GALLICA ou Harvard Art Museum (à rajouter au code / Metadata):

import requests

req = requests.get("http://gallica.bnf.fr/iiif/ark:/12148/btv1b8453687c/manifest.json")
manifeste = req.json()

print("titre :", req.json()["label"])
for item in manifeste["sequences"][0]["canvases"]:
    url_image = item["images"][0]["resource"]["@id"]
    print(url_image)
Caillibot commented 6 years ago

Code permettant de faire afficher une (et seulement 1 pour le moment ?!) des images (dont l'url est issue de la requête ci-dessus) d'un manifeste de type Gallica ou Harvard Art Museum dans un terminal : voir comment intégrer (le cas échéant) dans notre site :

import requests

req = requests.get("http://gallica.bnf.fr/iiif/ark:/12148/btv1b8453687c/manifest.json")
manifeste = req.json()

print("titre :", req.json()["label"])

for item in manifeste["sequences"][0]["canvases"]:
    url_image = item["images"][0]["resource"]["@id"]
    print(url_image)

import urllib.request
from tkinter import *
from PIL import Image, ImageTk

# Notre fenêtre principale
w = Tk()
w.title("tkv : visionneuse d'images") # Un titre
w.configure(background='#000000')     # Fond noir

# Un conteneur dans la fenêtre
mainframe = Frame(w)
mainframe.pack(fill=BOTH,expand=True, padx=15, pady=15)

# Téléchargement de l'image
url=url_image
img_path="/tmp/image.jpg"
urllib.request.urlretrieve(url, img_path)

# Ouverture de l'image
image = Image.open(img_path)
# Dimensions de l'écran : 
gap = 100 # marge par rapport aux bords de l'écran
screen_width = w.winfo_screenwidth() - gap
screen_height = w.winfo_screenheight() - gap

if image.width > screen_width : 
    image = image.resize((screen_width, int(image.height * screen_width / image.width)), Image.ANTIALIAS)
if image.height > screen_height :   
    image = image.resize((int(image.width * screen_height / image.height), screen_height), Image.ANTIALIAS)

# Chargement de l'image en mémoire
img = ImageTk.PhotoImage(image)

# Insertion de l'image dans le conteneur.
img_widget = Label(mainframe, image=img)
img_widget.pack()

# Démarrage du programme
w.mainloop()
MPica commented 6 years ago

J'ai l'immense fierté de vous annoncer que grâce aux conseils avisés d'Alexandre j'ai réussi à afficher les différentes images l'une au-dessus de l'autre (avec 300px de large). Je pense qu'il ne reste plus qu'à faire des colonnes pour afficher le commentaire et les métadonnées les uns à côté des autres.

Voici le code que j'ai utilisé :

Dans comment.html

juste sous {% block corps %}

{% if img %}
        {% for lien in img %}
            <div>
               <img src={{lien}}
                    href={{lien}}
                    alt="Image à laquelle est lié le commentaire."
                    width="300"/>
            </div>
        {% endfor %}
    {% endif %}

Dans routes.py (la fonction commentaire complétée) :

def commentaire(comment_id):
    import requests

    # On a bien sûr aussi modifié le template pour refléter le changement
    unique_commentaire = Comment.query.get(comment_id)
    utilisateur=User.query.get(unique_commentaire.comment_user_id)
    r = requests.get(unique_commentaire.comment_lien)
    data = r.json()
    simplified = []
    image = []

    for item in data["metadata"]:
        try:
            identifier = item["label"]
            simplified.append(identifier)

        except:
            error = 'Pas pu récupérer les données'
            data = {}

    for item in data["sequences"][0]["canvases"]:
        try:
            url_image = item["images"][0]["resource"]["@id"]
            image.append(url_image)
        except:
            error = "Pas pu récupérer d'image"
            data = {}
    print(image)
    return render_template('pages/comment.html', nom='Imaginatiiif',
                           commentaire=unique_commentaire,
                           user=utilisateur,
                           data=data.get('metadata'),
                           img = image)

cf PR #23

MPica commented 6 years ago

@Caillibot, est-ce que tu veux quand même creuser la popup ou on ferme l'issue ?

Caillibot commented 6 years ago

Code permettant d'obtenir un affichage des métadonnées de ce type (à adapter pour insertion dans le code de l'application si vous convient : ?): Repository : Bibliothèque nationale de France Provider : Bibliothèque nationale de France Disseminator : Gallica Source Images : http://gallica.bnf.fr/ark:/12148/btv1b8453687c Metadata Source : http://oai.bnf.fr/oai2/OAIHandler?verb=GetRecord&metadataPrefix=oai_dc&identifier=oai:bnf.fr:gallica/ark:/12148/btv1b8453687c Shelfmark : Bibliothèque nationale de France, département Société de Géographie, SG PORTRAIT-2244 Title : [J.W. Powell] / Bradley & Rulofson Date : 1876 Language : anglais Format : ('1 phot.', 'image/jpeg', 'Nombre total de vues : 2') Creator : Bradley & Rulofson (San Francisco, Calif.). Photographe Relation : Notice du catalogue : http://catalogue.bnf.fr/ark:/12148/cb405875184 Type : ('image', 'photographie')

import requests

req = requests.get("http://gallica.bnf.fr/iiif/ark:/12148/btv1b8453687c/manifest.json") manifeste = req.json() simplified = []

for item in manifeste["metadata"]: titre_metaD = item["label"] metaD = item["value"] simplified.append(metaD)

if titre_metaD == "Language":
    resultat = item["value"][1]["@value"]
    print("Language :", resultat)

elif titre_metaD == "Format":
    resultat = item["value"][0]["@value"], item["value"][1]["@value"], item["value"][2]["@value"]
    print("Format :", resultat)

elif titre_metaD == "Type":
        resultat = item["value"][1]["@value"], item["value"][3]["@value"]
        print("Type :", resultat)

else :
    print(titre_metaD, ":", metaD)