{ "name": "multi-scrobbler", "version": "0.13.1", "type": "module", "description": "scrobble plays from multiple sources to multiple clients", "scripts": { "schema": "npm run -s schema:docs && npm run -s schema:app", "schema:docs": "tsx src/backend/utils/SchemaDocsStaticUtils.ts", "schema:app": "tsx src/backend/utils/SchemaAppStaticUtils.ts", "circular": "madge --circular --extensions ts src/index.ts", "test": "npm run -s test:backend", "test:backend": "mocha --reporter spec", "dev": "nodemon -w src/backend -x tsx src/backend/index.ts", "start": "NODE_ENV=production tsx src/backend/index.ts", "build:frontend": "vite build", "build:backend": "tsc -p src/backend && npm run -s schema:app", "build": "npm run -s build:backend && npm run -s build:frontend && npm run -s docs:build", "build:parallel": "concurrently --kill-others-on-fail --names backend,frontend,docs \"npm run -s build:backend\" \"npm run -s build:frontend\" \"npm run docs:build\"", "docs:install": "cd docsite && npm install --no-audit", "docs:start": "cd docsite && npm start", "docs:build": "npm run -s schema:docs && cd docsite && npm run build", "docs:netlify": "npm run -s docs:install && npm run -s docs:build", "postinstall": "patch-package", "install:parallel": "concurrently --kill-others-on-fail --names app,docs \"npm ci --no-audit\" \"npm run docs:install\"", "cliff": "git-cliff --unreleased", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" }, "exports": { ".": { "types": "./src/backend/common/infrastructure/typings/lastfm-node-client.d.ts", "import": "./src/backend/index.js" } }, "engines": { "node": ">=24.14.0", "npm": "^11.12.1" }, "repository": { "type": "git", "url": "git+https://github.com/FoxxMD/multi-scrobbler.git" }, "author": "", "license": "MIT", "bugs": { "url": "https://github.com/FoxxMD/multi-scrobbler/issues" }, "private": true, "homepage": ".", "dependencies": { "@astronautlabs/mdns": "^1.0.7", "@atcute/identity-resolver-node": "^1.0.3", "@atproto/api": "^0.18.0", "@atproto/oauth-client-node": "^0.3.10", "@donedeal0/superdiff": "^1.1.1", "@ewanc26/tid": "^1.0.2", "@foxxmd/chromecast-client": "^1.0.4", "@foxxmd/get-version": "^0.0.3", "@foxxmd/logging": "^0.2.6", "@foxxmd/redact-string": "^0.1.2", "@foxxmd/regex-buddy-core": "^0.1.2", "@foxxmd/string-sameness": "^0.4.0", "@jellyfin/sdk": "^0.11.0", "@kenyip/backoff-strategies": "^1.0.4", "@keyv/valkey": "^1.0.8", "@lukehagar/plexjs": "^0.39.0", "@supercharge/promise-pool": "^3.0.0", "@svrooij/sonos": "^2.5.0", "@xhayper/discord-rpc": "^1.3.0", "abort-controller-x": "^0.5.0", "address": "^1.2.2", "ajv": "^8.18.0", "ajv-formats": "^3.0.1", "avahi-browse": "^1.1.4", "better-sse": "^0.8.0", "body-parser": "^2.2.2", "cacheable": "^1.10.4", "castv2": "^0.1.10", "clone": "^2.1.2", "common-tags": "^1.8.2", "compare-versions": "^4.1.2", "concat-stream": "^2.0.0", "cors": "^2.8.5", "dayjs": "^1.10.4", "dbus-ts": "^0.0.7", "discord.js": "^14.26.0", "dotenv": "^10.0.0", "express": "^5.2.1", "express-session": "^1.19.0", "fast-equals": "^6.0.0", "fixed-size-list": "^0.3.0", "flat-cache": "^6.1.13", "formidable": "^3.5", "glob": "^11.1.0", "google-auth-library": "^9.15.0", "gotify": "^1.1.0", "http-cookie-agent": "^7.0.1", "icecast-metadata-stats": "^0.1.12", "iso-websocket": "^0.3.0", "iti": "^0.7.0", "json-diff-ts": "^5.0.0-alpha.2", "json5": "^2.2.3", "jsondiffpatch": "^0.7.3", "keyv": "^5.5.0", "kodi-api": "^0.2.1", "lastfm-ts-api": "^2.6.0", "merge-error-cause": "^5.0.2", "mopidy": "^1.3.0", "mpc-js": "^2.1.1", "musicbrainz-api": "^0.27.0", "nanoid": "^3.3.1", "node-object-hash": "^3.1.1", "normalize-url": "^8.0.1", "ntfy": "^1.15.2", "p-event": "^4.2.0", "p-map": "^7.0.4", "p-retry": "^7.1.1", "passport": "^0.6.0", "passport-deezer": "^0.2.0", "patch-package": "^8.0.1", "prom-client": "^15.1.3", "round-robin-js": "^3.0.10", "serialize-error": "^13.0.1", "spotify-web-api-node": "^5.0.2", "superagent": "^8.0.9", "toad-scheduler": "^3.0.0", "tough-cookie": "^5.1.2", "ts-json-schema-generator": "^2.3.0", "tsx": "^4.21.0", "typeson": "^9.0.4", "typeson-registry": "^11.1.1", "undici": "7.24.6", "vite-express": "^0.22.1", "vlc-client": "^1.1.1", "xml2js": "0.6.2", "youtubei.js": "^15.0.1" }, "devDependencies": { "@chakra-ui/react": "^3.34.0", "@chromatic-com/storybook": "^5.0.1", "@curvenote/ansi-to-react": "^7.0.0", "@dbus-types/notifications": "^0.0.5", "@emotion/react": "^11.14.0", "@eslint/js": "^8.56.0", "@faker-js/faker": "^9.0.1", "@fortawesome/fontawesome-svg-core": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.6", "@gr2m/net-interceptor": "^1.0.0", "@react-nano/use-event-source": "^0.13.0", "@reduxjs/toolkit": "^1.9.7", "@storybook/addon-a11y": "10.1.11", "@storybook/addon-docs": "10.1.11", "@storybook/react-vite": "10.1.11", "@tailwindcss/vite": "^4.2.2", "@tsconfig/node18": "^1.0.1", "@types/chai": "^4.3.0", "@types/chai-as-promised": "^7.1.5", "@types/clone": "^2.1.2", "@types/common-tags": "^1.8.1", "@types/concat-stream": "^2.0.0", "@types/cors": "^2.8.17", "@types/express": "^5.0.6", "@types/express-serve-static-core": "^5.1.1", "@types/express-session": "^1.18.2", "@types/formidable": "^3.4.5", "@types/jest": "^27.5.2", "@types/jscodeshift": "^0.11.6", "@types/mocha": "^9.1.0", "@types/node": "^20.19.2", "@types/object-hash": "^3.0.0", "@types/passport": "^1.0.12", "@types/react": "^18.2.18", "@types/react-dom": "^18.2.7", "@types/react-window": "^1.8.5", "@types/sinon": "^21.0.0", "@types/spotify-web-api-node": "^5.0.7", "@types/superagent": "^8.1.9", "@types/xml2js": "^0.4.11", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.27", "chai": "^4.3.6", "chai-as-promised": "^8.0.2", "clsx": "^2.1.1", "eslint": "^8.56.0", "eslint-plugin-prefer-arrow-functions": "^3.2.4", "eslint-plugin-storybook": "10.1.11", "git-cliff": "^2.12.0", "jsondiffpatch-react": "^1.0.8", "mocha": "^10.3.0", "mockdate": "^3.0.5", "msw": "^2.12.10", "neotraverse": "^0.6.18", "next-themes": "^0.4.6", "nodemon": "^3.0.3", "playwright": "^1.58.2", "react": "^18.3.1", "react-dom": "^18.3.1", "react-error-boundary": "^6.1.1", "react-icons": "^5.6.0", "react-redux": "^8.1.3", "react-router-dom": "^6.30.3", "react-virtuoso": "^4.18.4", "sass": "^1.99.0", "shiki": "^4.0.2", "sinon": "^21.0.2", "storybook": "10.2.0", "tailwindcss": "^4.2.2", "ts-essentials": "^10.1.1", "typescript": "^5.9.3", "typescript-eslint": "^7.0.1", "vite": "^5.4.21", "with-local-tmp-dir": "^6.0.0" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] }, "overrides": { "spotify-web-api-node": { "superagent": "$superagent" } } }