@zivue/zuuid 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/README.md +210 -227
  3. package/dist/client.d.ts +16 -3
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js +22 -0
  6. package/dist/entity.d.ts.map +1 -1
  7. package/dist/entity.js +9 -0
  8. package/dist/index.d.ts +11 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +11 -0
  11. package/dist/providers/comicvine/character.d.ts +2 -0
  12. package/dist/providers/comicvine/character.d.ts.map +1 -0
  13. package/dist/providers/comicvine/character.js +1 -0
  14. package/dist/providers/comicvine/constants.d.ts +8 -0
  15. package/dist/providers/comicvine/constants.d.ts.map +1 -0
  16. package/dist/providers/comicvine/constants.js +7 -0
  17. package/dist/providers/comicvine/index.d.ts +9 -0
  18. package/dist/providers/comicvine/index.d.ts.map +1 -0
  19. package/dist/providers/comicvine/index.js +8 -0
  20. package/dist/providers/comicvine/issue.d.ts +2 -0
  21. package/dist/providers/comicvine/issue.d.ts.map +1 -0
  22. package/dist/providers/comicvine/issue.js +1 -0
  23. package/dist/providers/comicvine/person.d.ts +2 -0
  24. package/dist/providers/comicvine/person.d.ts.map +1 -0
  25. package/dist/providers/comicvine/person.js +1 -0
  26. package/dist/providers/comicvine/publisher.d.ts +2 -0
  27. package/dist/providers/comicvine/publisher.d.ts.map +1 -0
  28. package/dist/providers/comicvine/publisher.js +1 -0
  29. package/dist/providers/comicvine/story-arc.d.ts +2 -0
  30. package/dist/providers/comicvine/story-arc.d.ts.map +1 -0
  31. package/dist/providers/comicvine/story-arc.js +1 -0
  32. package/dist/providers/comicvine/transform.d.ts +4 -0
  33. package/dist/providers/comicvine/transform.d.ts.map +1 -0
  34. package/dist/providers/comicvine/transform.js +63 -0
  35. package/dist/providers/comicvine/volume.d.ts +2 -0
  36. package/dist/providers/comicvine/volume.d.ts.map +1 -0
  37. package/dist/providers/comicvine/volume.js +1 -0
  38. package/dist/providers/common.d.ts +23 -0
  39. package/dist/providers/common.d.ts.map +1 -0
  40. package/dist/providers/common.js +132 -0
  41. package/dist/providers/gamesdb/constants.d.ts +4 -0
  42. package/dist/providers/gamesdb/constants.d.ts.map +1 -0
  43. package/dist/providers/gamesdb/constants.js +3 -0
  44. package/dist/providers/gamesdb/game.d.ts +7 -0
  45. package/dist/providers/gamesdb/game.d.ts.map +1 -0
  46. package/dist/providers/gamesdb/game.js +59 -0
  47. package/dist/providers/gamesdb/index.d.ts +4 -0
  48. package/dist/providers/gamesdb/index.d.ts.map +1 -0
  49. package/dist/providers/gamesdb/index.js +3 -0
  50. package/dist/providers/gamesdb/platform.d.ts +4 -0
  51. package/dist/providers/gamesdb/platform.d.ts.map +1 -0
  52. package/dist/providers/gamesdb/platform.js +23 -0
  53. package/dist/providers/jikan/anime.d.ts +2 -0
  54. package/dist/providers/jikan/anime.d.ts.map +1 -0
  55. package/dist/providers/jikan/anime.js +1 -0
  56. package/dist/providers/jikan/character.d.ts +2 -0
  57. package/dist/providers/jikan/character.d.ts.map +1 -0
  58. package/dist/providers/jikan/character.js +1 -0
  59. package/dist/providers/jikan/constants.d.ts +8 -0
  60. package/dist/providers/jikan/constants.d.ts.map +1 -0
  61. package/dist/providers/jikan/constants.js +7 -0
  62. package/dist/providers/jikan/index.d.ts +9 -0
  63. package/dist/providers/jikan/index.d.ts.map +1 -0
  64. package/dist/providers/jikan/index.js +8 -0
  65. package/dist/providers/jikan/magazine.d.ts +2 -0
  66. package/dist/providers/jikan/magazine.d.ts.map +1 -0
  67. package/dist/providers/jikan/magazine.js +1 -0
  68. package/dist/providers/jikan/manga.d.ts +2 -0
  69. package/dist/providers/jikan/manga.d.ts.map +1 -0
  70. package/dist/providers/jikan/manga.js +1 -0
  71. package/dist/providers/jikan/person.d.ts +2 -0
  72. package/dist/providers/jikan/person.d.ts.map +1 -0
  73. package/dist/providers/jikan/person.js +1 -0
  74. package/dist/providers/jikan/producer.d.ts +2 -0
  75. package/dist/providers/jikan/producer.d.ts.map +1 -0
  76. package/dist/providers/jikan/producer.js +1 -0
  77. package/dist/providers/jikan/transform.d.ts +8 -0
  78. package/dist/providers/jikan/transform.d.ts.map +1 -0
  79. package/dist/providers/jikan/transform.js +125 -0
  80. package/dist/providers/musicbrainz/artist.d.ts +4 -0
  81. package/dist/providers/musicbrainz/artist.d.ts.map +1 -0
  82. package/dist/providers/musicbrainz/artist.js +28 -0
  83. package/dist/providers/musicbrainz/constants.d.ts +10 -0
  84. package/dist/providers/musicbrainz/constants.d.ts.map +1 -0
  85. package/dist/providers/musicbrainz/constants.js +9 -0
  86. package/dist/providers/musicbrainz/helpers.d.ts +15 -0
  87. package/dist/providers/musicbrainz/helpers.d.ts.map +1 -0
  88. package/dist/providers/musicbrainz/helpers.js +71 -0
  89. package/dist/providers/musicbrainz/index.d.ts +8 -0
  90. package/dist/providers/musicbrainz/index.d.ts.map +1 -0
  91. package/dist/providers/musicbrainz/index.js +7 -0
  92. package/dist/providers/musicbrainz/label.d.ts +4 -0
  93. package/dist/providers/musicbrainz/label.d.ts.map +1 -0
  94. package/dist/providers/musicbrainz/label.js +28 -0
  95. package/dist/providers/musicbrainz/recording.d.ts +4 -0
  96. package/dist/providers/musicbrainz/recording.d.ts.map +1 -0
  97. package/dist/providers/musicbrainz/recording.js +41 -0
  98. package/dist/providers/musicbrainz/release-group.d.ts +7 -0
  99. package/dist/providers/musicbrainz/release-group.d.ts.map +1 -0
  100. package/dist/providers/musicbrainz/release-group.js +28 -0
  101. package/dist/providers/musicbrainz/release.d.ts +7 -0
  102. package/dist/providers/musicbrainz/release.d.ts.map +1 -0
  103. package/dist/providers/musicbrainz/release.js +50 -0
  104. package/dist/providers/musicbrainz/work.d.ts +4 -0
  105. package/dist/providers/musicbrainz/work.d.ts.map +1 -0
  106. package/dist/providers/musicbrainz/work.js +40 -0
  107. package/dist/providers/openfoodfacts/constants.d.ts +3 -0
  108. package/dist/providers/openfoodfacts/constants.d.ts.map +1 -0
  109. package/dist/providers/openfoodfacts/constants.js +2 -0
  110. package/dist/providers/openfoodfacts/index.d.ts +3 -0
  111. package/dist/providers/openfoodfacts/index.d.ts.map +1 -0
  112. package/dist/providers/openfoodfacts/index.js +2 -0
  113. package/dist/providers/openfoodfacts/product.d.ts +4 -0
  114. package/dist/providers/openfoodfacts/product.d.ts.map +1 -0
  115. package/dist/providers/openfoodfacts/product.js +29 -0
  116. package/dist/providers/openlibrary/author.d.ts +65 -0
  117. package/dist/providers/openlibrary/author.d.ts.map +1 -0
  118. package/dist/providers/openlibrary/author.js +228 -0
  119. package/dist/providers/openlibrary/book.d.ts +138 -0
  120. package/dist/providers/openlibrary/book.d.ts.map +1 -0
  121. package/dist/providers/openlibrary/book.js +535 -0
  122. package/dist/providers/openlibrary/client.d.ts +22 -0
  123. package/dist/providers/openlibrary/client.d.ts.map +1 -0
  124. package/dist/providers/openlibrary/client.js +61 -0
  125. package/dist/providers/openlibrary/constants.d.ts +4 -0
  126. package/dist/providers/openlibrary/constants.d.ts.map +1 -0
  127. package/dist/providers/openlibrary/constants.js +3 -0
  128. package/dist/providers/openlibrary/index.d.ts +6 -0
  129. package/dist/providers/openlibrary/index.d.ts.map +1 -0
  130. package/dist/providers/openlibrary/index.js +5 -0
  131. package/dist/providers/openlibrary/types.d.ts +23 -0
  132. package/dist/providers/openlibrary/types.d.ts.map +1 -0
  133. package/dist/providers/openlibrary/types.js +1 -0
  134. package/dist/providers/openstreetmap/constants.d.ts +6 -0
  135. package/dist/providers/openstreetmap/constants.d.ts.map +1 -0
  136. package/dist/providers/openstreetmap/constants.js +5 -0
  137. package/dist/providers/openstreetmap/index.d.ts +4 -0
  138. package/dist/providers/openstreetmap/index.d.ts.map +1 -0
  139. package/dist/providers/openstreetmap/index.js +3 -0
  140. package/dist/providers/openstreetmap/place.d.ts +4 -0
  141. package/dist/providers/openstreetmap/place.d.ts.map +1 -0
  142. package/dist/providers/openstreetmap/place.js +65 -0
  143. package/dist/providers/openstreetmap/venue.d.ts +2 -0
  144. package/dist/providers/openstreetmap/venue.d.ts.map +1 -0
  145. package/dist/providers/openstreetmap/venue.js +1 -0
  146. package/dist/providers/podcast/constants.d.ts +3 -0
  147. package/dist/providers/podcast/constants.d.ts.map +1 -0
  148. package/dist/providers/podcast/constants.js +2 -0
  149. package/dist/providers/podcast/index.d.ts +3 -0
  150. package/dist/providers/podcast/index.d.ts.map +1 -0
  151. package/dist/providers/podcast/index.js +2 -0
  152. package/dist/providers/podcast/podcast.d.ts +4 -0
  153. package/dist/providers/podcast/podcast.d.ts.map +1 -0
  154. package/dist/providers/podcast/podcast.js +30 -0
  155. package/dist/providers/setlistfm/artist.d.ts +2 -0
  156. package/dist/providers/setlistfm/artist.d.ts.map +1 -0
  157. package/dist/providers/setlistfm/artist.js +1 -0
  158. package/dist/providers/setlistfm/constants.d.ts +5 -0
  159. package/dist/providers/setlistfm/constants.d.ts.map +1 -0
  160. package/dist/providers/setlistfm/constants.js +4 -0
  161. package/dist/providers/setlistfm/index.d.ts +6 -0
  162. package/dist/providers/setlistfm/index.d.ts.map +1 -0
  163. package/dist/providers/setlistfm/index.js +5 -0
  164. package/dist/providers/setlistfm/setlist.d.ts +2 -0
  165. package/dist/providers/setlistfm/setlist.d.ts.map +1 -0
  166. package/dist/providers/setlistfm/setlist.js +1 -0
  167. package/dist/providers/setlistfm/transform.d.ts +7 -0
  168. package/dist/providers/setlistfm/transform.d.ts.map +1 -0
  169. package/dist/providers/setlistfm/transform.js +122 -0
  170. package/dist/providers/setlistfm/venue.d.ts +2 -0
  171. package/dist/providers/setlistfm/venue.d.ts.map +1 -0
  172. package/dist/providers/setlistfm/venue.js +1 -0
  173. package/dist/providers/ticketmaster/attraction.d.ts +2 -0
  174. package/dist/providers/ticketmaster/attraction.d.ts.map +1 -0
  175. package/dist/providers/ticketmaster/attraction.js +1 -0
  176. package/dist/providers/ticketmaster/constants.d.ts +5 -0
  177. package/dist/providers/ticketmaster/constants.d.ts.map +1 -0
  178. package/dist/providers/ticketmaster/constants.js +4 -0
  179. package/dist/providers/ticketmaster/event.d.ts +2 -0
  180. package/dist/providers/ticketmaster/event.d.ts.map +1 -0
  181. package/dist/providers/ticketmaster/event.js +1 -0
  182. package/dist/providers/ticketmaster/index.d.ts +6 -0
  183. package/dist/providers/ticketmaster/index.d.ts.map +1 -0
  184. package/dist/providers/ticketmaster/index.js +5 -0
  185. package/dist/providers/ticketmaster/transform.d.ts +7 -0
  186. package/dist/providers/ticketmaster/transform.d.ts.map +1 -0
  187. package/dist/providers/ticketmaster/transform.js +89 -0
  188. package/dist/providers/ticketmaster/venue.d.ts +2 -0
  189. package/dist/providers/ticketmaster/venue.d.ts.map +1 -0
  190. package/dist/providers/ticketmaster/venue.js +1 -0
  191. package/dist/providers/wger/constants.d.ts +4 -0
  192. package/dist/providers/wger/constants.d.ts.map +1 -0
  193. package/dist/providers/wger/constants.js +3 -0
  194. package/dist/providers/wger/equipment.d.ts +4 -0
  195. package/dist/providers/wger/equipment.d.ts.map +1 -0
  196. package/dist/providers/wger/equipment.js +22 -0
  197. package/dist/providers/wger/exercise.d.ts +4 -0
  198. package/dist/providers/wger/exercise.d.ts.map +1 -0
  199. package/dist/providers/wger/exercise.js +42 -0
  200. package/dist/providers/wger/index.d.ts +4 -0
  201. package/dist/providers/wger/index.d.ts.map +1 -0
  202. package/dist/providers/wger/index.js +3 -0
  203. package/package.json +201 -5
