@ansango/lastfm-api 3.4.0 → 3.6.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 (623) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +254 -21
  3. package/dist/cache/index.d.ts +7 -0
  4. package/dist/cache/index.d.ts.map +1 -0
  5. package/dist/cache/index.js +7 -0
  6. package/dist/cache/index.js.map +1 -0
  7. package/dist/cache/interface.d.ts +57 -0
  8. package/dist/cache/interface.d.ts.map +1 -0
  9. package/dist/cache/interface.js +5 -0
  10. package/dist/cache/interface.js.map +1 -0
  11. package/dist/cache/manager.d.ts +19 -0
  12. package/dist/cache/manager.d.ts.map +1 -0
  13. package/dist/cache/manager.js +63 -0
  14. package/dist/cache/manager.js.map +1 -0
  15. package/dist/cache/schemas.d.ts +15 -0
  16. package/dist/cache/schemas.d.ts.map +1 -0
  17. package/dist/cache/schemas.js +13 -0
  18. package/dist/cache/schemas.js.map +1 -0
  19. package/dist/cache/service.d.ts +13 -0
  20. package/dist/cache/service.d.ts.map +1 -0
  21. package/dist/cache/service.js +12 -0
  22. package/dist/cache/service.js.map +1 -0
  23. package/dist/cache/stores/memory.d.ts +33 -0
  24. package/dist/cache/stores/memory.d.ts.map +1 -0
  25. package/dist/cache/stores/memory.js +85 -0
  26. package/dist/cache/stores/memory.js.map +1 -0
  27. package/dist/cache/stores/storage.d.ts +42 -0
  28. package/dist/cache/stores/storage.d.ts.map +1 -0
  29. package/dist/cache/stores/storage.js +109 -0
  30. package/dist/cache/stores/storage.js.map +1 -0
  31. package/dist/client.d.ts +12 -1
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +21 -1
  34. package/dist/client.js.map +1 -1
  35. package/dist/config.d.ts +4 -0
  36. package/dist/config.d.ts.map +1 -1
  37. package/dist/config.js +13 -0
  38. package/dist/config.js.map +1 -1
  39. package/dist/core/canonical-methods.d.ts +25 -0
  40. package/dist/core/canonical-methods.d.ts.map +1 -0
  41. package/dist/core/canonical-methods.js +88 -0
  42. package/dist/core/canonical-methods.js.map +1 -0
  43. package/dist/core/client.d.ts +33 -0
  44. package/dist/core/client.d.ts.map +1 -0
  45. package/dist/core/client.js +48 -0
  46. package/dist/core/client.js.map +1 -0
  47. package/dist/core/index.d.ts +6 -0
  48. package/dist/core/index.d.ts.map +1 -0
  49. package/dist/core/index.js +6 -0
  50. package/dist/core/index.js.map +1 -0
  51. package/dist/core/pagination.d.ts +59 -0
  52. package/dist/core/pagination.d.ts.map +1 -0
  53. package/dist/core/pagination.js +93 -0
  54. package/dist/core/pagination.js.map +1 -0
  55. package/dist/core/schemas/album.schemas.d.ts.map +1 -0
  56. package/dist/{services → core/schemas}/album.schemas.js +1 -1
  57. package/dist/core/schemas/album.schemas.js.map +1 -0
  58. package/dist/core/schemas/artist.schemas.d.ts.map +1 -0
  59. package/dist/{services → core/schemas}/artist.schemas.js +1 -1
  60. package/dist/core/schemas/artist.schemas.js.map +1 -0
  61. package/dist/core/schemas/auth.schemas.d.ts.map +1 -0
  62. package/dist/core/schemas/auth.schemas.js.map +1 -0
  63. package/dist/core/schemas/base/base.entities.schemas.d.ts.map +1 -0
  64. package/dist/core/schemas/base/base.entities.schemas.js.map +1 -0
  65. package/dist/core/schemas/base/base.entity-names.schemas.d.ts.map +1 -0
  66. package/dist/core/schemas/base/base.entity-names.schemas.js.map +1 -0
  67. package/dist/core/schemas/base/base.metadata.schemas.d.ts.map +1 -0
  68. package/dist/core/schemas/base/base.metadata.schemas.js.map +1 -0
  69. package/dist/core/schemas/base/base.pagination.schemas.d.ts.map +1 -0
  70. package/dist/core/schemas/base/base.pagination.schemas.js.map +1 -0
  71. package/dist/core/schemas/base/base.primitives.schemas.d.ts.map +1 -0
  72. package/dist/core/schemas/base/base.primitives.schemas.js.map +1 -0
  73. package/dist/core/schemas/base/index.d.ts.map +1 -0
  74. package/dist/core/schemas/base/index.js.map +1 -0
  75. package/dist/core/schemas/chart.schemas.d.ts.map +1 -0
  76. package/dist/{services → core/schemas}/chart.schemas.js +1 -1
  77. package/dist/core/schemas/chart.schemas.js.map +1 -0
  78. package/dist/core/schemas/geo.schemas.d.ts.map +1 -0
  79. package/dist/{services → core/schemas}/geo.schemas.js +1 -1
  80. package/dist/core/schemas/geo.schemas.js.map +1 -0
  81. package/dist/core/schemas/index.d.ts +11 -0
  82. package/dist/core/schemas/index.d.ts.map +1 -0
  83. package/dist/core/schemas/index.js +11 -0
  84. package/dist/core/schemas/index.js.map +1 -0
  85. package/dist/core/schemas/library.schemas.d.ts.map +1 -0
  86. package/dist/{services → core/schemas}/library.schemas.js +1 -1
  87. package/dist/core/schemas/library.schemas.js.map +1 -0
  88. package/dist/core/schemas/tag.schemas.d.ts.map +1 -0
  89. package/dist/{services → core/schemas}/tag.schemas.js +1 -1
  90. package/dist/core/schemas/tag.schemas.js.map +1 -0
  91. package/dist/core/schemas/track.schemas.d.ts.map +1 -0
  92. package/dist/{services → core/schemas}/track.schemas.js +1 -1
  93. package/dist/core/schemas/track.schemas.js.map +1 -0
  94. package/dist/core/schemas/user.schemas.d.ts.map +1 -0
  95. package/dist/{services → core/schemas}/user.schemas.js +1 -1
  96. package/dist/core/schemas/user.schemas.js.map +1 -0
  97. package/dist/{services → core/services}/album.d.ts +2 -2
  98. package/dist/core/services/album.d.ts.map +1 -0
  99. package/dist/{services → core/services}/album.js +5 -5
  100. package/dist/core/services/album.js.map +1 -0
  101. package/dist/{services → core/services}/artist.d.ts +2 -2
  102. package/dist/core/services/artist.d.ts.map +1 -0
  103. package/dist/{services → core/services}/artist.js +9 -9
  104. package/dist/core/services/artist.js.map +1 -0
  105. package/dist/{services → core/services}/auth.d.ts +2 -2
  106. package/dist/core/services/auth.d.ts.map +1 -0
  107. package/dist/{services → core/services}/auth.js +1 -1
  108. package/dist/core/services/auth.js.map +1 -0
  109. package/dist/{services → core/services}/chart.d.ts +2 -2
  110. package/dist/core/services/chart.d.ts.map +1 -0
  111. package/dist/core/services/chart.js +9 -0
  112. package/dist/core/services/chart.js.map +1 -0
  113. package/dist/{services → core/services}/geo.d.ts +2 -2
  114. package/dist/core/services/geo.d.ts.map +1 -0
  115. package/dist/core/services/geo.js +8 -0
  116. package/dist/core/services/geo.js.map +1 -0
  117. package/dist/core/services/index.d.ts +10 -0
  118. package/dist/core/services/index.d.ts.map +1 -0
  119. package/dist/core/services/index.js +10 -0
  120. package/dist/core/services/index.js.map +1 -0
  121. package/dist/{services → core/services}/library.d.ts +2 -2
  122. package/dist/core/services/library.d.ts.map +1 -0
  123. package/dist/core/services/library.js +7 -0
  124. package/dist/core/services/library.js.map +1 -0
  125. package/dist/{services → core/services}/tag.d.ts +2 -2
  126. package/dist/core/services/tag.d.ts.map +1 -0
  127. package/dist/{services → core/services}/tag.js +8 -8
  128. package/dist/core/services/tag.js.map +1 -0
  129. package/dist/{services → core/services}/track.d.ts +2 -2
  130. package/dist/core/services/track.d.ts.map +1 -0
  131. package/dist/{services → core/services}/track.js +7 -7
  132. package/dist/core/services/track.js.map +1 -0
  133. package/dist/{services → core/services}/track.utils.d.ts +2 -2
  134. package/dist/core/services/track.utils.d.ts.map +1 -0
  135. package/dist/core/services/track.utils.js.map +1 -0
  136. package/dist/{services → core/services}/user.d.ts +2 -2
  137. package/dist/core/services/user.d.ts.map +1 -0
  138. package/dist/core/services/user.js +19 -0
  139. package/dist/core/services/user.js.map +1 -0
  140. package/dist/entrypoints/album.d.ts +3 -3
  141. package/dist/entrypoints/album.d.ts.map +1 -1
  142. package/dist/entrypoints/album.js +2 -2
  143. package/dist/entrypoints/album.js.map +1 -1
  144. package/dist/entrypoints/album.schemas.d.ts +2 -1
  145. package/dist/entrypoints/album.schemas.d.ts.map +1 -1
  146. package/dist/entrypoints/album.schemas.js +1 -2
  147. package/dist/entrypoints/album.schemas.js.map +1 -1
  148. package/dist/entrypoints/artist.d.ts +3 -3
  149. package/dist/entrypoints/artist.d.ts.map +1 -1
  150. package/dist/entrypoints/artist.js +2 -2
  151. package/dist/entrypoints/artist.js.map +1 -1
  152. package/dist/entrypoints/artist.schemas.d.ts +2 -1
  153. package/dist/entrypoints/artist.schemas.d.ts.map +1 -1
  154. package/dist/entrypoints/artist.schemas.js +1 -2
  155. package/dist/entrypoints/artist.schemas.js.map +1 -1
  156. package/dist/entrypoints/auth.d.ts +3 -3
  157. package/dist/entrypoints/auth.d.ts.map +1 -1
  158. package/dist/entrypoints/auth.js +2 -2
  159. package/dist/entrypoints/auth.js.map +1 -1
  160. package/dist/entrypoints/auth.schemas.d.ts +2 -1
  161. package/dist/entrypoints/auth.schemas.d.ts.map +1 -1
  162. package/dist/entrypoints/auth.schemas.js +1 -2
  163. package/dist/entrypoints/auth.schemas.js.map +1 -1
  164. package/dist/entrypoints/base.schemas.d.ts +2 -1
  165. package/dist/entrypoints/base.schemas.d.ts.map +1 -1
  166. package/dist/entrypoints/base.schemas.js +1 -2
  167. package/dist/entrypoints/base.schemas.js.map +1 -1
  168. package/dist/entrypoints/cache.d.ts +2 -0
  169. package/dist/entrypoints/cache.d.ts.map +1 -0
  170. package/dist/entrypoints/cache.js +2 -0
  171. package/dist/entrypoints/cache.js.map +1 -0
  172. package/dist/entrypoints/cache.schemas.d.ts +2 -0
  173. package/dist/entrypoints/cache.schemas.d.ts.map +1 -0
  174. package/dist/entrypoints/cache.schemas.js +2 -0
  175. package/dist/entrypoints/cache.schemas.js.map +1 -0
  176. package/dist/entrypoints/chart.d.ts +3 -3
  177. package/dist/entrypoints/chart.d.ts.map +1 -1
  178. package/dist/entrypoints/chart.js +2 -2
  179. package/dist/entrypoints/chart.js.map +1 -1
  180. package/dist/entrypoints/chart.schemas.d.ts +2 -1
  181. package/dist/entrypoints/chart.schemas.d.ts.map +1 -1
  182. package/dist/entrypoints/chart.schemas.js +1 -2
  183. package/dist/entrypoints/chart.schemas.js.map +1 -1
  184. package/dist/entrypoints/core.d.ts +5 -0
  185. package/dist/entrypoints/core.d.ts.map +1 -0
  186. package/dist/entrypoints/core.js +5 -0
  187. package/dist/entrypoints/core.js.map +1 -0
  188. package/dist/entrypoints/core.schemas.d.ts +3 -0
  189. package/dist/entrypoints/core.schemas.d.ts.map +1 -0
  190. package/dist/entrypoints/core.schemas.js +2 -0
  191. package/dist/entrypoints/core.schemas.js.map +1 -0
  192. package/dist/entrypoints/exporter.d.ts +3 -0
  193. package/dist/entrypoints/exporter.d.ts.map +1 -0
  194. package/dist/entrypoints/exporter.js +3 -0
  195. package/dist/entrypoints/exporter.js.map +1 -0
  196. package/dist/entrypoints/exporter.schemas.d.ts +3 -0
  197. package/dist/entrypoints/exporter.schemas.d.ts.map +1 -0
  198. package/dist/entrypoints/exporter.schemas.js +2 -0
  199. package/dist/entrypoints/exporter.schemas.js.map +1 -0
  200. package/dist/entrypoints/geo.d.ts +3 -3
  201. package/dist/entrypoints/geo.d.ts.map +1 -1
  202. package/dist/entrypoints/geo.js +2 -2
  203. package/dist/entrypoints/geo.js.map +1 -1
  204. package/dist/entrypoints/geo.schemas.d.ts +2 -1
  205. package/dist/entrypoints/geo.schemas.d.ts.map +1 -1
  206. package/dist/entrypoints/geo.schemas.js +1 -2
  207. package/dist/entrypoints/geo.schemas.js.map +1 -1
  208. package/dist/entrypoints/insights.d.ts +3 -3
  209. package/dist/entrypoints/insights.d.ts.map +1 -1
  210. package/dist/entrypoints/insights.js +2 -2
  211. package/dist/entrypoints/insights.js.map +1 -1
  212. package/dist/entrypoints/insights.schemas.d.ts +2 -1
  213. package/dist/entrypoints/insights.schemas.d.ts.map +1 -1
  214. package/dist/entrypoints/insights.schemas.js +1 -2
  215. package/dist/entrypoints/insights.schemas.js.map +1 -1
  216. package/dist/entrypoints/library.d.ts +3 -3
  217. package/dist/entrypoints/library.d.ts.map +1 -1
  218. package/dist/entrypoints/library.js +2 -2
  219. package/dist/entrypoints/library.js.map +1 -1
  220. package/dist/entrypoints/library.schemas.d.ts +2 -1
  221. package/dist/entrypoints/library.schemas.d.ts.map +1 -1
  222. package/dist/entrypoints/library.schemas.js +1 -2
  223. package/dist/entrypoints/library.schemas.js.map +1 -1
  224. package/dist/entrypoints/playlists.d.ts +3 -0
  225. package/dist/entrypoints/playlists.d.ts.map +1 -0
  226. package/dist/entrypoints/playlists.js +3 -0
  227. package/dist/entrypoints/playlists.js.map +1 -0
  228. package/dist/entrypoints/playlists.schemas.d.ts +3 -0
  229. package/dist/entrypoints/playlists.schemas.d.ts.map +1 -0
  230. package/dist/entrypoints/playlists.schemas.js +2 -0
  231. package/dist/entrypoints/playlists.schemas.js.map +1 -0
  232. package/dist/entrypoints/reports.d.ts +4 -0
  233. package/dist/entrypoints/reports.d.ts.map +1 -0
  234. package/dist/entrypoints/reports.js +3 -0
  235. package/dist/entrypoints/reports.js.map +1 -0
  236. package/dist/entrypoints/reports.schemas.d.ts +3 -0
  237. package/dist/entrypoints/reports.schemas.d.ts.map +1 -0
  238. package/dist/entrypoints/reports.schemas.js +2 -0
  239. package/dist/entrypoints/reports.schemas.js.map +1 -0
  240. package/dist/entrypoints/tag.d.ts +3 -3
  241. package/dist/entrypoints/tag.d.ts.map +1 -1
  242. package/dist/entrypoints/tag.js +2 -2
  243. package/dist/entrypoints/tag.js.map +1 -1
  244. package/dist/entrypoints/tag.schemas.d.ts +2 -1
  245. package/dist/entrypoints/tag.schemas.d.ts.map +1 -1
  246. package/dist/entrypoints/tag.schemas.js +1 -2
  247. package/dist/entrypoints/tag.schemas.js.map +1 -1
  248. package/dist/entrypoints/track.d.ts +3 -3
  249. package/dist/entrypoints/track.d.ts.map +1 -1
  250. package/dist/entrypoints/track.js +2 -2
  251. package/dist/entrypoints/track.js.map +1 -1
  252. package/dist/entrypoints/track.schemas.d.ts +2 -1
  253. package/dist/entrypoints/track.schemas.d.ts.map +1 -1
  254. package/dist/entrypoints/track.schemas.js +1 -2
  255. package/dist/entrypoints/track.schemas.js.map +1 -1
  256. package/dist/entrypoints/user.d.ts +3 -3
  257. package/dist/entrypoints/user.d.ts.map +1 -1
  258. package/dist/entrypoints/user.js +2 -2
  259. package/dist/entrypoints/user.js.map +1 -1
  260. package/dist/entrypoints/user.schemas.d.ts +2 -1
  261. package/dist/entrypoints/user.schemas.d.ts.map +1 -1
  262. package/dist/entrypoints/user.schemas.js +1 -2
  263. package/dist/entrypoints/user.schemas.js.map +1 -1
  264. package/dist/entrypoints/watcher.d.ts +2 -0
  265. package/dist/entrypoints/watcher.d.ts.map +1 -0
  266. package/dist/entrypoints/watcher.js +2 -0
  267. package/dist/entrypoints/watcher.js.map +1 -0
  268. package/dist/entrypoints/watcher.schemas.d.ts +2 -0
  269. package/dist/entrypoints/watcher.schemas.d.ts.map +1 -0
  270. package/dist/entrypoints/watcher.schemas.js +2 -0
  271. package/dist/entrypoints/watcher.schemas.js.map +1 -0
  272. package/dist/exporter/engines/library.d.ts +4 -0
  273. package/dist/exporter/engines/library.d.ts.map +1 -0
  274. package/dist/exporter/engines/library.js +34 -0
  275. package/dist/exporter/engines/library.js.map +1 -0
  276. package/dist/exporter/engines/loved.d.ts +4 -0
  277. package/dist/exporter/engines/loved.d.ts.map +1 -0
  278. package/dist/exporter/engines/loved.js +35 -0
  279. package/dist/exporter/engines/loved.js.map +1 -0
  280. package/dist/exporter/engines/scrobbles.d.ts +4 -0
  281. package/dist/exporter/engines/scrobbles.d.ts.map +1 -0
  282. package/dist/exporter/engines/scrobbles.js +74 -0
  283. package/dist/exporter/engines/scrobbles.js.map +1 -0
  284. package/dist/exporter/formats/csv.d.ts +5 -0
  285. package/dist/exporter/formats/csv.d.ts.map +1 -0
  286. package/dist/exporter/formats/csv.js +35 -0
  287. package/dist/exporter/formats/csv.js.map +1 -0
  288. package/dist/exporter/formats/jsonl.d.ts +2 -0
  289. package/dist/exporter/formats/jsonl.d.ts.map +1 -0
  290. package/dist/exporter/formats/jsonl.js +4 -0
  291. package/dist/exporter/formats/jsonl.js.map +1 -0
  292. package/dist/exporter/formats/listenbrainz.d.ts +3 -0
  293. package/dist/exporter/formats/listenbrainz.d.ts.map +1 -0
  294. package/dist/exporter/formats/listenbrainz.js +19 -0
  295. package/dist/exporter/formats/listenbrainz.js.map +1 -0
  296. package/dist/exporter/index.d.ts +6 -0
  297. package/dist/exporter/index.d.ts.map +1 -0
  298. package/dist/exporter/index.js +6 -0
  299. package/dist/exporter/index.js.map +1 -0
  300. package/dist/exporter/schemas.d.ts +291 -0
  301. package/dist/exporter/schemas.d.ts.map +1 -0
  302. package/dist/exporter/schemas.js +81 -0
  303. package/dist/exporter/schemas.js.map +1 -0
  304. package/dist/exporter/service.d.ts +30 -0
  305. package/dist/exporter/service.d.ts.map +1 -0
  306. package/dist/exporter/service.js +11 -0
  307. package/dist/exporter/service.js.map +1 -0
  308. package/dist/index.d.ts +18 -24
  309. package/dist/index.d.ts.map +1 -1
  310. package/dist/index.js +21 -16
  311. package/dist/index.js.map +1 -1
  312. package/dist/insights/algorithms/album-habits.d.ts +7 -0
  313. package/dist/insights/algorithms/album-habits.d.ts.map +1 -0
  314. package/dist/insights/algorithms/album-habits.js +154 -0
  315. package/dist/insights/algorithms/album-habits.js.map +1 -0
  316. package/dist/{services/insights → insights/algorithms}/binges.d.ts +1 -1
  317. package/dist/insights/algorithms/binges.d.ts.map +1 -0
  318. package/dist/{services/insights → insights/algorithms}/binges.js +2 -2
  319. package/dist/insights/algorithms/binges.js.map +1 -0
  320. package/dist/{services/insights → insights/algorithms}/compare.d.ts +1 -1
  321. package/dist/insights/algorithms/compare.d.ts.map +1 -0
  322. package/dist/{services/insights → insights/algorithms}/compare.js +3 -3
  323. package/dist/insights/algorithms/compare.js.map +1 -0
  324. package/dist/insights/algorithms/decay.d.ts +11 -0
  325. package/dist/insights/algorithms/decay.d.ts.map +1 -0
  326. package/dist/insights/algorithms/decay.js +154 -0
  327. package/dist/insights/algorithms/decay.js.map +1 -0
  328. package/dist/{services/insights → insights/algorithms}/discoveries.d.ts +1 -1
  329. package/dist/insights/algorithms/discoveries.d.ts.map +1 -0
  330. package/dist/{services/insights → insights/algorithms}/discoveries.js +2 -2
  331. package/dist/insights/algorithms/discoveries.js.map +1 -0
  332. package/dist/insights/algorithms/genres.d.ts +11 -0
  333. package/dist/insights/algorithms/genres.d.ts.map +1 -0
  334. package/dist/insights/algorithms/genres.js +201 -0
  335. package/dist/insights/algorithms/genres.js.map +1 -0
  336. package/dist/insights/algorithms/group.d.ts +8 -0
  337. package/dist/insights/algorithms/group.d.ts.map +1 -0
  338. package/dist/insights/algorithms/group.js +127 -0
  339. package/dist/insights/algorithms/group.js.map +1 -0
  340. package/dist/{services/insights → insights/algorithms}/hours.d.ts +1 -1
  341. package/dist/insights/algorithms/hours.d.ts.map +1 -0
  342. package/dist/{services/insights → insights/algorithms}/hours.js +2 -2
  343. package/dist/insights/algorithms/hours.js.map +1 -0
  344. package/dist/{services/insights → insights/algorithms}/mood.d.ts +1 -1
  345. package/dist/insights/algorithms/mood.d.ts.map +1 -0
  346. package/dist/{services/insights → insights/algorithms}/mood.js +4 -4
  347. package/dist/insights/algorithms/mood.js.map +1 -0
  348. package/dist/{services/insights → insights/algorithms}/now-playing.d.ts +1 -1
  349. package/dist/{services/insights → insights/algorithms}/now-playing.d.ts.map +1 -1
  350. package/dist/{services/insights → insights/algorithms}/now-playing.js +2 -2
  351. package/dist/insights/algorithms/now-playing.js.map +1 -0
  352. package/dist/insights/algorithms/obscurity.d.ts +27 -0
  353. package/dist/insights/algorithms/obscurity.d.ts.map +1 -0
  354. package/dist/insights/algorithms/obscurity.js +158 -0
  355. package/dist/insights/algorithms/obscurity.js.map +1 -0
  356. package/dist/{services/insights → insights/algorithms}/personality.d.ts +1 -1
  357. package/dist/insights/algorithms/personality.d.ts.map +1 -0
  358. package/dist/{services/insights → insights/algorithms}/personality.js +1 -1
  359. package/dist/insights/algorithms/personality.js.map +1 -0
  360. package/dist/insights/algorithms/recommendations.d.ts +11 -0
  361. package/dist/insights/algorithms/recommendations.d.ts.map +1 -0
  362. package/dist/insights/algorithms/recommendations.js +121 -0
  363. package/dist/insights/algorithms/recommendations.js.map +1 -0
  364. package/dist/insights/algorithms/streaks.d.ts +11 -0
  365. package/dist/insights/algorithms/streaks.d.ts.map +1 -0
  366. package/dist/insights/algorithms/streaks.js +178 -0
  367. package/dist/insights/algorithms/streaks.js.map +1 -0
  368. package/dist/{services/insights → insights/algorithms}/summary.d.ts +1 -1
  369. package/dist/insights/algorithms/summary.d.ts.map +1 -0
  370. package/dist/{services/insights → insights/algorithms}/summary.js +3 -3
  371. package/dist/insights/algorithms/summary.js.map +1 -0
  372. package/dist/{services/insights → insights/algorithms}/trends.d.ts +1 -1
  373. package/dist/insights/algorithms/trends.d.ts.map +1 -0
  374. package/dist/{services/insights → insights/algorithms}/trends.js +3 -3
  375. package/dist/insights/algorithms/trends.js.map +1 -0
  376. package/dist/insights/index.d.ts +3 -0
  377. package/dist/insights/index.d.ts.map +1 -0
  378. package/dist/insights/index.js +3 -0
  379. package/dist/insights/index.js.map +1 -0
  380. package/dist/insights/lib/binges.d.ts.map +1 -0
  381. package/dist/insights/lib/binges.js.map +1 -0
  382. package/dist/insights/lib/compare.d.ts.map +1 -0
  383. package/dist/insights/lib/compare.js.map +1 -0
  384. package/dist/insights/lib/discoveries.d.ts.map +1 -0
  385. package/dist/insights/lib/discoveries.js.map +1 -0
  386. package/dist/insights/lib/diversity.d.ts.map +1 -0
  387. package/dist/insights/lib/diversity.js.map +1 -0
  388. package/dist/insights/lib/hours.d.ts.map +1 -0
  389. package/dist/insights/lib/hours.js.map +1 -0
  390. package/dist/insights/lib/mood.d.ts.map +1 -0
  391. package/dist/insights/lib/mood.js.map +1 -0
  392. package/dist/{services/insights → insights}/lib/periods.d.ts +1 -1
  393. package/dist/insights/lib/periods.d.ts.map +1 -0
  394. package/dist/insights/lib/periods.js.map +1 -0
  395. package/dist/insights/lib/personality.d.ts.map +1 -0
  396. package/dist/insights/lib/personality.js.map +1 -0
  397. package/dist/insights/lib/trends.d.ts.map +1 -0
  398. package/dist/insights/lib/trends.js.map +1 -0
  399. package/dist/insights/schemas.d.ts +1415 -0
  400. package/dist/insights/schemas.d.ts.map +1 -0
  401. package/dist/{services/insights.schemas.js → insights/schemas.js} +291 -2
  402. package/dist/insights/schemas.js.map +1 -0
  403. package/dist/insights/service.d.ts +191 -0
  404. package/dist/insights/service.d.ts.map +1 -0
  405. package/dist/insights/service.js +44 -0
  406. package/dist/insights/service.js.map +1 -0
  407. package/dist/playlists/formatters/csv.d.ts +3 -0
  408. package/dist/playlists/formatters/csv.d.ts.map +1 -0
  409. package/dist/playlists/formatters/csv.js +18 -0
  410. package/dist/playlists/formatters/csv.js.map +1 -0
  411. package/dist/playlists/formatters/m3u.d.ts +3 -0
  412. package/dist/playlists/formatters/m3u.d.ts.map +1 -0
  413. package/dist/playlists/formatters/m3u.js +10 -0
  414. package/dist/playlists/formatters/m3u.js.map +1 -0
  415. package/dist/playlists/formatters/spotifymatch.d.ts +3 -0
  416. package/dist/playlists/formatters/spotifymatch.d.ts.map +1 -0
  417. package/dist/playlists/formatters/spotifymatch.js +4 -0
  418. package/dist/playlists/formatters/spotifymatch.js.map +1 -0
  419. package/dist/playlists/generators/generator.d.ts +4 -0
  420. package/dist/playlists/generators/generator.d.ts.map +1 -0
  421. package/dist/playlists/generators/generator.js +158 -0
  422. package/dist/playlists/generators/generator.js.map +1 -0
  423. package/dist/playlists/index.d.ts +6 -0
  424. package/dist/playlists/index.d.ts.map +1 -0
  425. package/dist/playlists/index.js +6 -0
  426. package/dist/playlists/index.js.map +1 -0
  427. package/dist/playlists/schemas.d.ts +150 -0
  428. package/dist/playlists/schemas.d.ts.map +1 -0
  429. package/dist/playlists/schemas.js +53 -0
  430. package/dist/playlists/schemas.js.map +1 -0
  431. package/dist/playlists/service.d.ts +28 -0
  432. package/dist/playlists/service.d.ts.map +1 -0
  433. package/dist/playlists/service.js +27 -0
  434. package/dist/playlists/service.js.map +1 -0
  435. package/dist/reports/generators/digest.d.ts +4 -0
  436. package/dist/reports/generators/digest.d.ts.map +1 -0
  437. package/dist/reports/generators/digest.js +95 -0
  438. package/dist/reports/generators/digest.js.map +1 -0
  439. package/dist/reports/generators/milestones.d.ts +4 -0
  440. package/dist/reports/generators/milestones.d.ts.map +1 -0
  441. package/dist/reports/generators/milestones.js +59 -0
  442. package/dist/reports/generators/milestones.js.map +1 -0
  443. package/dist/reports/generators/wrapped.d.ts +4 -0
  444. package/dist/reports/generators/wrapped.d.ts.map +1 -0
  445. package/dist/reports/generators/wrapped.js +179 -0
  446. package/dist/reports/generators/wrapped.js.map +1 -0
  447. package/dist/reports/index.d.ts +3 -0
  448. package/dist/reports/index.d.ts.map +1 -0
  449. package/dist/reports/index.js +3 -0
  450. package/dist/reports/index.js.map +1 -0
  451. package/dist/reports/schemas.d.ts +244 -0
  452. package/dist/reports/schemas.d.ts.map +1 -0
  453. package/dist/reports/schemas.js +92 -0
  454. package/dist/reports/schemas.js.map +1 -0
  455. package/dist/reports/service.d.ts +30 -0
  456. package/dist/reports/service.d.ts.map +1 -0
  457. package/dist/reports/service.js +11 -0
  458. package/dist/reports/service.js.map +1 -0
  459. package/dist/utils.d.ts +3 -2
  460. package/dist/utils.d.ts.map +1 -1
  461. package/dist/utils.js +19 -2
  462. package/dist/utils.js.map +1 -1
  463. package/dist/watcher/emitter.d.ts +14 -0
  464. package/dist/watcher/emitter.d.ts.map +1 -0
  465. package/dist/watcher/emitter.js +72 -0
  466. package/dist/watcher/emitter.js.map +1 -0
  467. package/dist/watcher/index.d.ts +5 -0
  468. package/dist/watcher/index.d.ts.map +1 -0
  469. package/dist/watcher/index.js +5 -0
  470. package/dist/watcher/index.js.map +1 -0
  471. package/dist/watcher/schemas.d.ts +39 -0
  472. package/dist/watcher/schemas.d.ts.map +1 -0
  473. package/dist/watcher/schemas.js +33 -0
  474. package/dist/watcher/schemas.js.map +1 -0
  475. package/dist/watcher/service.d.ts +15 -0
  476. package/dist/watcher/service.d.ts.map +1 -0
  477. package/dist/watcher/service.js +8 -0
  478. package/dist/watcher/service.js.map +1 -0
  479. package/dist/watcher/watcher.d.ts +35 -0
  480. package/dist/watcher/watcher.d.ts.map +1 -0
  481. package/dist/watcher/watcher.js +196 -0
  482. package/dist/watcher/watcher.js.map +1 -0
  483. package/package.json +49 -3
  484. package/dist/services/album.d.ts.map +0 -1
  485. package/dist/services/album.js.map +0 -1
  486. package/dist/services/album.schemas.d.ts.map +0 -1
  487. package/dist/services/album.schemas.js.map +0 -1
  488. package/dist/services/artist.d.ts.map +0 -1
  489. package/dist/services/artist.js.map +0 -1
  490. package/dist/services/artist.schemas.d.ts.map +0 -1
  491. package/dist/services/artist.schemas.js.map +0 -1
  492. package/dist/services/auth.d.ts.map +0 -1
  493. package/dist/services/auth.js.map +0 -1
  494. package/dist/services/auth.schemas.d.ts.map +0 -1
  495. package/dist/services/auth.schemas.js.map +0 -1
  496. package/dist/services/chart.d.ts.map +0 -1
  497. package/dist/services/chart.js +0 -9
  498. package/dist/services/chart.js.map +0 -1
  499. package/dist/services/chart.schemas.d.ts.map +0 -1
  500. package/dist/services/chart.schemas.js.map +0 -1
  501. package/dist/services/geo.d.ts.map +0 -1
  502. package/dist/services/geo.js +0 -8
  503. package/dist/services/geo.js.map +0 -1
  504. package/dist/services/geo.schemas.d.ts.map +0 -1
  505. package/dist/services/geo.schemas.js.map +0 -1
  506. package/dist/services/index.d.ts +0 -22
  507. package/dist/services/index.d.ts.map +0 -1
  508. package/dist/services/index.js +0 -23
  509. package/dist/services/index.js.map +0 -1
  510. package/dist/services/insights/binges.d.ts.map +0 -1
  511. package/dist/services/insights/binges.js.map +0 -1
  512. package/dist/services/insights/compare.d.ts.map +0 -1
  513. package/dist/services/insights/compare.js.map +0 -1
  514. package/dist/services/insights/discoveries.d.ts.map +0 -1
  515. package/dist/services/insights/discoveries.js.map +0 -1
  516. package/dist/services/insights/hours.d.ts.map +0 -1
  517. package/dist/services/insights/hours.js.map +0 -1
  518. package/dist/services/insights/lib/binges.d.ts.map +0 -1
  519. package/dist/services/insights/lib/binges.js.map +0 -1
  520. package/dist/services/insights/lib/compare.d.ts.map +0 -1
  521. package/dist/services/insights/lib/compare.js.map +0 -1
  522. package/dist/services/insights/lib/discoveries.d.ts.map +0 -1
  523. package/dist/services/insights/lib/discoveries.js.map +0 -1
  524. package/dist/services/insights/lib/diversity.d.ts.map +0 -1
  525. package/dist/services/insights/lib/diversity.js.map +0 -1
  526. package/dist/services/insights/lib/hours.d.ts.map +0 -1
  527. package/dist/services/insights/lib/hours.js.map +0 -1
  528. package/dist/services/insights/lib/mood.d.ts.map +0 -1
  529. package/dist/services/insights/lib/mood.js.map +0 -1
  530. package/dist/services/insights/lib/periods.d.ts.map +0 -1
  531. package/dist/services/insights/lib/periods.js.map +0 -1
  532. package/dist/services/insights/lib/personality.d.ts.map +0 -1
  533. package/dist/services/insights/lib/personality.js.map +0 -1
  534. package/dist/services/insights/lib/trends.d.ts.map +0 -1
  535. package/dist/services/insights/lib/trends.js.map +0 -1
  536. package/dist/services/insights/mood.d.ts.map +0 -1
  537. package/dist/services/insights/mood.js.map +0 -1
  538. package/dist/services/insights/now-playing.js.map +0 -1
  539. package/dist/services/insights/personality.d.ts.map +0 -1
  540. package/dist/services/insights/personality.js.map +0 -1
  541. package/dist/services/insights/summary.d.ts.map +0 -1
  542. package/dist/services/insights/summary.js.map +0 -1
  543. package/dist/services/insights/trends.d.ts.map +0 -1
  544. package/dist/services/insights/trends.js.map +0 -1
  545. package/dist/services/insights.d.ts +0 -96
  546. package/dist/services/insights.d.ts.map +0 -1
  547. package/dist/services/insights.js +0 -26
  548. package/dist/services/insights.js.map +0 -1
  549. package/dist/services/insights.schemas.d.ts +0 -710
  550. package/dist/services/insights.schemas.d.ts.map +0 -1
  551. package/dist/services/insights.schemas.js.map +0 -1
  552. package/dist/services/library.d.ts.map +0 -1
  553. package/dist/services/library.js +0 -7
  554. package/dist/services/library.js.map +0 -1
  555. package/dist/services/library.schemas.d.ts.map +0 -1
  556. package/dist/services/library.schemas.js.map +0 -1
  557. package/dist/services/schemas/base.entities.schemas.d.ts.map +0 -1
  558. package/dist/services/schemas/base.entities.schemas.js.map +0 -1
  559. package/dist/services/schemas/base.entity-names.schemas.d.ts.map +0 -1
  560. package/dist/services/schemas/base.entity-names.schemas.js.map +0 -1
  561. package/dist/services/schemas/base.metadata.schemas.d.ts.map +0 -1
  562. package/dist/services/schemas/base.metadata.schemas.js.map +0 -1
  563. package/dist/services/schemas/base.pagination.schemas.d.ts.map +0 -1
  564. package/dist/services/schemas/base.pagination.schemas.js.map +0 -1
  565. package/dist/services/schemas/base.primitives.schemas.d.ts.map +0 -1
  566. package/dist/services/schemas/base.primitives.schemas.js.map +0 -1
  567. package/dist/services/schemas/index.d.ts.map +0 -1
  568. package/dist/services/schemas/index.js.map +0 -1
  569. package/dist/services/tag.d.ts.map +0 -1
  570. package/dist/services/tag.js.map +0 -1
  571. package/dist/services/tag.schemas.d.ts.map +0 -1
  572. package/dist/services/tag.schemas.js.map +0 -1
  573. package/dist/services/track.d.ts.map +0 -1
  574. package/dist/services/track.js.map +0 -1
  575. package/dist/services/track.schemas.d.ts.map +0 -1
  576. package/dist/services/track.schemas.js.map +0 -1
  577. package/dist/services/track.utils.d.ts.map +0 -1
  578. package/dist/services/track.utils.js.map +0 -1
  579. package/dist/services/user.d.ts.map +0 -1
  580. package/dist/services/user.js +0 -19
  581. package/dist/services/user.js.map +0 -1
  582. package/dist/services/user.schemas.d.ts.map +0 -1
  583. package/dist/services/user.schemas.js.map +0 -1
  584. /package/dist/{services → core/schemas}/album.schemas.d.ts +0 -0
  585. /package/dist/{services → core/schemas}/artist.schemas.d.ts +0 -0
  586. /package/dist/{services → core/schemas}/auth.schemas.d.ts +0 -0
  587. /package/dist/{services → core/schemas}/auth.schemas.js +0 -0
  588. /package/dist/{services/schemas → core/schemas/base}/base.entities.schemas.d.ts +0 -0
  589. /package/dist/{services/schemas → core/schemas/base}/base.entities.schemas.js +0 -0
  590. /package/dist/{services/schemas → core/schemas/base}/base.entity-names.schemas.d.ts +0 -0
  591. /package/dist/{services/schemas → core/schemas/base}/base.entity-names.schemas.js +0 -0
  592. /package/dist/{services/schemas → core/schemas/base}/base.metadata.schemas.d.ts +0 -0
  593. /package/dist/{services/schemas → core/schemas/base}/base.metadata.schemas.js +0 -0
  594. /package/dist/{services/schemas → core/schemas/base}/base.pagination.schemas.d.ts +0 -0
  595. /package/dist/{services/schemas → core/schemas/base}/base.pagination.schemas.js +0 -0
  596. /package/dist/{services/schemas → core/schemas/base}/base.primitives.schemas.d.ts +0 -0
  597. /package/dist/{services/schemas → core/schemas/base}/base.primitives.schemas.js +0 -0
  598. /package/dist/{services/schemas → core/schemas/base}/index.d.ts +0 -0
  599. /package/dist/{services/schemas → core/schemas/base}/index.js +0 -0
  600. /package/dist/{services → core/schemas}/chart.schemas.d.ts +0 -0
  601. /package/dist/{services → core/schemas}/geo.schemas.d.ts +0 -0
  602. /package/dist/{services → core/schemas}/library.schemas.d.ts +0 -0
  603. /package/dist/{services → core/schemas}/tag.schemas.d.ts +0 -0
  604. /package/dist/{services → core/schemas}/track.schemas.d.ts +0 -0
  605. /package/dist/{services → core/schemas}/user.schemas.d.ts +0 -0
  606. /package/dist/{services → core/services}/track.utils.js +0 -0
  607. /package/dist/{services/insights → insights}/lib/binges.d.ts +0 -0
  608. /package/dist/{services/insights → insights}/lib/binges.js +0 -0
  609. /package/dist/{services/insights → insights}/lib/compare.d.ts +0 -0
  610. /package/dist/{services/insights → insights}/lib/compare.js +0 -0
  611. /package/dist/{services/insights → insights}/lib/discoveries.d.ts +0 -0
  612. /package/dist/{services/insights → insights}/lib/discoveries.js +0 -0
  613. /package/dist/{services/insights → insights}/lib/diversity.d.ts +0 -0
  614. /package/dist/{services/insights → insights}/lib/diversity.js +0 -0
  615. /package/dist/{services/insights → insights}/lib/hours.d.ts +0 -0
  616. /package/dist/{services/insights → insights}/lib/hours.js +0 -0
  617. /package/dist/{services/insights → insights}/lib/mood.d.ts +0 -0
  618. /package/dist/{services/insights → insights}/lib/mood.js +0 -0
  619. /package/dist/{services/insights → insights}/lib/periods.js +0 -0
  620. /package/dist/{services/insights → insights}/lib/personality.d.ts +0 -0
  621. /package/dist/{services/insights → insights}/lib/personality.js +0 -0
  622. /package/dist/{services/insights → insights}/lib/trends.d.ts +0 -0
  623. /package/dist/{services/insights → insights}/lib/trends.js +0 -0
