[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
0

Configure Feed

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

remove unused queue package

FoxxMD (May 6, 2026, 2:56 AM UTC) 54da8b0a cfb4131d

-278
-270
package-lock.json
··· 26 26 "@kenyip/backoff-strategies": "^1.0.4", 27 27 "@keyv/valkey": "^1.0.8", 28 28 "@lukehagar/plexjs": "^0.39.0", 29 - "@platformatic/job-queue": "^0.5.0", 30 29 "@supercharge/promise-pool": "^3.0.0", 31 30 "@svrooij/sonos": "^2.5.0", 32 31 "@xhayper/discord-rpc": "^1.3.0", ··· 2029 2028 "@swc/helpers": "^0.5.0" 2030 2029 } 2031 2030 }, 2032 - "node_modules/@ioredis/commands": { 2033 - "version": "1.5.1", 2034 - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz", 2035 - "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==", 2036 - "license": "MIT", 2037 - "optional": true 2038 - }, 2039 2031 "node_modules/@iovalkey/commands": { 2040 2032 "version": "0.1.0", 2041 2033 "license": "MIT" ··· 2636 2628 "url": "https://opencollective.com/parcel" 2637 2629 } 2638 2630 }, 2639 - "node_modules/@pinojs/redact": { 2640 - "version": "0.4.0", 2641 - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", 2642 - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", 2643 - "license": "MIT" 2644 - }, 2645 2631 "node_modules/@pkgjs/parseargs": { 2646 2632 "version": "0.11.0", 2647 2633 "license": "MIT", 2648 2634 "optional": true, 2649 2635 "engines": { 2650 2636 "node": ">=14" 2651 - } 2652 - }, 2653 - "node_modules/@platformatic/job-queue": { 2654 - "version": "0.5.0", 2655 - "resolved": "https://registry.npmjs.org/@platformatic/job-queue/-/job-queue-0.5.0.tgz", 2656 - "integrity": "sha512-vAD4HmVy3IdDhv74+282j6YS9N8wbziWT/T1IPBQNsQO+ObKiZNfDQFeakAIEUp0w80vFJyrgy42knxJ97ACgQ==", 2657 - "license": "Apache-2.0", 2658 - "dependencies": { 2659 - "pino": "^10.3.1" 2660 - }, 2661 - "engines": { 2662 - "node": ">=22.19.0" 2663 - }, 2664 - "optionalDependencies": { 2665 - "fast-write-atomic": "^0.4.0", 2666 - "iovalkey": "^0.2.0", 2667 - "pg": "^8.20.0" 2668 - } 2669 - }, 2670 - "node_modules/@platformatic/job-queue/node_modules/iovalkey": { 2671 - "version": "0.2.2", 2672 - "resolved": "https://registry.npmjs.org/iovalkey/-/iovalkey-0.2.2.tgz", 2673 - "integrity": "sha512-7eVmLOYV2UamZ/YPXuUwTu/4zBDxXcfjj/wmOwlKBBhU2qjg60Th0Y/cqfED3OxNAhc6hUV2Ft4eQMCKi2EMpQ==", 2674 - "license": "MIT", 2675 - "optional": true, 2676 - "dependencies": { 2677 - "@ioredis/commands": "^1.1.1", 2678 - "cluster-key-slot": "^1.1.0", 2679 - "debug": "^4.3.4", 2680 - "denque": "^2.1.0", 2681 - "lodash.defaults": "^4.2.0", 2682 - "lodash.isarguments": "^3.1.0", 2683 - "redis-errors": "^1.2.0", 2684 - "redis-parser": "^3.0.0", 2685 - "standard-as-callback": "^2.1.0" 2686 - }, 2687 - "engines": { 2688 - "node": ">=18.12.0" 2689 - } 2690 - }, 2691 - "node_modules/@platformatic/job-queue/node_modules/pino": { 2692 - "version": "10.3.1", 2693 - "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", 2694 - "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", 2695 - "license": "MIT", 2696 - "dependencies": { 2697 - "@pinojs/redact": "^0.4.0", 2698 - "atomic-sleep": "^1.0.0", 2699 - "on-exit-leak-free": "^2.1.0", 2700 - "pino-abstract-transport": "^3.0.0", 2701 - "pino-std-serializers": "^7.0.0", 2702 - "process-warning": "^5.0.0", 2703 - "quick-format-unescaped": "^4.0.3", 2704 - "real-require": "^0.2.0", 2705 - "safe-stable-stringify": "^2.3.1", 2706 - "sonic-boom": "^4.0.1", 2707 - "thread-stream": "^4.0.0" 2708 - }, 2709 - "bin": { 2710 - "pino": "bin.js" 2711 - } 2712 - }, 2713 - "node_modules/@platformatic/job-queue/node_modules/pino-abstract-transport": { 2714 - "version": "3.0.0", 2715 - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", 2716 - "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", 2717 - "license": "MIT", 2718 - "dependencies": { 2719 - "split2": "^4.0.0" 2720 - } 2721 - }, 2722 - "node_modules/@platformatic/job-queue/node_modules/process-warning": { 2723 - "version": "5.0.0", 2724 - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", 2725 - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", 2726 - "funding": [ 2727 - { 2728 - "type": "github", 2729 - "url": "https://github.com/sponsors/fastify" 2730 - }, 2731 - { 2732 - "type": "opencollective", 2733 - "url": "https://opencollective.com/fastify" 2734 - } 2735 - ], 2736 - "license": "MIT" 2737 - }, 2738 - "node_modules/@platformatic/job-queue/node_modules/thread-stream": { 2739 - "version": "4.0.0", 2740 - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", 2741 - "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", 2742 - "license": "MIT", 2743 - "dependencies": { 2744 - "real-require": "^0.2.0" 2745 - }, 2746 - "engines": { 2747 - "node": ">=20" 2748 2637 } 2749 2638 }, 2750 2639 "node_modules/@protobufjs/aspromise": { ··· 8959 8848 "version": "3.0.3", 8960 8849 "license": "BSD-3-Clause" 8961 8850 }, 8962 - "node_modules/fast-write-atomic": { 8963 - "version": "0.4.0", 8964 - "resolved": "https://registry.npmjs.org/fast-write-atomic/-/fast-write-atomic-0.4.0.tgz", 8965 - "integrity": "sha512-O0AGqOsuOgsVXFiF/vIm7c+NHRZB6c6IDMBVPWc8rLGWVW7FYaBBfzhqxKlKyGKVF5tPR4drUOxE02lDiWjbSg==", 8966 - "license": "MIT", 8967 - "optional": true, 8968 - "engines": { 8969 - "node": ">=20" 8970 - } 8971 - }, 8972 8851 "node_modules/fast-xml-parser": { 8973 8852 "version": "3.19.0", 8974 8853 "license": "MIT", ··· 12350 12229 "dev": true, 12351 12230 "license": "MIT" 12352 12231 }, 12353 - "node_modules/pg": { 12354 - "version": "8.20.0", 12355 - "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", 12356 - "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", 12357 - "license": "MIT", 12358 - "optional": true, 12359 - "dependencies": { 12360 - "pg-connection-string": "^2.12.0", 12361 - "pg-pool": "^3.13.0", 12362 - "pg-protocol": "^1.13.0", 12363 - "pg-types": "2.2.0", 12364 - "pgpass": "1.0.5" 12365 - }, 12366 - "engines": { 12367 - "node": ">= 16.0.0" 12368 - }, 12369 - "optionalDependencies": { 12370 - "pg-cloudflare": "^1.3.0" 12371 - }, 12372 - "peerDependencies": { 12373 - "pg-native": ">=3.0.1" 12374 - }, 12375 - "peerDependenciesMeta": { 12376 - "pg-native": { 12377 - "optional": true 12378 - } 12379 - } 12380 - }, 12381 - "node_modules/pg-cloudflare": { 12382 - "version": "1.3.0", 12383 - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", 12384 - "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", 12385 - "license": "MIT", 12386 - "optional": true 12387 - }, 12388 - "node_modules/pg-connection-string": { 12389 - "version": "2.12.0", 12390 - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", 12391 - "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", 12392 - "license": "MIT", 12393 - "optional": true 12394 - }, 12395 - "node_modules/pg-int8": { 12396 - "version": "1.0.1", 12397 - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 12398 - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 12399 - "license": "ISC", 12400 - "optional": true, 12401 - "engines": { 12402 - "node": ">=4.0.0" 12403 - } 12404 - }, 12405 - "node_modules/pg-pool": { 12406 - "version": "3.13.0", 12407 - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz", 12408 - "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==", 12409 - "license": "MIT", 12410 - "optional": true, 12411 - "peerDependencies": { 12412 - "pg": ">=8.0" 12413 - } 12414 - }, 12415 - "node_modules/pg-protocol": { 12416 - "version": "1.13.0", 12417 - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", 12418 - "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", 12419 - "license": "MIT", 12420 - "optional": true 12421 - }, 12422 - "node_modules/pg-types": { 12423 - "version": "2.2.0", 12424 - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 12425 - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 12426 - "license": "MIT", 12427 - "optional": true, 12428 - "dependencies": { 12429 - "pg-int8": "1.0.1", 12430 - "postgres-array": "~2.0.0", 12431 - "postgres-bytea": "~1.0.0", 12432 - "postgres-date": "~1.0.4", 12433 - "postgres-interval": "^1.1.0" 12434 - }, 12435 - "engines": { 12436 - "node": ">=4" 12437 - } 12438 - }, 12439 - "node_modules/pgpass": { 12440 - "version": "1.0.5", 12441 - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 12442 - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 12443 - "license": "MIT", 12444 - "optional": true, 12445 - "dependencies": { 12446 - "split2": "^4.1.0" 12447 - } 12448 - }, 12449 12232 "node_modules/phin": { 12450 12233 "version": "3.7.1", 12451 12234 "license": "MIT", ··· 12649 12432 "version": "4.2.0", 12650 12433 "dev": true, 12651 12434 "license": "MIT" 12652 - }, 12653 - "node_modules/postgres-array": { 12654 - "version": "2.0.0", 12655 - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 12656 - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 12657 - "license": "MIT", 12658 - "optional": true, 12659 - "engines": { 12660 - "node": ">=4" 12661 - } 12662 - }, 12663 - "node_modules/postgres-bytea": { 12664 - "version": "1.0.1", 12665 - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", 12666 - "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", 12667 - "license": "MIT", 12668 - "optional": true, 12669 - "engines": { 12670 - "node": ">=0.10.0" 12671 - } 12672 - }, 12673 - "node_modules/postgres-date": { 12674 - "version": "1.0.7", 12675 - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 12676 - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 12677 - "license": "MIT", 12678 - "optional": true, 12679 - "engines": { 12680 - "node": ">=0.10.0" 12681 - } 12682 - }, 12683 - "node_modules/postgres-interval": { 12684 - "version": "1.2.0", 12685 - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 12686 - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 12687 - "license": "MIT", 12688 - "optional": true, 12689 - "dependencies": { 12690 - "xtend": "^4.0.0" 12691 - }, 12692 - "engines": { 12693 - "node": ">=0.10.0" 12694 - } 12695 12435 }, 12696 12436 "node_modules/prelude-ls": { 12697 12437 "version": "1.2.1", ··· 15894 15634 "license": "MIT", 15895 15635 "engines": { 15896 15636 "node": ">=4.0" 15897 - } 15898 - }, 15899 - "node_modules/xtend": { 15900 - "version": "4.0.2", 15901 - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 15902 - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 15903 - "license": "MIT", 15904 - "optional": true, 15905 - "engines": { 15906 - "node": ">=0.4" 15907 15637 } 15908 15638 }, 15909 15639 "node_modules/y18n": {
-1
package.json
··· 64 64 "@kenyip/backoff-strategies": "^1.0.4", 65 65 "@keyv/valkey": "^1.0.8", 66 66 "@lukehagar/plexjs": "^0.39.0", 67 - "@platformatic/job-queue": "^0.5.0", 68 67 "@supercharge/promise-pool": "^3.0.0", 69 68 "@svrooij/sonos": "^2.5.0", 70 69 "@xhayper/discord-rpc": "^1.3.0",
-7
src/backend/scrobblers/AbstractScrobbleClient.ts
··· 72 72 import {isErrorLike, serializeError} from 'serialize-error'; 73 73 import { DEFAULT_NEW_PADDING, groupPlaysToTimeRanges } from "../utils/ListenFetchUtils.js"; 74 74 import { spawn, catchAbortError, isAbortError, rethrowAbortError, delay, forever, AbortError, throwIfAborted } from 'abort-controller-x'; 75 - import { Queue, MemoryStorage } from '@platformatic/job-queue' 76 75 import { DrizzlePlayRepository, playToRepositoryCreatePlayOpts, QueryPlaysOpts } from "../common/database/drizzle/repositories/PlayRepository.js"; 77 76 import { PlaySelect, PlaySelectRel, QueueStateNew, QueueStateSelect } from "../common/database/drizzle/drizzleTypes.js"; 78 77 import { asPlay } from "../../core/PlayMarshalUtils.js"; ··· 133 132 dupeLogger: Logger; 134 133 deadLogger: Logger; 135 134 136 - scrobbleQueue: Queue<{payload: QueuedScrobble<PlayObject>}, {scrobbled: ScrobbledPlayObject}>; 137 - 138 135 existingScrobble: (playObjPre: PlayObject, existingScrobbles: PlayObject[], log?: boolean) => Promise<PlayMatchResult> 139 136 140 137 declare config: CommonClientConfig; ··· 169 166 this.deadLogger = childLogger(this.logger, CLIENT_DEAD_QUEUE); 170 167 this.notifier = notifier; 171 168 this.emitter = emitter; 172 - this.scrobbleQueue = new Queue<{payload: QueuedScrobble<PlayObject>}, {scrobbled: ScrobbledPlayObject}>({ 173 - storage: new MemoryStorage(), 174 - concurrency: 1 175 - }); 176 169 this.playRepo = new DrizzlePlayRepository(this.db, {logger: this.logger,}); 177 170 this.queueRepo = new DrizzleQueueRepository(this.db, {logger: this.logger}); 178 171