Add import edition from inventaire

This commit is contained in:
2026-02-01 21:49:11 +01:00
parent 27a9faf704
commit 464405f5c9
13 changed files with 266 additions and 162 deletions

View File

@@ -2,38 +2,19 @@ package inventaire
import (
"encoding/json"
"math"
"sort"
"net/url"
"strings"
"git.artlef.fr/PersonalLibraryManager/internal/callapiutils"
)
type InventaireEditionResult struct {
Results []InventaireEditionResultBook `json:"results"`
Count int64 `json:"count"`
}
type InventaireEditionResultBook struct {
Id string `json:"uri"`
Title string `json:"title"`
ISBN string `json:"isbn"`
Publisher string `json:"publisher"`
ReleaseDate string `json:"date"`
Image string `json:"image"`
Lang string `json:"lang"`
}
type inventaireReverseClaimsResult struct {
Uris []string `json:"uris"`
}
type inventaireEditionQueryResult struct {
Entities []inventaireEditionQueryEntity
}
type inventaireEditionQueryEntity struct {
WdId string
WorkId string
EditionId string
Title string
ISBN string
@@ -66,6 +47,10 @@ func (i *inventaireEditionQueryResult) UnmarshalJSON(b []byte) error {
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
@@ -95,6 +80,7 @@ func (i *inventaireEditionQueryResult) UnmarshalJSON(b []byte) error {
}
i.Entities = append(i.Entities, inventaireEditionQueryEntity{
WdId: parsedEntity.WdId,
WorkId: workId,
EditionId: editionId,
Title: label,
ISBN: isbn,
@@ -125,80 +111,26 @@ func parseStringArrayFieldInJsonRaw(jsonRawMap map[string]json.RawMessage, key s
return s, err
}
func CallInventaireEdition(inventaireId string, lang string, limit int, offset int) (InventaireEditionResult, error) {
var queryResult InventaireEditionResult
uris, err := callInventaireUris(inventaireId)
func callInventaireEditionEntities(uris []string) (inventaireEditionQueryResult, error) {
var queryResult inventaireEditionQueryResult
u, err := getInventaireEditionEntitiesUri(strings.Join(uris, "|"))
if err != nil {
return queryResult, err
}
queryResult.Count = int64(len(uris.Uris))
sort.Strings(uris.Uris)
limitedUris := uris.Uris
if limit != 0 {
l := len(uris.Uris)
startIndex := int(math.Min(float64(offset), float64(l)))
endIndex := int(math.Min(float64(limit+offset), float64(l)))
limitedUris = uris.Uris[startIndex:endIndex]
}
editionEntities, err := callInventaireEditionEntities(limitedUris)
if err != nil {
return queryResult, err
}
sortedEntities := editionEntities.Entities
sort.Slice(sortedEntities, func(i, j int) bool {
return sortedEntities[i].Uri < sortedEntities[j].Uri
})
for _, entity := range sortedEntities {
publisher := ""
if entity.EditionId != "" {
publisher, err = callInventairePublisherGetName(entity.EditionId, lang)
if err != nil {
return queryResult, err
}
}
queryResult.Results = append(queryResult.Results, InventaireEditionResultBook{
Id: entity.Uri,
ISBN: entity.ISBN,
Title: entity.Title,
ReleaseDate: entity.ReleaseDate,
Image: entity.Image,
Publisher: publisher,
Lang: entity.Lang,
})
}
return queryResult, err
}
func callInventaireUris(inventaireId string) (inventaireReverseClaimsResult, error) {
var queryResult inventaireReverseClaimsResult
u, err := computeInventaireApiUrl("entities")
if err != nil {
return queryResult, err
}
callapiutils.AddQueryParam(u, "action", "reverse-claims")
callapiutils.AddQueryParam(u, "property", "wdt:P629")
callapiutils.AddQueryParam(u, "value", inventaireId)
err = callapiutils.FetchAndParseResult(u, &queryResult)
return queryResult, err
}
func callInventaireEditionEntities(uris []string) (inventaireEditionQueryResult, error) {
var queryResult inventaireEditionQueryResult
func getInventaireEditionEntitiesUri(uris string) (*url.URL, error) {
u, err := computeInventaireApiUrl("entities")
if err != nil {
return queryResult, err
return u, err
}
callapiutils.AddQueryParam(u, "action", "by-uris")
callapiutils.AddQueryParam(u, "uris", strings.Join(uris, "|"))
callapiutils.AddQueryParam(u, "uris", uris)
err = callapiutils.FetchAndParseResult(u, &queryResult)
return queryResult, err
return u, err
}
type inventaireEditionPublisherResult struct {