@@ -0,0 +1,23 @@
1
+ import { addAlias, addDescription, addDetail, addMedia, addTag, baseDataFromSource, finalizeData, objectPayload, stringField, valueAsString } from "../common.js";
2
+ import { GAMESDB_PLATFORM_CATEGORY, GAMESDB_PROVIDER } from "./constants.js";
3
+ export async function transformGamesDbPlatform(source) {
4
+ if (source.source.provider !== GAMESDB_PROVIDER || source.source.category !== GAMESDB_PLATFORM_CATEGORY) {
5
+ throw new Error(`unsupported GamesDB source: ${source.source.provider}:${source.source.category}`);
6
+ }
7
+ const payload = objectPayload(source.payload);
8
+ const id = source.source.externalId.trim() || valueAsString(payload.id);
9
+ const title = stringField(payload, "name") ?? stringField(payload, "platform");
10
+ if (!id)
11
+ throw new Error("missing required GamesDB platform field: id");
12
+ if (!title)
13
+ throw new Error("missing required GamesDB platform field: name");
14
+ const data = await baseDataFromSource(source, GAMESDB_PROVIDER, GAMESDB_PLATFORM_CATEGORY, GAMESDB_PLATFORM_CATEGORY, id, title);
15
+ addAlias(data, title, "title", true, GAMESDB_PROVIDER);
16
+ addDescription(data, GAMESDB_PROVIDER, stringField(payload, "overview") ?? stringField(payload, "description"));
17
+ for (const key of ["manufacturer", "developer", "release_date", "cpu", "memory", "graphics", "sound", "display"])
18
+ addDetail(data, GAMESDB_PROVIDER, key, valueAsString(payload[key]));
19
+ addMedia(data, GAMESDB_PROVIDER, stringField(payload, "icon") ?? stringField(payload, "image") ?? stringField(payload, "console"), "image");
20
+ addTag(data, "platform");
21
+ addTag(data, "game");
22
+ return finalizeData(data, source);
23
+ }
@@ -0,0 +1,2 @@
1
+ export { transformJikanTitle as transformJikanAnime } from "./transform.js";
2
+ //# sourceMappingURL=anime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/anime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { transformJikanTitle as transformJikanAnime } from "./transform.js";
@@ -0,0 +1,2 @@
1
+ export { transformJikanPersonish as transformJikanCharacter } from "./transform.js";
2
+ //# sourceMappingURL=character.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/character.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,IAAI,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { transformJikanPersonish as transformJikanCharacter } from "./transform.js";
@@ -0,0 +1,8 @@
1
+ export declare const JIKAN_PROVIDER = "jikan";
2
+ export declare const JIKAN_ANIME_CATEGORY = "anime";
3
+ export declare const JIKAN_MANGA_CATEGORY = "manga";
4
+ export declare const JIKAN_CHARACTER_CATEGORY = "character";
5
+ export declare const JIKAN_PERSON_CATEGORY = "person";
6
+ export declare const JIKAN_PRODUCER_CATEGORY = "producer";
7
+ export declare const JIKAN_MAGAZINE_CATEGORY = "magazine";
8
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAC5C,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAC5C,eAAO,MAAM,wBAAwB,cAAc,CAAC;AACpD,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAC9C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAClD,eAAO,MAAM,uBAAuB,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const JIKAN_PROVIDER = "jikan";
2
+ export const JIKAN_ANIME_CATEGORY = "anime";
3
+ export const JIKAN_MANGA_CATEGORY = "manga";
4
+ export const JIKAN_CHARACTER_CATEGORY = "character";
5
+ export const JIKAN_PERSON_CATEGORY = "person";
6
+ export const JIKAN_PRODUCER_CATEGORY = "producer";
7
+ export const JIKAN_MAGAZINE_CATEGORY = "magazine";
@@ -0,0 +1,9 @@
1
+ export * from "./anime.js";
2
+ export * from "./character.js";
3
+ export * from "./constants.js";
4
+ export * from "./magazine.js";
5
+ export * from "./manga.js";
6
+ export * from "./person.js";
7
+ export * from "./producer.js";
8
+ export * from "./transform.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./anime.js";
2
+ export * from "./character.js";
3
+ export * from "./constants.js";
4
+ export * from "./magazine.js";
5
+ export * from "./manga.js";
6
+ export * from "./person.js";
7
+ export * from "./producer.js";
8
+ export * from "./transform.js";
@@ -0,0 +1,2 @@
1
+ export { transformJikanMagazine } from "./transform.js";
2
+ //# sourceMappingURL=magazine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magazine.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/magazine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { transformJikanMagazine } from "./transform.js";
@@ -0,0 +1,2 @@
1
+ export { transformJikanTitle as transformJikanManga } from "./transform.js";
2
+ //# sourceMappingURL=manga.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manga.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/manga.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { transformJikanTitle as transformJikanManga } from "./transform.js";
@@ -0,0 +1,2 @@
1
+ export { transformJikanPersonish as transformJikanPerson } from "./transform.js";
2
+ //# sourceMappingURL=person.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"person.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/person.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { transformJikanPersonish as transformJikanPerson } from "./transform.js";
@@ -0,0 +1,2 @@
1
+ export { transformJikanProducer } from "./transform.js";
2
+ //# sourceMappingURL=producer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"producer.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/producer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { transformJikanProducer } from "./transform.js";
@@ -0,0 +1,8 @@
1
+ import type { ZuuidData } from "../../entity.js";
2
+ import type { SourceRecord } from "../../source.js";
3
+ export declare function transformJikan(source: SourceRecord): Promise<ZuuidData>;
4
+ export declare function transformJikanTitle(source: SourceRecord, publicCategory?: string): Promise<ZuuidData>;
5
+ export declare function transformJikanPersonish(source: SourceRecord, sourceCategory?: string): Promise<ZuuidData>;
6
+ export declare function transformJikanProducer(source: SourceRecord): Promise<ZuuidData>;
7
+ export declare function transformJikanMagazine(source: SourceRecord): Promise<ZuuidData>;
8
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/providers/jikan/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAO7E;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,SAAyB,GAAG,OAAO,CAAC,SAAS,CAAC,CAqB3H;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,SAAyB,GAAG,OAAO,CAAC,SAAS,CAAC,CAa/H;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAerF;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAarF"}
@@ -0,0 +1,125 @@
1
+ import { addAlias, addDescription, addDetail, addMedia, addRelation, addTag, arrayField, baseDataFromSource, datePrefix, finalizeData, nestedString, objectPayload, stringField, stripHtml, valueAsString } from "../common.js";
2
+ import { JIKAN_ANIME_CATEGORY, JIKAN_CHARACTER_CATEGORY, JIKAN_MAGAZINE_CATEGORY, JIKAN_MANGA_CATEGORY, JIKAN_PERSON_CATEGORY, JIKAN_PRODUCER_CATEGORY, JIKAN_PROVIDER } from "./constants.js";
3
+ export async function transformJikan(source) {
4
+ if (source.source.provider !== JIKAN_PROVIDER)
5
+ throw new Error(`unsupported Jikan source: ${source.source.provider}:${source.source.category}`);
6
+ if (source.source.category === JIKAN_ANIME_CATEGORY || source.source.category === JIKAN_MANGA_CATEGORY)
7
+ return transformJikanTitle(source, source.source.category);
8
+ if (source.source.category === JIKAN_CHARACTER_CATEGORY || source.source.category === JIKAN_PERSON_CATEGORY)
9
+ return transformJikanPersonish(source, source.source.category);
10
+ if (source.source.category === JIKAN_PRODUCER_CATEGORY)
11
+ return transformJikanProducer(source);
12
+ if (source.source.category === JIKAN_MAGAZINE_CATEGORY)
13
+ return transformJikanMagazine(source);
14
+ throw new Error(`unsupported Jikan source: ${source.source.provider}:${source.source.category}`);
15
+ }
16
+ export async function transformJikanTitle(source, publicCategory = source.source.category) {
17
+ const payload = objectPayload(source.payload);
18
+ const id = source.source.externalId.trim() || valueAsString(payload.mal_id);
19
+ const title = stringField(payload, "title") ?? stringField(payload, "name") ?? stringField(payload, "title_english");
20
+ if (!id)
21
+ throw new Error("missing required Jikan field: mal_id");
22
+ if (!title)
23
+ throw new Error("missing required Jikan field: title");
24
+ const data = await baseDataFromSource(source, JIKAN_PROVIDER, source.source.category, publicCategory, id, title);
25
+ data.rating = typeof payload.score === "number" ? payload.score : undefined;
26
+ data.primaryDate = datePrefix(nestedString(payload, ["aired", "from"]) ?? nestedString(payload, ["published", "from"]));
27
+ addTitleAliases(data, payload, title);
28
+ addDescription(data, JIKAN_PROVIDER, stringField(payload, "synopsis") ?? stringField(payload, "background"), "en");
29
+ addCover(data, payload, "poster");
30
+ const trailer = nestedString(payload, ["trailer", "url"]) ?? (nestedString(payload, ["trailer", "youtube_id"]) ? `https://www.youtube.com/watch?v=${nestedString(payload, ["trailer", "youtube_id"])}` : undefined);
31
+ addMedia(data, JIKAN_PROVIDER, trailer, "trailer", "video", false);
32
+ for (const key of ["type", "source", "status", "rating", "season", "duration"])
33
+ addDetail(data, JIKAN_PROVIDER, key, stringField(payload, key));
34
+ for (const key of ["episodes", "chapters", "volumes", "rank", "popularity", "members", "favorites", "scored_by"])
35
+ addDetail(data, JIKAN_PROVIDER, key, valueAsString(payload[key]));
36
+ for (const key of ["genres", "themes", "demographics"])
37
+ addNamedTags(data, payload, key);
38
+ await addNamedRelations(data, payload, "studios", "studio", "organization");
39
+ await addNamedRelations(data, payload, "producers", "producer", "organization");
40
+ await addNamedRelations(data, payload, "authors", "author", "person");
41
+ return finalizeData(data, source);
42
+ }
43
+ export async function transformJikanPersonish(source, sourceCategory = source.source.category) {
44
+ const payload = objectPayload(source.payload);
45
+ const id = source.source.externalId.trim() || valueAsString(payload.mal_id);
46
+ const title = stringField(payload, "title") ?? stringField(payload, "name") ?? stringField(payload, "title_english");
47
+ if (!id)
48
+ throw new Error("missing required Jikan field: mal_id");
49
+ if (!title)
50
+ throw new Error("missing required Jikan field: name");
51
+ const data = await baseDataFromSource(source, JIKAN_PROVIDER, sourceCategory, "person", id, title);
52
+ data.primaryDate = datePrefix(stringField(payload, "birthday"));
53
+ addTitleAliases(data, payload, title);
54
+ addDescription(data, JIKAN_PROVIDER, stringField(payload, "about"), "en");
55
+ addCover(data, payload, "profile");
56
+ for (const key of ["favorites", "given_name", "family_name", "alternate_names"])
57
+ addDetail(data, JIKAN_PROVIDER, key, valueAsString(payload[key]));
58
+ return finalizeData(data, source);
59
+ }
60
+ export async function transformJikanProducer(source) {
61
+ const payload = objectPayload(source.payload);
62
+ const id = source.source.externalId.trim() || valueAsString(payload.mal_id);
63
+ const title = stringField(payload, "title") ?? stringField(payload, "name");
64
+ if (!id)
65
+ throw new Error("missing required Jikan producer field: mal_id");
66
+ if (!title)
67
+ throw new Error("missing required Jikan producer field: name");
68
+ const data = await baseDataFromSource(source, JIKAN_PROVIDER, JIKAN_PRODUCER_CATEGORY, "organization", id, title);
69
+ data.primaryDate = datePrefix(stringField(payload, "established"));
70
+ addTitleAliases(data, payload, title);
71
+ addDescription(data, JIKAN_PROVIDER, stringField(payload, "about"), "en");
72
+ addCover(data, payload, "logo");
73
+ for (const key of ["count", "favorites", "established"])
74
+ addDetail(data, JIKAN_PROVIDER, key, valueAsString(payload[key]));
75
+ addTag(data, "producer");
76
+ addTag(data, "anime");
77
+ return finalizeData(data, source);
78
+ }
79
+ export async function transformJikanMagazine(source) {
80
+ const payload = objectPayload(source.payload);
81
+ const id = source.source.externalId.trim() || valueAsString(payload.mal_id);
82
+ const title = stringField(payload, "title") ?? stringField(payload, "name");
83
+ if (!id)
84
+ throw new Error("missing required Jikan magazine field: mal_id");
85
+ if (!title)
86
+ throw new Error("missing required Jikan magazine field: name");
87
+ const data = await baseDataFromSource(source, JIKAN_PROVIDER, JIKAN_MAGAZINE_CATEGORY, JIKAN_MAGAZINE_CATEGORY, id, title);
88
+ addTitleAliases(data, payload, title);
89
+ addDescription(data, JIKAN_PROVIDER, stringField(payload, "about"), "en");
90
+ for (const key of ["count", "favorites"])
91
+ addDetail(data, JIKAN_PROVIDER, key, valueAsString(payload[key]));
92
+ addTag(data, "magazine");
93
+ addTag(data, "manga");
94
+ return finalizeData(data, source);
95
+ }
96
+ function addTitleAliases(data, payload, title) {
97
+ addAlias(data, title, "title", true, JIKAN_PROVIDER);
98
+ for (const [key, lang] of [["title_english", "en"], ["title_japanese", "ja"], ["name_kanji", "ja"]]) {
99
+ const value = stringField(payload, key);
100
+ if (value !== title)
101
+ addAlias(data, value, "title", false, JIKAN_PROVIDER, lang);
102
+ }
103
+ for (const key of ["title_synonyms", "nicknames", "alternate_names"]) {
104
+ for (const value of arrayField(payload, key))
105
+ if (typeof value === "string" && value !== title)
106
+ addAlias(data, value, "alternative", false, JIKAN_PROVIDER);
107
+ }
108
+ }
109
+ function addCover(data, payload, category) {
110
+ addMedia(data, JIKAN_PROVIDER, nestedString(payload, ["images", "jpg", "large_image_url"]) ?? nestedString(payload, ["images", "jpg", "image_url"]) ?? nestedString(payload, ["images", "webp", "large_image_url"]) ?? nestedString(payload, ["images", "webp", "image_url"]), category);
111
+ }
112
+ function addNamedTags(data, payload, key) {
113
+ for (const value of arrayField(payload, key))
114
+ if (value && typeof value === "object" && !Array.isArray(value))
115
+ addTag(data, stringField(value, "name"));
116
+ }
117
+ async function addNamedRelations(data, payload, key, relation, category) {
118
+ let index = 0;
119
+ for (const value of arrayField(payload, key)) {
120
+ if (value && typeof value === "object" && !Array.isArray(value)) {
121
+ await addRelation(data, JIKAN_PROVIDER, category, valueAsString(value.mal_id), relation, stringField(value, "name"), { order: index });
122
+ index += 1;
123
+ }
124
+ }
125
+ }
@@ -0,0 +1,4 @@
1
+ import type { ZuuidData } from "../../entity.js";
2
+ import type { SourceRecord } from "../../source.js";
3
+ export declare function transformMusicBrainzArtist(source: SourceRecord): Promise<ZuuidData>;
4
+ //# sourceMappingURL=artist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artist.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/artist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKpD,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAuBzF"}
@@ -0,0 +1,28 @@
1
+ import { addDetail, addTag, baseDataFromSource, finalizeData, nestedString, stringField } from "../common.js";
2
+ import { MUSICBRAINZ_ARTIST_CATEGORY, MUSICBRAINZ_PROVIDER } from "./constants.js";
3
+ import { addAreaDetails, addLifeSpanDetails, addMusicBrainzAliases, addMusicBrainzDescription, addMusicBrainzTags, musicBrainzId, musicBrainzPayload, requireMusicBrainzTitle } from "./helpers.js";
4
+ export async function transformMusicBrainzArtist(source) {
5
+ if (source.source.provider !== MUSICBRAINZ_PROVIDER || source.source.category !== MUSICBRAINZ_ARTIST_CATEGORY) {
6
+ throw new Error(`unsupported MusicBrainz source: ${source.source.provider}:${source.source.category}`);
7
+ }
8
+ const payload = musicBrainzPayload(source.payload);
9
+ const id = musicBrainzId(payload, source.source.externalId);
10
+ const title = requireMusicBrainzTitle(payload, "name");
11
+ if (!id)
12
+ throw new Error("missing required MusicBrainz artist field: id");
13
+ if (!title)
14
+ throw new Error("missing required MusicBrainz artist field: name");
15
+ const data = await baseDataFromSource(source, MUSICBRAINZ_PROVIDER, MUSICBRAINZ_ARTIST_CATEGORY, MUSICBRAINZ_ARTIST_CATEGORY, id, title);
16
+ data.primaryDate = nestedString(payload, ["life-span", "begin"]);
17
+ addMusicBrainzAliases(data, payload, title);
18
+ addMusicBrainzDescription(data, payload);
19
+ addDetail(data, MUSICBRAINZ_PROVIDER, "sort_name", stringField(payload, "sort-name"));
20
+ addDetail(data, MUSICBRAINZ_PROVIDER, "type", stringField(payload, "type"));
21
+ addDetail(data, MUSICBRAINZ_PROVIDER, "country", stringField(payload, "country"));
22
+ addDetail(data, MUSICBRAINZ_PROVIDER, "gender", stringField(payload, "gender"));
23
+ addLifeSpanDetails(data, payload);
24
+ addAreaDetails(data, payload);
25
+ addMusicBrainzTags(data, payload);
26
+ addTag(data, "artist");
27
+ return finalizeData(data, source);
28
+ }
@@ -0,0 +1,10 @@
1
+ export declare const MUSICBRAINZ_PROVIDER = "musicbrainz";
2
+ export declare const MUSICBRAINZ_RELEASE_CATEGORY = "release";
3
+ export declare const MUSICBRAINZ_RELEASE_GROUP_CATEGORY = "release-group";
4
+ export declare const MUSICBRAINZ_RECORDING_CATEGORY = "recording";
5
+ export declare const MUSICBRAINZ_ARTIST_CATEGORY = "artist";
6
+ export declare const MUSICBRAINZ_LABEL_CATEGORY = "label";
7
+ export declare const MUSICBRAINZ_WORK_CATEGORY = "work";
8
+ export declare const MUSICBRAINZ_COVER_ART_BASE_URL = "https://coverartarchive.org/release";
9
+ export declare const MUSICBRAINZ_RELEASE_GROUP_COVER_ART_BASE_URL = "https://coverartarchive.org/release-group";
10
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,4BAA4B,YAAY,CAAC;AACtD,eAAO,MAAM,kCAAkC,kBAAkB,CAAC;AAClE,eAAO,MAAM,8BAA8B,cAAc,CAAC;AAC1D,eAAO,MAAM,2BAA2B,WAAW,CAAC;AACpD,eAAO,MAAM,0BAA0B,UAAU,CAAC;AAClD,eAAO,MAAM,yBAAyB,SAAS,CAAC;AAChD,eAAO,MAAM,8BAA8B,wCAAwC,CAAC;AACpF,eAAO,MAAM,4CAA4C,8CAA8C,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const MUSICBRAINZ_PROVIDER = "musicbrainz";
2
+ export const MUSICBRAINZ_RELEASE_CATEGORY = "release";
3
+ export const MUSICBRAINZ_RELEASE_GROUP_CATEGORY = "release-group";
4
+ export const MUSICBRAINZ_RECORDING_CATEGORY = "recording";
5
+ export const MUSICBRAINZ_ARTIST_CATEGORY = "artist";
6
+ export const MUSICBRAINZ_LABEL_CATEGORY = "label";
7
+ export const MUSICBRAINZ_WORK_CATEGORY = "work";
8
+ export const MUSICBRAINZ_COVER_ART_BASE_URL = "https://coverartarchive.org/release";
9
+ export const MUSICBRAINZ_RELEASE_GROUP_COVER_ART_BASE_URL = "https://coverartarchive.org/release-group";
@@ -0,0 +1,15 @@
1
+ import type { ZuuidData } from "../../entity.js";
2
+ import type { JsonValue } from "../../types.js";
3
+ export declare function musicBrainzPayload(value: JsonValue): Record<string, JsonValue>;
4
+ export declare function musicBrainzId(payload: Record<string, JsonValue>, externalId: string): string | undefined;
5
+ export declare function requireMusicBrainzTitle(payload: Record<string, JsonValue>, field?: string): string | undefined;
6
+ export declare function addMusicBrainzAliases(data: ZuuidData, payload: Record<string, JsonValue>, primary: string): void;
7
+ export declare function addMusicBrainzDescription(data: ZuuidData, payload: Record<string, JsonValue>): void;
8
+ export declare function addMusicBrainzTags(data: ZuuidData, payload: Record<string, JsonValue>): void;
9
+ export declare function artistCredit(payload: Record<string, JsonValue>): string | undefined;
10
+ export declare function addArtistCreditDetail(data: ZuuidData, payload: Record<string, JsonValue>): void;
11
+ export declare function addLifeSpanDetails(data: ZuuidData, payload: Record<string, JsonValue>): void;
12
+ export declare function nestedRaw(payload: Record<string, JsonValue>, path: string[]): JsonValue | undefined;
13
+ export declare function addAreaDetails(data: ZuuidData, payload: Record<string, JsonValue>): void;
14
+ export declare function addRelationListDetail(data: ZuuidData, payload: Record<string, JsonValue>, key: string, detailKey: string): void;
15
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAE9E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExG;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,SAAU,GAAG,MAAM,GAAG,SAAS,CAE/G;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAOhH;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAGnG;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAM5F;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAOnF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAE/F;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAI5F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,CAOnG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAIxF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAM/H"}
@@ -0,0 +1,71 @@
1
+ import { addAlias, addDescription, addDetail, addTag, arrayField, nestedString, objectPayload, stringField, valueAsString } from "../common.js";
2
+ import { MUSICBRAINZ_PROVIDER } from "./constants.js";
3
+ export function musicBrainzPayload(value) {
4
+ return objectPayload(value);
5
+ }
6
+ export function musicBrainzId(payload, externalId) {
7
+ return externalId.trim() || stringField(payload, "id");
8
+ }
9
+ export function requireMusicBrainzTitle(payload, field = "title") {
10
+ return stringField(payload, field) ?? stringField(payload, "name");
11
+ }
12
+ export function addMusicBrainzAliases(data, payload, primary) {
13
+ addAlias(data, primary, "title", true, MUSICBRAINZ_PROVIDER);
14
+ for (const alias of arrayField(payload, "aliases")) {
15
+ if (!alias || typeof alias !== "object" || Array.isArray(alias))
16
+ continue;
17
+ const object = alias;
18
+ addAlias(data, stringField(object, "name"), stringField(object, "type") ?? "alias", false, MUSICBRAINZ_PROVIDER, stringField(object, "locale"));
19
+ }
20
+ }
21
+ export function addMusicBrainzDescription(data, payload) {
22
+ addDescription(data, MUSICBRAINZ_PROVIDER, stringField(payload, "disambiguation"));
23
+ addDescription(data, MUSICBRAINZ_PROVIDER, stringField(payload, "annotation"));
24
+ }
25
+ export function addMusicBrainzTags(data, payload) {
26
+ for (const key of ["genres", "tags"]) {
27
+ for (const item of arrayField(payload, key)) {
28
+ if (item && typeof item === "object" && !Array.isArray(item))
29
+ addTag(data, stringField(item, "name"));
30
+ }
31
+ }
32
+ }
33
+ export function artistCredit(payload) {
34
+ const names = arrayField(payload, "artist-credit").map((item) => {
35
+ if (!item || typeof item !== "object" || Array.isArray(item))
36
+ return undefined;
37
+ const object = item;
38
+ return stringField(object, "name") ?? nestedString(object, ["artist", "name"]);
39
+ }).filter((value) => !!value);
40
+ return names.length ? names.join(", ") : undefined;
41
+ }
42
+ export function addArtistCreditDetail(data, payload) {
43
+ addDetail(data, MUSICBRAINZ_PROVIDER, "artist_credit", artistCredit(payload));
44
+ }
45
+ export function addLifeSpanDetails(data, payload) {
46
+ addDetail(data, MUSICBRAINZ_PROVIDER, "begin_date", nestedString(payload, ["life-span", "begin"]));
47
+ addDetail(data, MUSICBRAINZ_PROVIDER, "end_date", nestedString(payload, ["life-span", "end"]));
48
+ addDetail(data, MUSICBRAINZ_PROVIDER, "ended", valueAsString(nestedRaw(payload, ["life-span", "ended"])));
49
+ }
50
+ export function nestedRaw(payload, path) {
51
+ let current = payload;
52
+ for (const key of path) {
53
+ if (!current || typeof current !== "object" || Array.isArray(current))
54
+ return undefined;
55
+ current = current[key];
56
+ }
57
+ return current;
58
+ }
59
+ export function addAreaDetails(data, payload) {
60
+ addDetail(data, MUSICBRAINZ_PROVIDER, "area", nestedString(payload, ["area", "name"]));
61
+ addDetail(data, MUSICBRAINZ_PROVIDER, "begin_area", nestedString(payload, ["begin-area", "name"]));
62
+ addDetail(data, MUSICBRAINZ_PROVIDER, "end_area", nestedString(payload, ["end-area", "name"]));
63
+ }
64
+ export function addRelationListDetail(data, payload, key, detailKey) {
65
+ const values = arrayField(payload, key).map((item) => {
66
+ if (!item || typeof item !== "object" || Array.isArray(item))
67
+ return undefined;
68
+ return stringField(item, "title") ?? stringField(item, "name");
69
+ }).filter((value) => !!value);
70
+ addDetail(data, MUSICBRAINZ_PROVIDER, detailKey, values.length ? values.join(", ") : undefined);
71
+ }
@@ -0,0 +1,8 @@
1
+ export * from "./artist.js";
2
+ export * from "./constants.js";
3
+ export * from "./label.js";
4
+ export * from "./recording.js";
5
+ export * from "./release.js";
6
+ export * from "./release-group.js";
7
+ export * from "./work.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from "./artist.js";
2
+ export * from "./constants.js";
3
+ export * from "./label.js";
4
+ export * from "./recording.js";
5
+ export * from "./release.js";
6
+ export * from "./release-group.js";
7
+ export * from "./work.js";
@@ -0,0 +1,4 @@
1
+ import type { ZuuidData } from "../../entity.js";
2
+ import type { SourceRecord } from "../../source.js";
3
+ export declare function transformMusicBrainzLabel(source: SourceRecord): Promise<ZuuidData>;
4
+ //# sourceMappingURL=label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKpD,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAuBxF"}
@@ -0,0 +1,28 @@
1
+ import { addDetail, addTag, baseDataFromSource, finalizeData, nestedString, stringField, valueAsString } from "../common.js";
2
+ import { MUSICBRAINZ_LABEL_CATEGORY, MUSICBRAINZ_PROVIDER } from "./constants.js";
3
+ import { addAreaDetails, addLifeSpanDetails, addMusicBrainzAliases, addMusicBrainzDescription, addMusicBrainzTags, musicBrainzId, musicBrainzPayload, requireMusicBrainzTitle } from "./helpers.js";
4
+ export async function transformMusicBrainzLabel(source) {
5
+ if (source.source.provider !== MUSICBRAINZ_PROVIDER || source.source.category !== MUSICBRAINZ_LABEL_CATEGORY) {
6
+ throw new Error(`unsupported MusicBrainz source: ${source.source.provider}:${source.source.category}`);
7
+ }
8
+ const payload = musicBrainzPayload(source.payload);
9
+ const id = musicBrainzId(payload, source.source.externalId);
10
+ const title = requireMusicBrainzTitle(payload, "name");
11
+ if (!id)
12
+ throw new Error("missing required MusicBrainz label field: id");
13
+ if (!title)
14
+ throw new Error("missing required MusicBrainz label field: name");
15
+ const data = await baseDataFromSource(source, MUSICBRAINZ_PROVIDER, MUSICBRAINZ_LABEL_CATEGORY, MUSICBRAINZ_LABEL_CATEGORY, id, title);
16
+ data.primaryDate = nestedString(payload, ["life-span", "begin"]);
17
+ addMusicBrainzAliases(data, payload, title);
18
+ addMusicBrainzDescription(data, payload);
19
+ addDetail(data, MUSICBRAINZ_PROVIDER, "sort_name", stringField(payload, "sort-name"));
20
+ addDetail(data, MUSICBRAINZ_PROVIDER, "type", stringField(payload, "type"));
21
+ addDetail(data, MUSICBRAINZ_PROVIDER, "country", stringField(payload, "country"));
22
+ addDetail(data, MUSICBRAINZ_PROVIDER, "label_code", valueAsString(payload["label-code"]));
23
+ addLifeSpanDetails(data, payload);
24
+ addAreaDetails(data, payload);
25
+ addMusicBrainzTags(data, payload);
26
+ addTag(data, "label");
27
+ return finalizeData(data, source);
28
+ }
@@ -0,0 +1,4 @@
1
+ import type { ZuuidData } from "../../entity.js";
2
+ import type { SourceRecord } from "../../source.js";
3
+ export declare function transformMusicBrainzRecording(source: SourceRecord): Promise<ZuuidData>;
4
+ //# sourceMappingURL=recording.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/recording.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKpD,wBAAsB,6BAA6B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAsB5F"}
@@ -0,0 +1,41 @@
1
+ import { addDetail, addRelation, arrayField, baseDataFromSource, finalizeData, stringField, valueAsString } from "../common.js";
2
+ import { MUSICBRAINZ_ARTIST_CATEGORY, MUSICBRAINZ_PROVIDER, MUSICBRAINZ_RECORDING_CATEGORY } from "./constants.js";
3
+ import { addArtistCreditDetail, addMusicBrainzDescription, addMusicBrainzTags, musicBrainzId, musicBrainzPayload, requireMusicBrainzTitle } from "./helpers.js";
4
+ export async function transformMusicBrainzRecording(source) {
5
+ if (source.source.provider !== MUSICBRAINZ_PROVIDER || source.source.category !== MUSICBRAINZ_RECORDING_CATEGORY) {
6
+ throw new Error(`unsupported MusicBrainz source: ${source.source.provider}:${source.source.category}`);
7
+ }
8
+ const payload = musicBrainzPayload(source.payload);
9
+ const id = musicBrainzId(payload, source.source.externalId);
10
+ const title = requireMusicBrainzTitle(payload);
11
+ if (!id)
12
+ throw new Error("missing required MusicBrainz recording field: id");
13
+ if (!title)
14
+ throw new Error("missing required MusicBrainz recording field: title");
15
+ const data = await baseDataFromSource(source, MUSICBRAINZ_PROVIDER, MUSICBRAINZ_RECORDING_CATEGORY, MUSICBRAINZ_RECORDING_CATEGORY, id, title);
16
+ data.primaryDate = stringField(payload, "first-release-date");
17
+ addDetail(data, MUSICBRAINZ_PROVIDER, "first_release_date", stringField(payload, "first-release-date"));
18
+ addDetail(data, MUSICBRAINZ_PROVIDER, "length_ms", valueAsString(payload.length));
19
+ addDetail(data, MUSICBRAINZ_PROVIDER, "video", valueAsString(payload.video));
20
+ addDetail(data, MUSICBRAINZ_PROVIDER, "isrcs", arrayField(payload, "isrcs").filter((value) => typeof value === "string"));
21
+ for (const isrc of arrayField(payload, "isrcs"))
22
+ if (typeof isrc === "string")
23
+ data.externalIds.push({ source: "isrc", category: MUSICBRAINZ_RECORDING_CATEGORY, value: isrc });
24
+ addArtistCreditDetail(data, payload);
25
+ await addArtistCreditRelations(data, payload);
26
+ addMusicBrainzDescription(data, payload);
27
+ addMusicBrainzTags(data, payload);
28
+ return finalizeData(data, source);
29
+ }
30
+ async function addArtistCreditRelations(data, payload) {
31
+ let index = 0;
32
+ for (const credit of arrayField(payload, "artist-credit")) {
33
+ if (!credit || typeof credit !== "object" || Array.isArray(credit))
34
+ continue;
35
+ const artist = credit.artist;
36
+ if (!artist || typeof artist !== "object" || Array.isArray(artist))
37
+ continue;
38
+ await addRelation(data, MUSICBRAINZ_PROVIDER, MUSICBRAINZ_ARTIST_CATEGORY, stringField(artist, "id"), "performed_by", stringField(artist, "name"), { order: index });
39
+ index += 1;
40
+ }
41
+ }
@@ -0,0 +1,7 @@
1
+ import type { ZuuidData } from "../../entity.js";
2
+ import type { SourceRecord } from "../../source.js";
3
+ export type MusicBrainzReleaseGroupTransformOptions = {
4
+ coverArtBaseUrl?: string | null;
5
+ };
6
+ export declare function transformMusicBrainzReleaseGroup(source: SourceRecord, options?: MusicBrainzReleaseGroupTransformOptions): Promise<ZuuidData>;
7
+ //# sourceMappingURL=release-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-group.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/release-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKpD,MAAM,MAAM,uCAAuC,GAAG;IACpD,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,uCAA4C,GACpD,OAAO,CAAC,SAAS,CAAC,CAsBpB"}
@@ -0,0 +1,28 @@
1
+ import { addDetail, addMedia, arrayField, baseDataFromSource, finalizeData, stringField, valueAsString } from "../common.js";
2
+ import { MUSICBRAINZ_PROVIDER, MUSICBRAINZ_RELEASE_GROUP_CATEGORY, MUSICBRAINZ_RELEASE_GROUP_COVER_ART_BASE_URL } from "./constants.js";
3
+ import { addArtistCreditDetail, addMusicBrainzDescription, addMusicBrainzTags, musicBrainzId, musicBrainzPayload, requireMusicBrainzTitle } from "./helpers.js";
4
+ export async function transformMusicBrainzReleaseGroup(source, options = {}) {
5
+ if (source.source.provider !== MUSICBRAINZ_PROVIDER || source.source.category !== MUSICBRAINZ_RELEASE_GROUP_CATEGORY) {
6
+ throw new Error(`unsupported MusicBrainz source: ${source.source.provider}:${source.source.category}`);
7
+ }
8
+ const payload = musicBrainzPayload(source.payload);
9
+ const id = musicBrainzId(payload, source.source.externalId);
10
+ const title = requireMusicBrainzTitle(payload);
11
+ if (!id)
12
+ throw new Error("missing required MusicBrainz release-group field: id");
13
+ if (!title)
14
+ throw new Error("missing required MusicBrainz release-group field: title");
15
+ const data = await baseDataFromSource(source, MUSICBRAINZ_PROVIDER, MUSICBRAINZ_RELEASE_GROUP_CATEGORY, "release_group", id, title);
16
+ data.primaryDate = stringField(payload, "first-release-date");
17
+ addDetail(data, MUSICBRAINZ_PROVIDER, "first_release_date", stringField(payload, "first-release-date"));
18
+ addDetail(data, MUSICBRAINZ_PROVIDER, "primary_type", stringField(payload, "primary-type"));
19
+ addDetail(data, MUSICBRAINZ_PROVIDER, "secondary_types", arrayField(payload, "secondary-types").filter((value) => typeof value === "string"));
20
+ addDetail(data, MUSICBRAINZ_PROVIDER, "release_count", valueAsString(payload["release-count"]));
21
+ addArtistCreditDetail(data, payload);
22
+ addMusicBrainzDescription(data, payload);
23
+ addMusicBrainzTags(data, payload);
24
+ const baseUrl = options.coverArtBaseUrl === undefined ? MUSICBRAINZ_RELEASE_GROUP_COVER_ART_BASE_URL : options.coverArtBaseUrl;
25
+ if (baseUrl)
26
+ addMedia(data, MUSICBRAINZ_PROVIDER, `${baseUrl.replace(/\/$/, "")}/${id}/front`, "cover");
27
+ return finalizeData(data, source);
28
+ }
@@ -0,0 +1,7 @@
1
+ import type { ZuuidData } from "../../entity.js";
2
+ import type { SourceRecord } from "../../source.js";
3
+ export type MusicBrainzTransformOptions = {
4
+ coverArtBaseUrl?: string | null;
5
+ };
6
+ export declare function transformMusicBrainzRelease(source: SourceRecord, options?: MusicBrainzTransformOptions): Promise<ZuuidData>;
7
+ //# sourceMappingURL=release.d.ts.map