Import your Last.fm and Spotify listening history to the AT Protocol network using the fm.teal.alpha.feed.play lexicon.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: version bump to 0.5.0

+12 -12
+3 -3
README.md
··· 310 310 - **trackName**: The name of the track 311 311 - **artists**: Array of artist objects (requires `artistName`, optional `artistMbId` for Last.fm) 312 312 - **playedTime**: ISO 8601 timestamp of when you listened 313 - - **submissionClientAgent**: Identifies this importer (`lastfm-importer/v0.4.0`) 313 + - **submissionClientAgent**: Identifies this importer (`lastfm-importer/v0.5.0`) 314 314 - **musicServiceBaseDomain**: Set to `last.fm` or `spotify.com` depending on source 315 315 316 316 ### Optional Fields (when available) ··· 337 337 "recordingMbId": "3a390ad3-fe56-45f2-a073-bebc45d6bde1", 338 338 "playedTime": "2025-11-13T23:49:36Z", 339 339 "originUrl": "https://www.last.fm/music/Cjbeards/_/Paint+My+Masterpiece", 340 - "submissionClientAgent": "lastfm-importer/v0.4.0", 340 + "submissionClientAgent": "lastfm-importer/v0.5.0", 341 341 "musicServiceBaseDomain": "last.fm" 342 342 } 343 343 ``` ··· 355 355 "releaseName": "Twenty", 356 356 "playedTime": "2021-09-09T10:34:08Z", 357 357 "originUrl": "https://open.spotify.com/track/3gZqDJkMZipOYCRjlHWgOV", 358 - "submissionClientAgent": "lastfm-importer/v0.4.0", 358 + "submissionClientAgent": "lastfm-importer/v0.5.0", 359 359 "musicServiceBaseDomain": "spotify.com" 360 360 } 361 361 ```
+6 -6
package-lock.json
··· 1 1 { 2 2 "name": "lastfm-importer", 3 - "version": "0.4.0", 3 + "version": "0.5.0", 4 4 "lockfileVersion": 3, 5 5 "requires": true, 6 6 "packages": { 7 7 "": { 8 8 "name": "lastfm-importer", 9 - "version": "0.4.0", 9 + "version": "0.5.0", 10 10 "license": "AGPL-3.0-only", 11 11 "dependencies": { 12 12 "@atproto/api": "^0.13.35", ··· 29 29 "integrity": "sha512-vsEfBj0C333TLjDppvTdTE0IdKlXuljKSveAeI4PPx/l6eUKNnDTsYxvILtXUVzwUlTDmSRqy5O4Ryh78n1b7g==", 30 30 "license": "MIT", 31 31 "dependencies": { 32 - "@atproto/common-web": "^0.4.0", 32 + "@atproto/common-web": "^0.5.0", 33 33 "@atproto/lexicon": "^0.4.6", 34 34 "@atproto/syntax": "^0.3.2", 35 35 "@atproto/xrpc": "^0.6.8", ··· 58 58 "license": "MIT", 59 59 "dependencies": { 60 60 "@atproto/common-web": "^0.4.2", 61 - "@atproto/syntax": "^0.4.0", 61 + "@atproto/syntax": "^0.5.0", 62 62 "iso-datestring-validator": "^2.2.2", 63 63 "multiformats": "^9.9.0", 64 64 "zod": "^3.23.8" ··· 330 330 "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", 331 331 "license": "MIT", 332 332 "dependencies": { 333 - "emoji-regex": "^10.4.0", 334 - "get-east-asian-width": "^0.4.0", 333 + "emoji-regex": "^10.5.0", 334 + "get-east-asian-width": "^0.5.0", 335 335 "strip-ansi": "^7.1.0" 336 336 }, 337 337 "engines": {
+1 -1
package.json
··· 1 1 { 2 2 "name": "lastfm-importer", 3 - "version": "0.4.0", 3 + "version": "0.5.0", 4 4 "description": "Import Last.fm scrobbles to ATProto with rate limiting", 5 5 "type": "module", 6 6 "main": "./dist/index.js",
+1 -1
src/config.ts
··· 30 30 const platform = 31 31 PLATFORM_LABELS[process.platform] ?? process.platform; 32 32 33 - return `lastfm-importer/v0.4.0 (${platform}; Node/${process.version})`; 33 + return `lastfm-importer/v0.5.0 (${platform}; Node/${process.version})`; 34 34 } 35 35 36 36 const CLIENT_AGENT = buildClientAgent();
+1 -1
src/lib/cli.ts
··· 26 26 */ 27 27 export function showHelp(): void { 28 28 console.log(` 29 - ${'\x1b[1m'}Last.fm to ATProto Importer v0.4.0${'\x1b[0m'} 29 + ${'\x1b[1m'}Last.fm to ATProto Importer v0.5.0${'\x1b[0m'} 30 30 31 31 ${'\x1b[1m'}USAGE:${'\x1b[0m'} 32 32 npm start [options]