Major Features: - Multi-source download system (Soulseek/Lidarr with fallback) - Configurable enrichment speed control (1-5x) - Mobile touch drag support for seek sliders - iOS PWA media controls (Control Center, Lock Screen) - Artist name alias resolution via Last.fm - Circuit breaker pattern for audio analysis Critical Fixes: - Audio analyzer stability (non-ASCII, BrokenProcessPool, OOM) - Discovery system race conditions and import failures - Radio decade categorization using originalYear - LastFM API response normalization - Mood bucket infinite loop prevention Security: - Bull Board admin authentication - Lidarr webhook signature verification - JWT token expiration and refresh - Encryption key validation on startup Closes #2, #6, #9, #13, #21, #26, #31, #34, #35, #37, #40, #43
74 lines
2.3 KiB
JSON
74 lines
2.3 KiB
JSON
{
|
|
"name": "lidify-backend",
|
|
"version": "1.3.0",
|
|
"description": "Lidify backend API server",
|
|
"license": "GPL-3.0",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/Chevron7Locked/lidify.git"
|
|
},
|
|
"scripts": {
|
|
"dev": "tsx watch src/index.ts",
|
|
"build": "tsc",
|
|
"start": "node dist/index.js",
|
|
"db:migrate": "prisma migrate deploy",
|
|
"db:studio": "prisma studio",
|
|
"seed:user": "tsx seeds/createUser.ts",
|
|
"test:smoke": "tsx scripts/smoke.ts",
|
|
"sync": "tsx src/workers/sync.ts"
|
|
},
|
|
"dependencies": {
|
|
"@bull-board/api": "^6.14.2",
|
|
"@bull-board/express": "^6.14.2",
|
|
"@ffmpeg-installer/ffmpeg": "^1.1.0",
|
|
"@prisma/client": "^5.22.0",
|
|
"@types/bull": "^3.15.9",
|
|
"@types/fluent-ffmpeg": "^2.1.28",
|
|
"@types/node-cron": "^3.0.11",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/speakeasy": "^2.0.10",
|
|
"@types/swagger-jsdoc": "^6.0.4",
|
|
"@types/swagger-ui-express": "^4.1.8",
|
|
"axios": "^1.6.2",
|
|
"bcrypt": "^5.1.1",
|
|
"bull": "^4.16.5",
|
|
"connect-redis": "^7.1.0",
|
|
"cors": "^2.8.5",
|
|
"date-fns": "^4.1.0",
|
|
"dotenv": "^16.3.1",
|
|
"express": "^4.18.2",
|
|
"express-rate-limit": "^8.2.1",
|
|
"express-session": "^1.17.3",
|
|
"ffmpeg-static": "^5.2.0",
|
|
"fluent-ffmpeg": "^2.1.3",
|
|
"fuzzball": "^2.2.3",
|
|
"helmet": "^7.1.0",
|
|
"jsonwebtoken": "^9.0.2",
|
|
"music-metadata": "^11.10.0",
|
|
"node-cron": "^4.2.1",
|
|
"p-limit": "^7.2.0",
|
|
"p-queue": "^9.0.0",
|
|
"podcast-index-api": "^1.1.10",
|
|
"qrcode": "^1.5.4",
|
|
"redis": "^4.6.10",
|
|
"rss-parser": "^3.13.0",
|
|
"sharp": "^0.34.5",
|
|
"slsk-client": "^1.1.0",
|
|
"speakeasy": "^2.0.0",
|
|
"swagger-jsdoc": "^6.2.8",
|
|
"swagger-ui-express": "^5.0.1",
|
|
"zod": "^3.22.4"
|
|
},
|
|
"devDependencies": {
|
|
"@types/bcrypt": "^5.0.2",
|
|
"@types/cors": "^2.8.19",
|
|
"@types/express": "^4.17.21",
|
|
"@types/express-session": "^1.17.10",
|
|
"@types/jsonwebtoken": "^9.0.10",
|
|
"@types/node": "^20.10.4",
|
|
"prisma": "^5.22.0",
|
|
"tsx": "^4.7.0",
|
|
"typescript": "^5.3.3"
|
|
}
|
|
}
|