@@ -0,0 +1,154 @@
1
+ import { createUserService } from '../../core/services/user.js';
2
+ function categorizeHabit(cohesionScore) {
3
+ if (cohesionScore >= 70) {
4
+ return {
5
+ profile: 'Album Purist',
6
+ description: 'Strong preference for complete, cohesive album listening sessions in continuous sequence.',
7
+ };
8
+ }
9
+ if (cohesionScore >= 45) {
10
+ return {
11
+ profile: 'Cohesive Listener',
12
+ description: 'Balanced listening style featuring deliberate multi-track album sessions alongside casual tracks.',
13
+ };
14
+ }
15
+ if (cohesionScore >= 25) {
16
+ return {
17
+ profile: 'Mixed Mode',
18
+ description: 'Regularly shuffles playlists and explores singles, with occasional focused album deep-dives.',
19
+ };
20
+ }
21
+ return {
22
+ profile: 'Playlist Shuffler',
23
+ description: 'Almost exclusively listens in shuffle, curated playlist, or single-track discovery modes.',
24
+ };
25
+ }
26
+ /**
27
+ * Analyzes sequential listening history to assess album completion and cohesive listening habits.
28
+ */
29
+ export async function getAlbumHabits(config, params, init) {
30
+ const limit = Math.min(1000, typeof params.limit === 'string' ? Number.parseInt(params.limit, 10) : (params.limit ?? 300));
31
+ const minSessionTracks = Math.max(2, Math.min(10, params.minSessionTracks ?? 3));
32
+ const userService = createUserService(config);
33
+ const recentRes = await userService.getRecentTracks({ user: params.user, limit }, init);
34
+ const rawTracks = recentRes.recenttracks?.track ?? [];
35
+ const tracks = (Array.isArray(rawTracks) ? rawTracks : [rawTracks]).filter((t) => !t['@attr']?.nowplaying);
36
+ // Sort chronologically ascending
37
+ const sorted = [...tracks].sort((a, b) => {
38
+ const utsa = Number.parseInt(a.date?.uts ?? '0', 10);
39
+ const utsb = Number.parseInt(b.date?.uts ?? '0', 10);
40
+ return utsa - utsb;
41
+ });
42
+ if (sorted.length === 0) {
43
+ const { profile, description } = categorizeHabit(0);
44
+ return {
45
+ user: params.user,
46
+ totalScrobblesInspected: 0,
47
+ cohesionScore: 0,
48
+ profile,
49
+ description,
50
+ albumSessionCount: 0,
51
+ isolatedTracksCount: 0,
52
+ averageSessionLength: 0,
53
+ topAlbums: [],
54
+ longestSession: null,
55
+ };
56
+ }
57
+ const runs = [];
58
+ let currentRun = null;
59
+ for (const t of sorted) {
60
+ const artistName = typeof t.artist === 'object' && t.artist !== null
61
+ ? (t.artist['#text'] ?? t.artist.name ?? '')
62
+ : String(t.artist ?? '');
63
+ const albumName = typeof t.album === 'object' && t.album !== null ? (t.album['#text'] ?? '') : String(t.album ?? '');
64
+ const uts = Number.parseInt(t.date?.uts ?? '0', 10) || 0;
65
+ // If no album is tagged, count as isolated
66
+ if (!albumName.trim() || !artistName.trim()) {
67
+ if (currentRun) {
68
+ runs.push(currentRun);
69
+ currentRun = null;
70
+ }
71
+ runs.push({ artist: artistName, album: '', count: 1, startUts: uts, endUts: uts });
72
+ continue;
73
+ }
74
+ if (currentRun &&
75
+ currentRun.artist.toLowerCase() === artistName.toLowerCase() &&
76
+ currentRun.album.toLowerCase() === albumName.toLowerCase()) {
77
+ currentRun.count += 1;
78
+ currentRun.endUts = uts;
79
+ }
80
+ else {
81
+ if (currentRun) {
82
+ runs.push(currentRun);
83
+ }
84
+ currentRun = {
85
+ artist: artistName,
86
+ album: albumName,
87
+ count: 1,
88
+ startUts: uts,
89
+ endUts: uts,
90
+ };
91
+ }
92
+ }
93
+ if (currentRun) {
94
+ runs.push(currentRun);
95
+ }
96
+ let albumSessionTracksCount = 0;
97
+ let isolatedTracksCount = 0;
98
+ let albumSessionCount = 0;
99
+ let longestSession = null;
100
+ let maxSessionLength = 0;
101
+ const albumAgg = {};
102
+ for (const run of runs) {
103
+ if (run.count >= minSessionTracks && run.album.length > 0) {
104
+ albumSessionCount += 1;
105
+ albumSessionTracksCount += run.count;
106
+ const key = `${run.artist.toLowerCase()}:::${run.album.toLowerCase()}`;
107
+ if (!albumAgg[key]) {
108
+ albumAgg[key] = {
109
+ artist: run.artist,
110
+ album: run.album,
111
+ sessionCount: 0,
112
+ totalTracksPlayed: 0,
113
+ };
114
+ }
115
+ albumAgg[key].sessionCount += 1;
116
+ albumAgg[key].totalTracksPlayed += run.count;
117
+ if (run.count > maxSessionLength) {
118
+ maxSessionLength = run.count;
119
+ const durationHours = Math.round(((run.endUts - run.startUts) / 3600) * 100) / 100;
120
+ longestSession = {
121
+ artist: run.artist,
122
+ album: run.album,
123
+ trackCount: run.count,
124
+ startTime: run.startUts,
125
+ endTime: run.endUts,
126
+ durationHours: Math.max(0.05, durationHours),
127
+ };
128
+ }
129
+ }
130
+ else {
131
+ isolatedTracksCount += run.count;
132
+ }
133
+ }
134
+ const cohesionRatio = sorted.length > 0 ? albumSessionTracksCount / sorted.length : 0;
135
+ const cohesionScore = Math.round(cohesionRatio * 10000) / 100;
136
+ const { profile, description } = categorizeHabit(cohesionScore);
137
+ const avgSessionLen = albumSessionCount > 0 ? Math.round((albumSessionTracksCount / albumSessionCount) * 10) / 10 : 0;
138
+ const topAlbums = Object.values(albumAgg)
139
+ .sort((a, b) => b.totalTracksPlayed - a.totalTracksPlayed || b.sessionCount - a.sessionCount)
140
+ .slice(0, 10);
141
+ return {
142
+ user: params.user,
143
+ totalScrobblesInspected: sorted.length,
144
+ cohesionScore,
145
+ profile,
146
+ description,
147
+ albumSessionCount,
148
+ isolatedTracksCount,
149
+ averageSessionLength: avgSessionLen,
150
+ topAlbums,
151
+ longestSession,
152
+ };
153
+ }
154
+ //# sourceMappingURL=album-habits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"album-habits.js","sourceRoot":"","sources":["../../../src/insights/algorithms/album-habits.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { LastFmConfig } from '../../config.js';
2
- import type { InsightsBingesRequest, InsightsBingesResponse } from '../insights.schemas.js';
2
+ import type { InsightsBingesRequest, InsightsBingesResponse } from '../schemas.js';
3
3
  /**
4
4
  * Detects binge listening streaks (consecutive plays of the same artist or track)
5
5
  * across a user's recent scrobbles.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binges.d.ts","sourceRoot":"","sources":["../../../src/insights/algorithms/binges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAElF;;;GAGG;AACH,wBAAsB,SAAS,CAC9B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,qBAAqB,EAC7B,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,sBAAsB,CAAC,CAwDjC"}
@@ -1,5 +1,5 @@
1
- import { createUserService } from '../user.js';
2
- import { findBinges } from './lib/binges.js';
1
+ import { createUserService } from '../../core/services/user.js';
2
+ import { findBinges } from '../lib/binges.js';
3
3
  /**
4
4
  * Detects binge listening streaks (consecutive plays of the same artist or track)
5
5
  * across a user's recent scrobbles.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binges.js","sourceRoot":"","sources":["../../../src/insights/algorithms/binges.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { LastFmConfig } from '../../config.js';
2
- import type { InsightsCompareRequest, InsightsCompareResponse } from '../insights.schemas.js';
2
+ import type { InsightsCompareRequest, InsightsCompareResponse } from '../schemas.js';
3
3
  /**
4
4
  * Compares two Last.fm users' listening affinity using Jaccard similarity
5
5
  * over mutual top artist rosters.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/insights/algorithms/compare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAInD,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAEpF;;;GAGG;AACH,wBAAsB,YAAY,CACjC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,sBAAsB,EAC9B,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,uBAAuB,CAAC,CAmClC"}
@@ -1,6 +1,6 @@
1
- import { createUserService } from '../user.js';
2
- import { compareArtists } from './lib/compare.js';
3
- import { resolvePeriod } from './lib/periods.js';
1
+ import { createUserService } from '../../core/services/user.js';
2
+ import { compareArtists } from '../lib/compare.js';
3
+ import { resolvePeriod } from '../lib/periods.js';
4
4
  /**
5
5
  * Compares two Last.fm users' listening affinity using Jaccard similarity
6
6
  * over mutual top artist rosters.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/insights/algorithms/compare.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAyB,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGjD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,MAAoB,EACpB,MAA8B,EAC9B,IAAkB;IAElB,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAA;IAEjC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpD,WAAW,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC;QACvF,WAAW,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC;KACvF,CAAC,CAAA;IAEF,MAAM,OAAO,GAAuB,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;KACnC,CAAC,CAAC,CAAA;IAEH,MAAM,OAAO,GAAuB,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;KACnC,CAAC,CAAC,CAAA;IAEH,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAEnD,OAAO;QACN,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC,MAAM;QAC3C,UAAU,EAAE,UAAU,CAAC,MAAM;QAC7B,UAAU,EAAE,UAAU,CAAC,MAAM;QAC7B,aAAa,EAAE,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC;QAC5C,SAAS,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAChC,SAAS,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;KAChC,CAAA;AACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { LastFmConfig } from '../../config.js';
2
+ import type { InsightsForgottenFavoritesRequest, InsightsForgottenFavoritesResponse, InsightsObsessionsRequest, InsightsObsessionsResponse } from '../schemas.js';
3
+ /**
4
+ * Identifies artists that were staples in a user's historical period but have zero plays in the recent period.
5
+ */
6
+ export declare function getForgottenFavorites(config: LastFmConfig, params: InsightsForgottenFavoritesRequest, init?: RequestInit): Promise<InsightsForgottenFavoritesResponse>;
7
+ /**
8
+ * Detects intense listening obsessions (sliding windows where a single artist heavily dominates).
9
+ */
10
+ export declare function getObsessions(config: LastFmConfig, params: InsightsObsessionsRequest, init?: RequestInit): Promise<InsightsObsessionsResponse>;
11
+ //# sourceMappingURL=decay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decay.d.ts","sourceRoot":"","sources":["../../../src/insights/algorithms/decay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,OAAO,KAAK,EAGX,iCAAiC,EACjC,kCAAkC,EAClC,yBAAyB,EACzB,0BAA0B,EAC1B,MAAM,eAAe,CAAA;AAEtB;;GAEG;AACH,wBAAsB,qBAAqB,CAC1C,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,iCAAiC,EACzC,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,kCAAkC,CAAC,CAsD7C;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,yBAAyB,EACjC,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,0BAA0B,CAAC,CAgIrC"}
@@ -0,0 +1,154 @@
1
+ import { createUserService } from '../../core/services/user.js';
2
+ import { resolvePeriod } from '../lib/periods.js';
3
+ /**
4
+ * Identifies artists that were staples in a user's historical period but have zero plays in the recent period.
5
+ */
6
+ export async function getForgottenFavorites(config, params, init) {
7
+ const limit = Math.min(50, typeof params.limit === 'string' ? Number.parseInt(params.limit, 10) : (params.limit ?? 20));
8
+ const historicPeriod = params.historicPeriod ?? '12month';
9
+ const recentPeriod = params.recentPeriod ?? '1month';
10
+ const resolvedHist = resolvePeriod(historicPeriod);
11
+ const resolvedRecent = resolvePeriod(recentPeriod);
12
+ const userService = createUserService(config);
13
+ // Fetch historical top artists (sample top 100)
14
+ const histRes = await userService.getTopArtists({ user: params.user, period: resolvedHist.lastfm, limit: 100 }, init);
15
+ // Fetch recent top artists (sample top 100)
16
+ const recentRes = await userService.getTopArtists({ user: params.user, period: resolvedRecent.lastfm, limit: 100 }, init);
17
+ const rawHist = histRes.topartists?.artist ?? [];
18
+ const histList = Array.isArray(rawHist) ? rawHist : [rawHist];
19
+ const rawRecent = recentRes.topartists?.artist ?? [];
20
+ const recentList = Array.isArray(rawRecent) ? rawRecent : [rawRecent];
21
+ const recentArtistSet = new Set(recentList.map((a) => a.name.toLowerCase().trim()));
22
+ const forgotten = [];
23
+ histList.forEach((a, idx) => {
24
+ const name = a.name;
25
+ if (!name)
26
+ return;
27
+ if (!recentArtistSet.has(name.toLowerCase().trim())) {
28
+ forgotten.push({
29
+ name,
30
+ historicPlaycount: Number.parseInt(a.playcount ?? '0', 10) || 0,
31
+ historicRank: idx + 1,
32
+ url: a.url,
33
+ });
34
+ }
35
+ });
36
+ // Sort by historic prominence (highest playcount / best rank first)
37
+ forgotten.sort((a, b) => b.historicPlaycount - a.historicPlaycount);
38
+ return {
39
+ user: params.user,
40
+ historicPeriod,
41
+ recentPeriod,
42
+ totalForgotten: forgotten.length,
43
+ forgottenArtists: forgotten.slice(0, limit),
44
+ };
45
+ }
46
+ /**
47
+ * Detects intense listening obsessions (sliding windows where a single artist heavily dominates).
48
+ */
49
+ export async function getObsessions(config, params, init) {
50
+ const limit = Math.min(1000, typeof params.limit === 'string' ? Number.parseInt(params.limit, 10) : (params.limit ?? 200));
51
+ const thresholdRatio = params.thresholdRatio ?? 0.35;
52
+ const windowSize = Math.max(5, Math.min(100, params.windowSize ?? 20));
53
+ const userService = createUserService(config);
54
+ const recentRes = await userService.getRecentTracks({ user: params.user, limit }, init);
55
+ const rawTracks = recentRes.recenttracks?.track ?? [];
56
+ const trackList = (Array.isArray(rawTracks) ? rawTracks : [rawTracks]).filter((t) => !t['@attr']?.nowplaying);
57
+ // Sort chronologically ascending by timestamp
58
+ const sorted = [...trackList].sort((a, b) => {
59
+ const utsa = Number.parseInt(a.date?.uts ?? '0', 10);
60
+ const utsb = Number.parseInt(b.date?.uts ?? '0', 10);
61
+ return utsa - utsb;
62
+ });
63
+ if (sorted.length < windowSize) {
64
+ return {
65
+ user: params.user,
66
+ totalScrobblesInspected: sorted.length,
67
+ obsessions: [],
68
+ mostObsessiveArtist: null,
69
+ };
70
+ }
71
+ const rawEpisodes = [];
72
+ // Sliding window scan
73
+ for (let i = 0; i <= sorted.length - windowSize; i++) {
74
+ const slice = sorted.slice(i, i + windowSize);
75
+ const counts = {};
76
+ for (const t of slice) {
77
+ const artistName = typeof t.artist === 'object' && t.artist !== null
78
+ ? (t.artist['#text'] ?? t.artist.name ?? '')
79
+ : String(t.artist ?? '');
80
+ if (!artistName)
81
+ continue;
82
+ if (!counts[artistName]) {
83
+ counts[artistName] = { count: 0, trackCounts: {} };
84
+ }
85
+ counts[artistName].count += 1;
86
+ const trk = t.name;
87
+ if (trk) {
88
+ counts[artistName].trackCounts[trk] = (counts[artistName].trackCounts[trk] ?? 0) + 1;
89
+ }
90
+ }
91
+ for (const [art, data] of Object.entries(counts)) {
92
+ const ratio = data.count / windowSize;
93
+ if (ratio >= thresholdRatio) {
94
+ const startUts = Number.parseInt(slice[0].date?.uts ?? '0', 10) || 0;
95
+ const endUts = Number.parseInt(slice[slice.length - 1].date?.uts ?? '0', 10) || 0;
96
+ const durationHours = Math.round(((endUts - startUts) / 3600) * 100) / 100;
97
+ let topTrack;
98
+ let maxTrackPlays = 0;
99
+ for (const [trk, tCount] of Object.entries(data.trackCounts)) {
100
+ if (tCount > maxTrackPlays) {
101
+ maxTrackPlays = tCount;
102
+ topTrack = trk;
103
+ }
104
+ }
105
+ rawEpisodes.push({
106
+ artist: art,
107
+ track: maxTrackPlays >= 3 ? topTrack : undefined,
108
+ scrobbles: data.count,
109
+ totalInWindow: windowSize,
110
+ density: Math.round(ratio * 100) / 100,
111
+ startTime: startUts,
112
+ endTime: endUts,
113
+ durationHours: Math.max(0.1, durationHours),
114
+ });
115
+ }
116
+ }
117
+ }
118
+ // Merge contiguous/overlapping episodes for the same artist
119
+ const merged = [];
120
+ for (const ep of rawEpisodes) {
121
+ const last = merged[merged.length - 1];
122
+ if (last && last.artist.toLowerCase() === ep.artist.toLowerCase() && ep.startTime <= last.endTime + 7200) {
123
+ last.endTime = Math.max(last.endTime, ep.endTime);
124
+ last.scrobbles = Math.max(last.scrobbles, ep.scrobbles);
125
+ last.density = Math.max(last.density, ep.density);
126
+ last.durationHours = Math.round(((last.endTime - last.startTime) / 3600) * 100) / 100;
127
+ }
128
+ else {
129
+ merged.push({ ...ep });
130
+ }
131
+ }
132
+ // Rank episodes by highest density and scrobbles
133
+ merged.sort((a, b) => b.density - a.density || b.scrobbles - a.scrobbles);
134
+ // Find most obsessive artist
135
+ const artistObsessionCount = {};
136
+ for (const ep of merged) {
137
+ artistObsessionCount[ep.artist] = (artistObsessionCount[ep.artist] ?? 0) + ep.scrobbles;
138
+ }
139
+ let mostObsessiveArtist = null;
140
+ let maxObsession = 0;
141
+ for (const [art, count] of Object.entries(artistObsessionCount)) {
142
+ if (count > maxObsession) {
143
+ maxObsession = count;
144
+ mostObsessiveArtist = art;
145
+ }
146
+ }
147
+ return {
148
+ user: params.user,
149
+ totalScrobblesInspected: sorted.length,
150
+ obsessions: merged,
151
+ mostObsessiveArtist,
152
+ };
153
+ }
154
+ //# sourceMappingURL=decay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decay.js","sourceRoot":"","sources":["../../../src/insights/algorithms/decay.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { LastFmConfig } from '../../config.js';
2
- import type { InsightsDiscoveriesRequest, InsightsDiscoveriesResponse } from '../insights.schemas.js';
2
+ import type { InsightsDiscoveriesRequest, InsightsDiscoveriesResponse } from '../schemas.js';
3
3
  /**
4
4
  * Detects newly discovered artists in a recent time window by comparing
5
5
  * against the user's historical baseline roster.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discoveries.d.ts","sourceRoot":"","sources":["../../../src/insights/algorithms/discoveries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAA;AAE5F;;;GAGG;AACH,wBAAsB,cAAc,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,0BAA0B,EAClC,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,2BAA2B,CAAC,CA0DtC"}
@@ -1,5 +1,5 @@
1
- import { createUserService } from '../user.js';
2
- import { findNewArtists } from './lib/discoveries.js';
1
+ import { createUserService } from '../../core/services/user.js';
2
+ import { findNewArtists } from '../lib/discoveries.js';
3
3
  /**
4
4
  * Detects newly discovered artists in a recent time window by comparing
5
5
  * against the user's historical baseline roster.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discoveries.js","sourceRoot":"","sources":["../../../src/insights/algorithms/discoveries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LastFmConfig } from '../../config.js';
2
+ import type { InsightsGenreBreakdownRequest, InsightsGenreBreakdownResponse, InsightsGenreEvolutionRequest, InsightsGenreEvolutionResponse } from '../schemas.js';
3
+ /**
4
+ * Computes normalized genre breakdown, noise-filtering meta tags and calculating HHI concentration.
5
+ */
6
+ export declare function getGenreBreakdown(config: LastFmConfig, params: InsightsGenreBreakdownRequest, init?: RequestInit): Promise<InsightsGenreBreakdownResponse>;
7
+ /**
8
+ * Tracks shifts in genre percentage shares between two periods.
9
+ */
10
+ export declare function getGenreEvolution(config: LastFmConfig, params: InsightsGenreEvolutionRequest, init?: RequestInit): Promise<InsightsGenreEvolutionResponse>;
11
+ //# sourceMappingURL=genres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genres.d.ts","sourceRoot":"","sources":["../../../src/insights/algorithms/genres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAInD,OAAO,KAAK,EAGX,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,8BAA8B,EAC9B,MAAM,eAAe,CAAA;AA0HtB;;GAEG;AACH,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,6BAA6B,EACrC,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,8BAA8B,CAAC,CAoDzC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,6BAA6B,EACrC,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,8BAA8B,CAAC,CAwDzC"}