@ansango/lastfm-api 3.4.0 → 3.5.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.
- package/README.md +128 -1
- package/dist/client.d.ts +8 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +11 -1
- package/dist/client.js.map +1 -1
- package/dist/core/canonical-methods.d.ts +25 -0
- package/dist/core/canonical-methods.d.ts.map +1 -0
- package/dist/core/canonical-methods.js +88 -0
- package/dist/core/canonical-methods.js.map +1 -0
- package/dist/core/client.d.ts +33 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +48 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pagination.d.ts +59 -0
- package/dist/core/pagination.d.ts.map +1 -0
- package/dist/core/pagination.js +93 -0
- package/dist/core/pagination.js.map +1 -0
- package/dist/core/schemas/album.schemas.d.ts.map +1 -0
- package/dist/{services → core/schemas}/album.schemas.js +1 -1
- package/dist/core/schemas/album.schemas.js.map +1 -0
- package/dist/core/schemas/artist.schemas.d.ts.map +1 -0
- package/dist/{services → core/schemas}/artist.schemas.js +1 -1
- package/dist/core/schemas/artist.schemas.js.map +1 -0
- package/dist/core/schemas/auth.schemas.d.ts.map +1 -0
- package/dist/core/schemas/auth.schemas.js.map +1 -0
- package/dist/core/schemas/base/base.entities.schemas.d.ts.map +1 -0
- package/dist/core/schemas/base/base.entities.schemas.js.map +1 -0
- package/dist/core/schemas/base/base.entity-names.schemas.d.ts.map +1 -0
- package/dist/core/schemas/base/base.entity-names.schemas.js.map +1 -0
- package/dist/core/schemas/base/base.metadata.schemas.d.ts.map +1 -0
- package/dist/core/schemas/base/base.metadata.schemas.js.map +1 -0
- package/dist/core/schemas/base/base.pagination.schemas.d.ts.map +1 -0
- package/dist/core/schemas/base/base.pagination.schemas.js.map +1 -0
- package/dist/core/schemas/base/base.primitives.schemas.d.ts.map +1 -0
- package/dist/core/schemas/base/base.primitives.schemas.js.map +1 -0
- package/dist/core/schemas/base/index.d.ts.map +1 -0
- package/dist/core/schemas/base/index.js.map +1 -0
- package/dist/core/schemas/chart.schemas.d.ts.map +1 -0
- package/dist/{services → core/schemas}/chart.schemas.js +1 -1
- package/dist/core/schemas/chart.schemas.js.map +1 -0
- package/dist/core/schemas/geo.schemas.d.ts.map +1 -0
- package/dist/{services → core/schemas}/geo.schemas.js +1 -1
- package/dist/core/schemas/geo.schemas.js.map +1 -0
- package/dist/core/schemas/index.d.ts +11 -0
- package/dist/core/schemas/index.d.ts.map +1 -0
- package/dist/core/schemas/index.js +11 -0
- package/dist/core/schemas/index.js.map +1 -0
- package/dist/core/schemas/library.schemas.d.ts.map +1 -0
- package/dist/{services → core/schemas}/library.schemas.js +1 -1
- package/dist/core/schemas/library.schemas.js.map +1 -0
- package/dist/core/schemas/tag.schemas.d.ts.map +1 -0
- package/dist/{services → core/schemas}/tag.schemas.js +1 -1
- package/dist/core/schemas/tag.schemas.js.map +1 -0
- package/dist/core/schemas/track.schemas.d.ts.map +1 -0
- package/dist/{services → core/schemas}/track.schemas.js +1 -1
- package/dist/core/schemas/track.schemas.js.map +1 -0
- package/dist/core/schemas/user.schemas.d.ts.map +1 -0
- package/dist/{services → core/schemas}/user.schemas.js +1 -1
- package/dist/core/schemas/user.schemas.js.map +1 -0
- package/dist/{services → core/services}/album.d.ts +2 -2
- package/dist/core/services/album.d.ts.map +1 -0
- package/dist/{services → core/services}/album.js +1 -1
- package/dist/core/services/album.js.map +1 -0
- package/dist/{services → core/services}/artist.d.ts +2 -2
- package/dist/core/services/artist.d.ts.map +1 -0
- package/dist/{services → core/services}/artist.js +1 -1
- package/dist/core/services/artist.js.map +1 -0
- package/dist/{services → core/services}/auth.d.ts +2 -2
- package/dist/core/services/auth.d.ts.map +1 -0
- package/dist/{services → core/services}/auth.js +1 -1
- package/dist/core/services/auth.js.map +1 -0
- package/dist/{services → core/services}/chart.d.ts +2 -2
- package/dist/core/services/chart.d.ts.map +1 -0
- package/dist/{services → core/services}/chart.js +1 -1
- package/dist/core/services/chart.js.map +1 -0
- package/dist/{services → core/services}/geo.d.ts +2 -2
- package/dist/core/services/geo.d.ts.map +1 -0
- package/dist/{services → core/services}/geo.js +1 -1
- package/dist/core/services/geo.js.map +1 -0
- package/dist/core/services/index.d.ts +10 -0
- package/dist/core/services/index.d.ts.map +1 -0
- package/dist/core/services/index.js +10 -0
- package/dist/core/services/index.js.map +1 -0
- package/dist/{services → core/services}/library.d.ts +2 -2
- package/dist/core/services/library.d.ts.map +1 -0
- package/dist/{services → core/services}/library.js +1 -1
- package/dist/core/services/library.js.map +1 -0
- package/dist/{services → core/services}/tag.d.ts +2 -2
- package/dist/core/services/tag.d.ts.map +1 -0
- package/dist/{services → core/services}/tag.js +1 -1
- package/dist/core/services/tag.js.map +1 -0
- package/dist/{services → core/services}/track.d.ts +2 -2
- package/dist/core/services/track.d.ts.map +1 -0
- package/dist/{services → core/services}/track.js +1 -1
- package/dist/core/services/track.js.map +1 -0
- package/dist/{services → core/services}/track.utils.d.ts +2 -2
- package/dist/core/services/track.utils.d.ts.map +1 -0
- package/dist/core/services/track.utils.js.map +1 -0
- package/dist/{services → core/services}/user.d.ts +2 -2
- package/dist/core/services/user.d.ts.map +1 -0
- package/dist/{services → core/services}/user.js +1 -1
- package/dist/core/services/user.js.map +1 -0
- package/dist/entrypoints/album.d.ts +3 -3
- package/dist/entrypoints/album.d.ts.map +1 -1
- package/dist/entrypoints/album.js +2 -2
- package/dist/entrypoints/album.js.map +1 -1
- package/dist/entrypoints/album.schemas.d.ts +2 -1
- package/dist/entrypoints/album.schemas.d.ts.map +1 -1
- package/dist/entrypoints/album.schemas.js +1 -2
- package/dist/entrypoints/album.schemas.js.map +1 -1
- package/dist/entrypoints/artist.d.ts +3 -3
- package/dist/entrypoints/artist.d.ts.map +1 -1
- package/dist/entrypoints/artist.js +2 -2
- package/dist/entrypoints/artist.js.map +1 -1
- package/dist/entrypoints/artist.schemas.d.ts +2 -1
- package/dist/entrypoints/artist.schemas.d.ts.map +1 -1
- package/dist/entrypoints/artist.schemas.js +1 -2
- package/dist/entrypoints/artist.schemas.js.map +1 -1
- package/dist/entrypoints/auth.d.ts +3 -3
- package/dist/entrypoints/auth.d.ts.map +1 -1
- package/dist/entrypoints/auth.js +2 -2
- package/dist/entrypoints/auth.js.map +1 -1
- package/dist/entrypoints/auth.schemas.d.ts +2 -1
- package/dist/entrypoints/auth.schemas.d.ts.map +1 -1
- package/dist/entrypoints/auth.schemas.js +1 -2
- package/dist/entrypoints/auth.schemas.js.map +1 -1
- package/dist/entrypoints/base.schemas.d.ts +2 -1
- package/dist/entrypoints/base.schemas.d.ts.map +1 -1
- package/dist/entrypoints/base.schemas.js +1 -2
- package/dist/entrypoints/base.schemas.js.map +1 -1
- package/dist/entrypoints/chart.d.ts +3 -3
- package/dist/entrypoints/chart.d.ts.map +1 -1
- package/dist/entrypoints/chart.js +2 -2
- package/dist/entrypoints/chart.js.map +1 -1
- package/dist/entrypoints/chart.schemas.d.ts +2 -1
- package/dist/entrypoints/chart.schemas.d.ts.map +1 -1
- package/dist/entrypoints/chart.schemas.js +1 -2
- package/dist/entrypoints/chart.schemas.js.map +1 -1
- package/dist/entrypoints/core.d.ts +5 -0
- package/dist/entrypoints/core.d.ts.map +1 -0
- package/dist/entrypoints/core.js +5 -0
- package/dist/entrypoints/core.js.map +1 -0
- package/dist/entrypoints/core.schemas.d.ts +3 -0
- package/dist/entrypoints/core.schemas.d.ts.map +1 -0
- package/dist/entrypoints/core.schemas.js +2 -0
- package/dist/entrypoints/core.schemas.js.map +1 -0
- package/dist/entrypoints/exporter.d.ts +3 -0
- package/dist/entrypoints/exporter.d.ts.map +1 -0
- package/dist/entrypoints/exporter.js +3 -0
- package/dist/entrypoints/exporter.js.map +1 -0
- package/dist/entrypoints/exporter.schemas.d.ts +3 -0
- package/dist/entrypoints/exporter.schemas.d.ts.map +1 -0
- package/dist/entrypoints/exporter.schemas.js +2 -0
- package/dist/entrypoints/exporter.schemas.js.map +1 -0
- package/dist/entrypoints/geo.d.ts +3 -3
- package/dist/entrypoints/geo.d.ts.map +1 -1
- package/dist/entrypoints/geo.js +2 -2
- package/dist/entrypoints/geo.js.map +1 -1
- package/dist/entrypoints/geo.schemas.d.ts +2 -1
- package/dist/entrypoints/geo.schemas.d.ts.map +1 -1
- package/dist/entrypoints/geo.schemas.js +1 -2
- package/dist/entrypoints/geo.schemas.js.map +1 -1
- package/dist/entrypoints/insights.d.ts +3 -3
- package/dist/entrypoints/insights.d.ts.map +1 -1
- package/dist/entrypoints/insights.js +2 -2
- package/dist/entrypoints/insights.js.map +1 -1
- package/dist/entrypoints/insights.schemas.d.ts +2 -1
- package/dist/entrypoints/insights.schemas.d.ts.map +1 -1
- package/dist/entrypoints/insights.schemas.js +1 -2
- package/dist/entrypoints/insights.schemas.js.map +1 -1
- package/dist/entrypoints/library.d.ts +3 -3
- package/dist/entrypoints/library.d.ts.map +1 -1
- package/dist/entrypoints/library.js +2 -2
- package/dist/entrypoints/library.js.map +1 -1
- package/dist/entrypoints/library.schemas.d.ts +2 -1
- package/dist/entrypoints/library.schemas.d.ts.map +1 -1
- package/dist/entrypoints/library.schemas.js +1 -2
- package/dist/entrypoints/library.schemas.js.map +1 -1
- package/dist/entrypoints/playlists.d.ts +3 -0
- package/dist/entrypoints/playlists.d.ts.map +1 -0
- package/dist/entrypoints/playlists.js +3 -0
- package/dist/entrypoints/playlists.js.map +1 -0
- package/dist/entrypoints/playlists.schemas.d.ts +3 -0
- package/dist/entrypoints/playlists.schemas.d.ts.map +1 -0
- package/dist/entrypoints/playlists.schemas.js +2 -0
- package/dist/entrypoints/playlists.schemas.js.map +1 -0
- package/dist/entrypoints/reports.d.ts +4 -0
- package/dist/entrypoints/reports.d.ts.map +1 -0
- package/dist/entrypoints/reports.js +3 -0
- package/dist/entrypoints/reports.js.map +1 -0
- package/dist/entrypoints/reports.schemas.d.ts +3 -0
- package/dist/entrypoints/reports.schemas.d.ts.map +1 -0
- package/dist/entrypoints/reports.schemas.js +2 -0
- package/dist/entrypoints/reports.schemas.js.map +1 -0
- package/dist/entrypoints/tag.d.ts +3 -3
- package/dist/entrypoints/tag.d.ts.map +1 -1
- package/dist/entrypoints/tag.js +2 -2
- package/dist/entrypoints/tag.js.map +1 -1
- package/dist/entrypoints/tag.schemas.d.ts +2 -1
- package/dist/entrypoints/tag.schemas.d.ts.map +1 -1
- package/dist/entrypoints/tag.schemas.js +1 -2
- package/dist/entrypoints/tag.schemas.js.map +1 -1
- package/dist/entrypoints/track.d.ts +3 -3
- package/dist/entrypoints/track.d.ts.map +1 -1
- package/dist/entrypoints/track.js +2 -2
- package/dist/entrypoints/track.js.map +1 -1
- package/dist/entrypoints/track.schemas.d.ts +2 -1
- package/dist/entrypoints/track.schemas.d.ts.map +1 -1
- package/dist/entrypoints/track.schemas.js +1 -2
- package/dist/entrypoints/track.schemas.js.map +1 -1
- package/dist/entrypoints/user.d.ts +3 -3
- package/dist/entrypoints/user.d.ts.map +1 -1
- package/dist/entrypoints/user.js +2 -2
- package/dist/entrypoints/user.js.map +1 -1
- package/dist/entrypoints/user.schemas.d.ts +2 -1
- package/dist/entrypoints/user.schemas.d.ts.map +1 -1
- package/dist/entrypoints/user.schemas.js +1 -2
- package/dist/entrypoints/user.schemas.js.map +1 -1
- package/dist/exporter/engines/library.d.ts +4 -0
- package/dist/exporter/engines/library.d.ts.map +1 -0
- package/dist/exporter/engines/library.js +34 -0
- package/dist/exporter/engines/library.js.map +1 -0
- package/dist/exporter/engines/loved.d.ts +4 -0
- package/dist/exporter/engines/loved.d.ts.map +1 -0
- package/dist/exporter/engines/loved.js +35 -0
- package/dist/exporter/engines/loved.js.map +1 -0
- package/dist/exporter/engines/scrobbles.d.ts +4 -0
- package/dist/exporter/engines/scrobbles.d.ts.map +1 -0
- package/dist/exporter/engines/scrobbles.js +74 -0
- package/dist/exporter/engines/scrobbles.js.map +1 -0
- package/dist/exporter/formats/csv.d.ts +5 -0
- package/dist/exporter/formats/csv.d.ts.map +1 -0
- package/dist/exporter/formats/csv.js +35 -0
- package/dist/exporter/formats/csv.js.map +1 -0
- package/dist/exporter/formats/jsonl.d.ts +2 -0
- package/dist/exporter/formats/jsonl.d.ts.map +1 -0
- package/dist/exporter/formats/jsonl.js +4 -0
- package/dist/exporter/formats/jsonl.js.map +1 -0
- package/dist/exporter/formats/listenbrainz.d.ts +3 -0
- package/dist/exporter/formats/listenbrainz.d.ts.map +1 -0
- package/dist/exporter/formats/listenbrainz.js +19 -0
- package/dist/exporter/formats/listenbrainz.js.map +1 -0
- package/dist/exporter/index.d.ts +6 -0
- package/dist/exporter/index.d.ts.map +1 -0
- package/dist/exporter/index.js +6 -0
- package/dist/exporter/index.js.map +1 -0
- package/dist/exporter/schemas.d.ts +291 -0
- package/dist/exporter/schemas.d.ts.map +1 -0
- package/dist/exporter/schemas.js +81 -0
- package/dist/exporter/schemas.js.map +1 -0
- package/dist/exporter/service.d.ts +30 -0
- package/dist/exporter/service.d.ts.map +1 -0
- package/dist/exporter/service.js +11 -0
- package/dist/exporter/service.js.map +1 -0
- package/dist/index.d.ts +14 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/dist/insights/algorithms/album-habits.d.ts +7 -0
- package/dist/insights/algorithms/album-habits.d.ts.map +1 -0
- package/dist/insights/algorithms/album-habits.js +154 -0
- package/dist/insights/algorithms/album-habits.js.map +1 -0
- package/dist/{services/insights → insights/algorithms}/binges.d.ts +1 -1
- package/dist/insights/algorithms/binges.d.ts.map +1 -0
- package/dist/{services/insights → insights/algorithms}/binges.js +2 -2
- package/dist/insights/algorithms/binges.js.map +1 -0
- package/dist/{services/insights → insights/algorithms}/compare.d.ts +1 -1
- package/dist/insights/algorithms/compare.d.ts.map +1 -0
- package/dist/{services/insights → insights/algorithms}/compare.js +3 -3
- package/dist/insights/algorithms/compare.js.map +1 -0
- package/dist/insights/algorithms/decay.d.ts +11 -0
- package/dist/insights/algorithms/decay.d.ts.map +1 -0
- package/dist/insights/algorithms/decay.js +154 -0
- package/dist/insights/algorithms/decay.js.map +1 -0
- package/dist/{services/insights → insights/algorithms}/discoveries.d.ts +1 -1
- package/dist/insights/algorithms/discoveries.d.ts.map +1 -0
- package/dist/{services/insights → insights/algorithms}/discoveries.js +2 -2
- package/dist/insights/algorithms/discoveries.js.map +1 -0
- package/dist/insights/algorithms/genres.d.ts +11 -0
- package/dist/insights/algorithms/genres.d.ts.map +1 -0
- package/dist/insights/algorithms/genres.js +201 -0
- package/dist/insights/algorithms/genres.js.map +1 -0
- package/dist/insights/algorithms/group.d.ts +8 -0
- package/dist/insights/algorithms/group.d.ts.map +1 -0
- package/dist/insights/algorithms/group.js +127 -0
- package/dist/insights/algorithms/group.js.map +1 -0
- package/dist/{services/insights → insights/algorithms}/hours.d.ts +1 -1
- package/dist/insights/algorithms/hours.d.ts.map +1 -0
- package/dist/{services/insights → insights/algorithms}/hours.js +2 -2
- package/dist/insights/algorithms/hours.js.map +1 -0
- package/dist/{services/insights → insights/algorithms}/mood.d.ts +1 -1
- package/dist/insights/algorithms/mood.d.ts.map +1 -0
- package/dist/{services/insights → insights/algorithms}/mood.js +4 -4
- package/dist/insights/algorithms/mood.js.map +1 -0
- package/dist/{services/insights → insights/algorithms}/now-playing.d.ts +1 -1
- package/dist/{services/insights → insights/algorithms}/now-playing.d.ts.map +1 -1
- package/dist/{services/insights → insights/algorithms}/now-playing.js +2 -2
- package/dist/insights/algorithms/now-playing.js.map +1 -0
- package/dist/insights/algorithms/obscurity.d.ts +27 -0
- package/dist/insights/algorithms/obscurity.d.ts.map +1 -0
- package/dist/insights/algorithms/obscurity.js +158 -0
- package/dist/insights/algorithms/obscurity.js.map +1 -0
- package/dist/{services/insights → insights/algorithms}/personality.d.ts +1 -1
- package/dist/insights/algorithms/personality.d.ts.map +1 -0
- package/dist/{services/insights → insights/algorithms}/personality.js +1 -1
- package/dist/insights/algorithms/personality.js.map +1 -0
- package/dist/insights/algorithms/recommendations.d.ts +11 -0
- package/dist/insights/algorithms/recommendations.d.ts.map +1 -0
- package/dist/insights/algorithms/recommendations.js +121 -0
- package/dist/insights/algorithms/recommendations.js.map +1 -0
- package/dist/insights/algorithms/streaks.d.ts +11 -0
- package/dist/insights/algorithms/streaks.d.ts.map +1 -0
- package/dist/insights/algorithms/streaks.js +178 -0
- package/dist/insights/algorithms/streaks.js.map +1 -0
- package/dist/{services/insights → insights/algorithms}/summary.d.ts +1 -1
- package/dist/insights/algorithms/summary.d.ts.map +1 -0
- package/dist/{services/insights → insights/algorithms}/summary.js +3 -3
- package/dist/insights/algorithms/summary.js.map +1 -0
- package/dist/{services/insights → insights/algorithms}/trends.d.ts +1 -1
- package/dist/insights/algorithms/trends.d.ts.map +1 -0
- package/dist/{services/insights → insights/algorithms}/trends.js +3 -3
- package/dist/insights/algorithms/trends.js.map +1 -0
- package/dist/insights/index.d.ts +3 -0
- package/dist/insights/index.d.ts.map +1 -0
- package/dist/insights/index.js +3 -0
- package/dist/insights/index.js.map +1 -0
- package/dist/insights/lib/binges.d.ts.map +1 -0
- package/dist/insights/lib/binges.js.map +1 -0
- package/dist/insights/lib/compare.d.ts.map +1 -0
- package/dist/insights/lib/compare.js.map +1 -0
- package/dist/insights/lib/discoveries.d.ts.map +1 -0
- package/dist/insights/lib/discoveries.js.map +1 -0
- package/dist/insights/lib/diversity.d.ts.map +1 -0
- package/dist/insights/lib/diversity.js.map +1 -0
- package/dist/insights/lib/hours.d.ts.map +1 -0
- package/dist/insights/lib/hours.js.map +1 -0
- package/dist/insights/lib/mood.d.ts.map +1 -0
- package/dist/insights/lib/mood.js.map +1 -0
- package/dist/{services/insights → insights}/lib/periods.d.ts +1 -1
- package/dist/insights/lib/periods.d.ts.map +1 -0
- package/dist/insights/lib/periods.js.map +1 -0
- package/dist/insights/lib/personality.d.ts.map +1 -0
- package/dist/insights/lib/personality.js.map +1 -0
- package/dist/insights/lib/trends.d.ts.map +1 -0
- package/dist/insights/lib/trends.js.map +1 -0
- package/dist/insights/schemas.d.ts +1415 -0
- package/dist/insights/schemas.d.ts.map +1 -0
- package/dist/{services/insights.schemas.js → insights/schemas.js} +291 -2
- package/dist/insights/schemas.js.map +1 -0
- package/dist/insights/service.d.ts +191 -0
- package/dist/insights/service.d.ts.map +1 -0
- package/dist/insights/service.js +44 -0
- package/dist/insights/service.js.map +1 -0
- package/dist/playlists/formatters/csv.d.ts +3 -0
- package/dist/playlists/formatters/csv.d.ts.map +1 -0
- package/dist/playlists/formatters/csv.js +18 -0
- package/dist/playlists/formatters/csv.js.map +1 -0
- package/dist/playlists/formatters/m3u.d.ts +3 -0
- package/dist/playlists/formatters/m3u.d.ts.map +1 -0
- package/dist/playlists/formatters/m3u.js +10 -0
- package/dist/playlists/formatters/m3u.js.map +1 -0
- package/dist/playlists/formatters/spotifymatch.d.ts +3 -0
- package/dist/playlists/formatters/spotifymatch.d.ts.map +1 -0
- package/dist/playlists/formatters/spotifymatch.js +4 -0
- package/dist/playlists/formatters/spotifymatch.js.map +1 -0
- package/dist/playlists/generators/generator.d.ts +4 -0
- package/dist/playlists/generators/generator.d.ts.map +1 -0
- package/dist/playlists/generators/generator.js +158 -0
- package/dist/playlists/generators/generator.js.map +1 -0
- package/dist/playlists/index.d.ts +6 -0
- package/dist/playlists/index.d.ts.map +1 -0
- package/dist/playlists/index.js +6 -0
- package/dist/playlists/index.js.map +1 -0
- package/dist/playlists/schemas.d.ts +150 -0
- package/dist/playlists/schemas.d.ts.map +1 -0
- package/dist/playlists/schemas.js +53 -0
- package/dist/playlists/schemas.js.map +1 -0
- package/dist/playlists/service.d.ts +28 -0
- package/dist/playlists/service.d.ts.map +1 -0
- package/dist/playlists/service.js +27 -0
- package/dist/playlists/service.js.map +1 -0
- package/dist/reports/generators/digest.d.ts +4 -0
- package/dist/reports/generators/digest.d.ts.map +1 -0
- package/dist/reports/generators/digest.js +95 -0
- package/dist/reports/generators/digest.js.map +1 -0
- package/dist/reports/generators/milestones.d.ts +4 -0
- package/dist/reports/generators/milestones.d.ts.map +1 -0
- package/dist/reports/generators/milestones.js +59 -0
- package/dist/reports/generators/milestones.js.map +1 -0
- package/dist/reports/generators/wrapped.d.ts +4 -0
- package/dist/reports/generators/wrapped.d.ts.map +1 -0
- package/dist/reports/generators/wrapped.js +179 -0
- package/dist/reports/generators/wrapped.js.map +1 -0
- package/dist/reports/index.d.ts +3 -0
- package/dist/reports/index.d.ts.map +1 -0
- package/dist/reports/index.js +3 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/schemas.d.ts +244 -0
- package/dist/reports/schemas.d.ts.map +1 -0
- package/dist/reports/schemas.js +92 -0
- package/dist/reports/schemas.js.map +1 -0
- package/dist/reports/service.d.ts +30 -0
- package/dist/reports/service.d.ts.map +1 -0
- package/dist/reports/service.js +11 -0
- package/dist/reports/service.js.map +1 -0
- package/package.json +33 -1
- package/dist/services/album.d.ts.map +0 -1
- package/dist/services/album.js.map +0 -1
- package/dist/services/album.schemas.d.ts.map +0 -1
- package/dist/services/album.schemas.js.map +0 -1
- package/dist/services/artist.d.ts.map +0 -1
- package/dist/services/artist.js.map +0 -1
- package/dist/services/artist.schemas.d.ts.map +0 -1
- package/dist/services/artist.schemas.js.map +0 -1
- package/dist/services/auth.d.ts.map +0 -1
- package/dist/services/auth.js.map +0 -1
- package/dist/services/auth.schemas.d.ts.map +0 -1
- package/dist/services/auth.schemas.js.map +0 -1
- package/dist/services/chart.d.ts.map +0 -1
- package/dist/services/chart.js.map +0 -1
- package/dist/services/chart.schemas.d.ts.map +0 -1
- package/dist/services/chart.schemas.js.map +0 -1
- package/dist/services/geo.d.ts.map +0 -1
- package/dist/services/geo.js.map +0 -1
- package/dist/services/geo.schemas.d.ts.map +0 -1
- package/dist/services/geo.schemas.js.map +0 -1
- package/dist/services/index.d.ts +0 -22
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -23
- package/dist/services/index.js.map +0 -1
- package/dist/services/insights/binges.d.ts.map +0 -1
- package/dist/services/insights/binges.js.map +0 -1
- package/dist/services/insights/compare.d.ts.map +0 -1
- package/dist/services/insights/compare.js.map +0 -1
- package/dist/services/insights/discoveries.d.ts.map +0 -1
- package/dist/services/insights/discoveries.js.map +0 -1
- package/dist/services/insights/hours.d.ts.map +0 -1
- package/dist/services/insights/hours.js.map +0 -1
- package/dist/services/insights/lib/binges.d.ts.map +0 -1
- package/dist/services/insights/lib/binges.js.map +0 -1
- package/dist/services/insights/lib/compare.d.ts.map +0 -1
- package/dist/services/insights/lib/compare.js.map +0 -1
- package/dist/services/insights/lib/discoveries.d.ts.map +0 -1
- package/dist/services/insights/lib/discoveries.js.map +0 -1
- package/dist/services/insights/lib/diversity.d.ts.map +0 -1
- package/dist/services/insights/lib/diversity.js.map +0 -1
- package/dist/services/insights/lib/hours.d.ts.map +0 -1
- package/dist/services/insights/lib/hours.js.map +0 -1
- package/dist/services/insights/lib/mood.d.ts.map +0 -1
- package/dist/services/insights/lib/mood.js.map +0 -1
- package/dist/services/insights/lib/periods.d.ts.map +0 -1
- package/dist/services/insights/lib/periods.js.map +0 -1
- package/dist/services/insights/lib/personality.d.ts.map +0 -1
- package/dist/services/insights/lib/personality.js.map +0 -1
- package/dist/services/insights/lib/trends.d.ts.map +0 -1
- package/dist/services/insights/lib/trends.js.map +0 -1
- package/dist/services/insights/mood.d.ts.map +0 -1
- package/dist/services/insights/mood.js.map +0 -1
- package/dist/services/insights/now-playing.js.map +0 -1
- package/dist/services/insights/personality.d.ts.map +0 -1
- package/dist/services/insights/personality.js.map +0 -1
- package/dist/services/insights/summary.d.ts.map +0 -1
- package/dist/services/insights/summary.js.map +0 -1
- package/dist/services/insights/trends.d.ts.map +0 -1
- package/dist/services/insights/trends.js.map +0 -1
- package/dist/services/insights.d.ts +0 -96
- package/dist/services/insights.d.ts.map +0 -1
- package/dist/services/insights.js +0 -26
- package/dist/services/insights.js.map +0 -1
- package/dist/services/insights.schemas.d.ts +0 -710
- package/dist/services/insights.schemas.d.ts.map +0 -1
- package/dist/services/insights.schemas.js.map +0 -1
- package/dist/services/library.d.ts.map +0 -1
- package/dist/services/library.js.map +0 -1
- package/dist/services/library.schemas.d.ts.map +0 -1
- package/dist/services/library.schemas.js.map +0 -1
- package/dist/services/schemas/base.entities.schemas.d.ts.map +0 -1
- package/dist/services/schemas/base.entities.schemas.js.map +0 -1
- package/dist/services/schemas/base.entity-names.schemas.d.ts.map +0 -1
- package/dist/services/schemas/base.entity-names.schemas.js.map +0 -1
- package/dist/services/schemas/base.metadata.schemas.d.ts.map +0 -1
- package/dist/services/schemas/base.metadata.schemas.js.map +0 -1
- package/dist/services/schemas/base.pagination.schemas.d.ts.map +0 -1
- package/dist/services/schemas/base.pagination.schemas.js.map +0 -1
- package/dist/services/schemas/base.primitives.schemas.d.ts.map +0 -1
- package/dist/services/schemas/base.primitives.schemas.js.map +0 -1
- package/dist/services/schemas/index.d.ts.map +0 -1
- package/dist/services/schemas/index.js.map +0 -1
- package/dist/services/tag.d.ts.map +0 -1
- package/dist/services/tag.js.map +0 -1
- package/dist/services/tag.schemas.d.ts.map +0 -1
- package/dist/services/tag.schemas.js.map +0 -1
- package/dist/services/track.d.ts.map +0 -1
- package/dist/services/track.js.map +0 -1
- package/dist/services/track.schemas.d.ts.map +0 -1
- package/dist/services/track.schemas.js.map +0 -1
- package/dist/services/track.utils.d.ts.map +0 -1
- package/dist/services/track.utils.js.map +0 -1
- package/dist/services/user.d.ts.map +0 -1
- package/dist/services/user.js.map +0 -1
- package/dist/services/user.schemas.d.ts.map +0 -1
- package/dist/services/user.schemas.js.map +0 -1
- /package/dist/{services → core/schemas}/album.schemas.d.ts +0 -0
- /package/dist/{services → core/schemas}/artist.schemas.d.ts +0 -0
- /package/dist/{services → core/schemas}/auth.schemas.d.ts +0 -0
- /package/dist/{services → core/schemas}/auth.schemas.js +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.entities.schemas.d.ts +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.entities.schemas.js +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.entity-names.schemas.d.ts +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.entity-names.schemas.js +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.metadata.schemas.d.ts +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.metadata.schemas.js +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.pagination.schemas.d.ts +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.pagination.schemas.js +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.primitives.schemas.d.ts +0 -0
- /package/dist/{services/schemas → core/schemas/base}/base.primitives.schemas.js +0 -0
- /package/dist/{services/schemas → core/schemas/base}/index.d.ts +0 -0
- /package/dist/{services/schemas → core/schemas/base}/index.js +0 -0
- /package/dist/{services → core/schemas}/chart.schemas.d.ts +0 -0
- /package/dist/{services → core/schemas}/geo.schemas.d.ts +0 -0
- /package/dist/{services → core/schemas}/library.schemas.d.ts +0 -0
- /package/dist/{services → core/schemas}/tag.schemas.d.ts +0 -0
- /package/dist/{services → core/schemas}/track.schemas.d.ts +0 -0
- /package/dist/{services → core/schemas}/user.schemas.d.ts +0 -0
- /package/dist/{services → core/services}/track.utils.js +0 -0
- /package/dist/{services/insights → insights}/lib/binges.d.ts +0 -0
- /package/dist/{services/insights → insights}/lib/binges.js +0 -0
- /package/dist/{services/insights → insights}/lib/compare.d.ts +0 -0
- /package/dist/{services/insights → insights}/lib/compare.js +0 -0
- /package/dist/{services/insights → insights}/lib/discoveries.d.ts +0 -0
- /package/dist/{services/insights → insights}/lib/discoveries.js +0 -0
- /package/dist/{services/insights → insights}/lib/diversity.d.ts +0 -0
- /package/dist/{services/insights → insights}/lib/diversity.js +0 -0
- /package/dist/{services/insights → insights}/lib/hours.d.ts +0 -0
- /package/dist/{services/insights → insights}/lib/hours.js +0 -0
- /package/dist/{services/insights → insights}/lib/mood.d.ts +0 -0
- /package/dist/{services/insights → insights}/lib/mood.js +0 -0
- /package/dist/{services/insights → insights}/lib/periods.js +0 -0
- /package/dist/{services/insights → insights}/lib/personality.d.ts +0 -0
- /package/dist/{services/insights → insights}/lib/personality.js +0 -0
- /package/dist/{services/insights → insights}/lib/trends.d.ts +0 -0
- /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 '../
|
|
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 '
|
|
2
|
-
import { findBinges } from '
|
|
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 '../
|
|
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 '
|
|
2
|
-
import { compareArtists } from '
|
|
3
|
-
import { resolvePeriod } from '
|
|
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 '../
|
|
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 '
|
|
2
|
-
import { findNewArtists } from '
|
|
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":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAA4B,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAGhF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,MAAoB,EACpB,MAAkC,EAClC,IAAkB;IAElB,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAA;IACzC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,GAAG,UAAU,GAAG,KAAK,CAAA;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,GAAG,CAAA;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAA;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAA;IAE1C,wCAAwC;IACxC,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,aAAa,CAClD,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,EAC9D,IAAI,CACJ,CAAA;IACD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAEtF,gCAAgC;IAChC,MAAM,eAAe,GAA0B,EAAE,CAAA;IACjD,IAAI,IAAI,GAAG,CAAC,CAAA;IAEZ,OAAO,IAAI,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,eAAe,CAClD;YACC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;YAClB,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YACd,KAAK,EAAE,GAAG;YACV,IAAI;SACJ,EACD,IAAI,CACJ,CAAA;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAA;QAClD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAsD,CAAA;YAC1E,MAAM,UAAU,GACf,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;gBAClD,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACpD,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAA;YAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACxD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5E,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;YAC3D,CAAC;QACF,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;YAAE,MAAK;QAC9B,IAAI,EAAE,CAAA;IACP,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAEhF,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU;QACV,YAAY,EAAE,WAAW,CAAC,IAAI;QAC9B,eAAe,EAAE,WAAW,CAAC,MAAM;QACnC,WAAW;KACX,CAAA;AACF,CAAC"}
|
|
@@ -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"}
|