180 lines
4.4 KiB
Go
180 lines
4.4 KiB
Go
package inventaire
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"git.artlef.fr/PersonalLibraryManager/internal/callapiutils"
|
|
)
|
|
|
|
type inventaireEditionQueryResult struct {
|
|
Entities []inventaireEditionQueryEntity
|
|
}
|
|
|
|
type inventaireEditionQueryEntity struct {
|
|
WdId string
|
|
WorkId string
|
|
EditionId string
|
|
Title string
|
|
ISBN string
|
|
Uri string
|
|
Image string
|
|
Lang string
|
|
ReleaseDate string
|
|
}
|
|
|
|
func (i *inventaireEditionQueryResult) UnmarshalJSON(b []byte) error {
|
|
var parsed struct {
|
|
Entities map[string]json.RawMessage `json:"entities"`
|
|
}
|
|
err := json.Unmarshal(b, &parsed)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, entity := range parsed.Entities {
|
|
var parsedEntity struct {
|
|
WdId string `json:"wdId"`
|
|
Labels map[string]json.RawMessage `json:"labels"`
|
|
Type string `json:"type"`
|
|
Uri string `json:"uri"`
|
|
Image map[string]json.RawMessage `json:"image"`
|
|
Lang string `json:"originalLang"`
|
|
Claims map[string]json.RawMessage `json:"claims"`
|
|
}
|
|
err = json.Unmarshal(entity, &parsedEntity)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if parsedEntity.Type == "edition" {
|
|
workId, err := parseStringArrayFieldInJsonRaw(parsedEntity.Claims, "wdt:P629")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
editionId, err := parseStringArrayFieldInJsonRaw(parsedEntity.Claims, "wdt:P123")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
releaseDate, err := parseStringArrayFieldInJsonRaw(parsedEntity.Claims, "wdt:P577")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
isbn, err := parseStringArrayFieldInJsonRaw(parsedEntity.Claims, "wdt:P212")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
label, err := findLangageField(parsedEntity.Labels, "fromclaims")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
image := ""
|
|
imageFieldToParse, ok := parsedEntity.Image["url"]
|
|
if ok {
|
|
err := json.Unmarshal(imageFieldToParse, &image)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if image != "" {
|
|
image = GetBaseInventaireUrl() + image
|
|
}
|
|
}
|
|
i.Entities = append(i.Entities, inventaireEditionQueryEntity{
|
|
WdId: parsedEntity.WdId,
|
|
WorkId: workId,
|
|
EditionId: editionId,
|
|
Title: label,
|
|
ISBN: isbn,
|
|
Uri: parsedEntity.Uri,
|
|
Image: image,
|
|
Lang: parsedEntity.Lang,
|
|
ReleaseDate: releaseDate,
|
|
})
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func parseStringArrayFieldInJsonRaw(jsonRawMap map[string]json.RawMessage, key string) (string, error) {
|
|
fieldToParse, ok := jsonRawMap[key]
|
|
if !ok {
|
|
return "", nil
|
|
}
|
|
var fieldArray []string
|
|
s := ""
|
|
err := json.Unmarshal(fieldToParse, &fieldArray)
|
|
if err != nil {
|
|
return s, err
|
|
}
|
|
if len(fieldArray) > 0 {
|
|
s = fieldArray[0]
|
|
}
|
|
return s, err
|
|
}
|
|
|
|
func callInventaireEditionEntities(uris []string) (inventaireEditionQueryResult, error) {
|
|
var queryResult inventaireEditionQueryResult
|
|
u, err := getInventaireEditionEntitiesUri(strings.Join(uris, "|"))
|
|
if err != nil {
|
|
return queryResult, err
|
|
}
|
|
err = callapiutils.FetchAndParseResult(u, &queryResult)
|
|
return queryResult, err
|
|
}
|
|
|
|
func getInventaireEditionEntitiesUri(uris string) (*url.URL, error) {
|
|
u, err := computeInventaireApiUrl("entities")
|
|
if err != nil {
|
|
return u, err
|
|
}
|
|
|
|
callapiutils.AddQueryParam(u, "action", "by-uris")
|
|
callapiutils.AddQueryParam(u, "uris", uris)
|
|
|
|
return u, err
|
|
}
|
|
|
|
type inventaireEditionPublisherResult struct {
|
|
Lang string
|
|
Label string
|
|
}
|
|
|
|
func (i *inventaireEditionPublisherResult) UnmarshalJSON(b []byte) error {
|
|
var parsed struct {
|
|
Entities map[string]json.RawMessage
|
|
}
|
|
err := json.Unmarshal(b, &parsed)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, entity := range parsed.Entities {
|
|
var publisherEntity struct {
|
|
Type string `json:"type"`
|
|
Labels map[string]json.RawMessage `json:"labels"`
|
|
}
|
|
err := json.Unmarshal(entity, &publisherEntity)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
label, _ := findLangageField(publisherEntity.Labels, i.Lang)
|
|
i.Label = label
|
|
}
|
|
return err
|
|
}
|
|
|
|
func callInventairePublisherGetName(editionId string, lang string) (string, error) {
|
|
var queryResult inventaireEditionPublisherResult
|
|
u, err := computeInventaireApiUrl("entities")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
queryResult.Lang = lang
|
|
|
|
callapiutils.AddQueryParam(u, "action", "by-uris")
|
|
callapiutils.AddQueryParam(u, "uris", editionId)
|
|
callapiutils.AddQueryParam(u, "attributes", "info|labels")
|
|
|
|
err = callapiutils.FetchAndParseResult(u, &queryResult)
|
|
return queryResult.Label, err
|
|
}
|