@muhammedaksam/easiarr 1.4.0 → 1.4.1

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.
Files changed (109) hide show
  1. package/dist/index.js +29837 -0
  2. package/package.json +15 -15
  3. package/src/VersionInfo.ts +0 -12
  4. package/src/api/arr-api.ts +0 -521
  5. package/src/api/auto-setup-types.ts +0 -64
  6. package/src/api/base-api.ts +0 -216
  7. package/src/api/bazarr-api.ts +0 -297
  8. package/src/api/cloudflare-api.ts +0 -493
  9. package/src/api/custom-format-api.ts +0 -224
  10. package/src/api/grafana-api.ts +0 -230
  11. package/src/api/heimdall-api.ts +0 -141
  12. package/src/api/homarr-api.ts +0 -209
  13. package/src/api/huntarr-api.ts +0 -457
  14. package/src/api/index.ts +0 -9
  15. package/src/api/jellyfin-api.ts +0 -389
  16. package/src/api/jellyseerr-api.ts +0 -559
  17. package/src/api/maintainerr-api.ts +0 -461
  18. package/src/api/naming-config.ts +0 -101
  19. package/src/api/overseerr-api.ts +0 -392
  20. package/src/api/plex-api.ts +0 -308
  21. package/src/api/portainer-api.ts +0 -374
  22. package/src/api/profilarr-api.ts +0 -391
  23. package/src/api/prowlarr-api.ts +0 -488
  24. package/src/api/qbittorrent-api.ts +0 -300
  25. package/src/api/quality-profile-api.ts +0 -272
  26. package/src/api/tautulli-api.ts +0 -244
  27. package/src/api/uptime-kuma-api.ts +0 -343
  28. package/src/apps/categories.ts +0 -14
  29. package/src/apps/index.ts +0 -2
  30. package/src/apps/registry.ts +0 -1275
  31. package/src/compose/caddy-config.ts +0 -130
  32. package/src/compose/generator.ts +0 -287
  33. package/src/compose/index.ts +0 -7
  34. package/src/compose/templates.ts +0 -78
  35. package/src/compose/traefik-config.ts +0 -187
  36. package/src/config/bookmarks-generator.ts +0 -160
  37. package/src/config/defaults.ts +0 -37
  38. package/src/config/homepage-config.ts +0 -381
  39. package/src/config/index.ts +0 -6
  40. package/src/config/manager.ts +0 -150
  41. package/src/config/recyclarr-config.ts +0 -181
  42. package/src/config/schema.ts +0 -310
  43. package/src/config/slskd-config.ts +0 -86
  44. package/src/config/soularr-config.ts +0 -105
  45. package/src/config/trash-quality-definitions.ts +0 -213
  46. package/src/data/lidarr-custom-formats.ts +0 -127
  47. package/src/data/trash-profiles.ts +0 -333
  48. package/src/docker/client.ts +0 -312
  49. package/src/docker/index.ts +0 -18
  50. package/src/index.ts +0 -77
  51. package/src/setup/actions/arr-common.ts +0 -307
  52. package/src/setup/actions/dashboards.ts +0 -79
  53. package/src/setup/actions/download-clients.ts +0 -54
  54. package/src/setup/actions/jellyseerr.ts +0 -331
  55. package/src/setup/actions/media-servers.ts +0 -68
  56. package/src/setup/actions/monitoring.ts +0 -120
  57. package/src/setup/actions/prowlarr.ts +0 -137
  58. package/src/setup/actions/utilities.ts +0 -490
  59. package/src/setup/index.ts +0 -78
  60. package/src/setup/types.ts +0 -144
  61. package/src/structure/manager.ts +0 -129
  62. package/src/ui/App.ts +0 -111
  63. package/src/ui/components/ApplicationSelector.ts +0 -275
  64. package/src/ui/components/CredentialsForm.ts +0 -180
  65. package/src/ui/components/DownloadClientForm.ts +0 -114
  66. package/src/ui/components/FileEditor.ts +0 -91
  67. package/src/ui/components/FooterHint.ts +0 -119
  68. package/src/ui/components/PageLayout.ts +0 -160
  69. package/src/ui/components/UpdateNotification.ts +0 -102
  70. package/src/ui/index.ts +0 -7
  71. package/src/ui/screens/AdvancedSettings.ts +0 -188
  72. package/src/ui/screens/ApiKeyViewer.ts +0 -511
  73. package/src/ui/screens/AppConfigurator.ts +0 -543
  74. package/src/ui/screens/AppManager.ts +0 -284
  75. package/src/ui/screens/ContainerControl.ts +0 -581
  76. package/src/ui/screens/LogsViewer.ts +0 -478
  77. package/src/ui/screens/MainMenu.ts +0 -299
  78. package/src/ui/screens/MonitorDashboard.ts +0 -881
  79. package/src/ui/screens/SecretsEditor.ts +0 -216
  80. package/src/ui/screens/SettingsScreen.ts +0 -633
  81. package/src/ui/screens/index.ts +0 -22
  82. package/src/ui/screens/setup/BaseAppSetupScreen.ts +0 -375
  83. package/src/ui/screens/setup/CloudflaredSetup.ts +0 -460
  84. package/src/ui/screens/setup/FullAutoSetup.ts +0 -766
  85. package/src/ui/screens/setup/HomepageSetup.ts +0 -165
  86. package/src/ui/screens/setup/JellyfinSetup.ts +0 -328
  87. package/src/ui/screens/setup/JellyseerrSetup.ts +0 -242
  88. package/src/ui/screens/setup/ProwlarrSetup.ts +0 -500
  89. package/src/ui/screens/setup/QBittorrentSetup.ts +0 -221
  90. package/src/ui/screens/setup/QuickSetup.ts +0 -1169
  91. package/src/ui/screens/setup/RecyclarrSetup.ts +0 -270
  92. package/src/ui/screens/setup/TRaSHProfileSetup.ts +0 -381
  93. package/src/utils/arch.ts +0 -78
  94. package/src/utils/browser.ts +0 -27
  95. package/src/utils/categories.ts +0 -61
  96. package/src/utils/debug.ts +0 -84
  97. package/src/utils/env.ts +0 -138
  98. package/src/utils/index.ts +0 -8
  99. package/src/utils/logs.ts +0 -119
  100. package/src/utils/migrations/1765626338_rename_env_variables.ts +0 -102
  101. package/src/utils/migrations/1765707135_rename_easiarr_status.ts +0 -91
  102. package/src/utils/migrations/1765732722_remove_cloudflare_dns_api_token.ts +0 -45
  103. package/src/utils/migrations/1769515650_migrate_to_xdg.ts +0 -114
  104. package/src/utils/migrations.ts +0 -165
  105. package/src/utils/password.ts +0 -42
  106. package/src/utils/paths.ts +0 -33
  107. package/src/utils/unraid.ts +0 -103
  108. package/src/utils/update-checker.ts +0 -210
  109. package/src/utils/url-utils.ts +0 -38
@@ -1,86 +0,0 @@
1
- /**
2
- * Slskd Config Generator
3
- * Generates slskd.yml configuration file with API keys and settings
4
- * Source: https://github.com/slskd/slskd/blob/master/docs/config.md
5
- */
6
-
7
- import { randomBytes } from "crypto"
8
-
9
- import type { EasiarrConfig } from "./schema"
10
- import { readEnvSync } from "~/utils/env"
11
-
12
- /**
13
- * Generate a random API key (base64, 48 bytes = ~64 chars)
14
- * Equivalent to: openssl rand -base64 48
15
- */
16
- export function generateSlskdApiKey(): string {
17
- return randomBytes(48).toString("base64")
18
- }
19
-
20
- /**
21
- * Generate slskd.yml content
22
- * This file should be placed in the slskd config directory (/app/slskd.yml)
23
- */
24
- export function generateSlskdConfig(_config: EasiarrConfig): { yaml: string; apiKey: string } {
25
- const env = readEnvSync()
26
-
27
- // Generate or use existing API key
28
- const apiKey = env.API_KEY_SLSKD || generateSlskdApiKey()
29
-
30
- const yaml = `# Slskd Configuration
31
- # Generated by Easiarr
32
- # Docs: https://github.com/slskd/slskd/blob/master/docs/config.md
33
-
34
- # Directories for downloads
35
- directories:
36
- incomplete: /data/slskd_downloads/incomplete
37
- downloads: /data/slskd_downloads/complete
38
-
39
- # Shares - music directory for uploading
40
- shares:
41
- directories:
42
- - /data/media/music
43
-
44
- # Web UI Configuration
45
- web:
46
- port: 5030
47
- authentication:
48
- disabled: false
49
- api_keys:
50
- # API key for Homepage widget and Soularr
51
- easiarr:
52
- key: ${apiKey}
53
- role: readwrite
54
- cidr: 0.0.0.0/0,::/0
55
-
56
- # Soulseek Configuration
57
- # Credentials are set via environment variables:
58
- # - SLSKD_SLSK_USERNAME
59
- # - SLSKD_SLSK_PASSWORD
60
- soulseek:
61
- listen_port: 50300
62
- description: "slskd user via Easiarr"
63
-
64
- # Global limits
65
- global:
66
- upload:
67
- slots: 10
68
- speed_limit: 1000
69
- download:
70
- slots: 100
71
- speed_limit: 10000
72
-
73
- # Logging
74
- logger:
75
- disk: false
76
- `
77
-
78
- return { yaml, apiKey }
79
- }
80
-
81
- /**
82
- * Get the path where slskd.yml should be saved
83
- */
84
- export function getSlskdConfigPath(rootDir: string): string {
85
- return `${rootDir}/config/slskd/slskd.yml`
86
- }
@@ -1,105 +0,0 @@
1
- /**
2
- * Soularr Config Generator
3
- * Generates config.ini for Soularr based on easiarr configuration
4
- * Source: https://github.com/mrusse/soularr
5
- */
6
-
7
- import type { EasiarrConfig } from "./schema"
8
- import { readEnvSync } from "~/utils/env"
9
-
10
- /**
11
- * Generate Soularr config.ini content
12
- * This file should be placed in the Soularr config directory
13
- */
14
- export function generateSoularrConfig(config: EasiarrConfig): string {
15
- const env = readEnvSync()
16
-
17
- const lidarrApiKey = env.API_KEY_LIDARR || "yourlidarrapikeygoeshere"
18
- const slskdApiKey = env.API_KEY_SLSKD || "yourslskdapikeygoeshere"
19
-
20
- // Find Lidarr and Slskd ports from config
21
- const lidarrPort = config.apps.find((a) => a.id === "lidarr")?.port || 8686
22
- const slskdPort = config.apps.find((a) => a.id === "slskd")?.port || 5030
23
-
24
- return `[Lidarr]
25
- # Get from Lidarr: Settings > General > Security
26
- api_key = ${lidarrApiKey}
27
- # URL Lidarr uses (internal Docker network)
28
- host_url = http://lidarr:${lidarrPort}
29
- # Path to slskd downloads inside the Lidarr container
30
- download_dir = /data/slskd_downloads
31
- # If true, Lidarr won't auto-import from Slskd (recommended: True to avoid failed_imports issues)
32
- disable_sync = True
33
-
34
- [Slskd]
35
- # Create manually in Slskd web UI
36
- api_key = ${slskdApiKey}
37
- # URL Slskd uses (internal Docker network)
38
- host_url = http://slskd:${slskdPort}
39
- url_base = /
40
- # Download path inside Slskd container
41
- download_dir = /downloads
42
- # Delete search after Soularr runs
43
- delete_searches = False
44
- # Max seconds to wait for downloads (prevents infinite hangs)
45
- stalled_timeout = 3600
46
-
47
- [Release Settings]
48
- # Pick release with most common track count
49
- use_most_common_tracknum = True
50
- allow_multi_disc = True
51
- # Accepted release countries
52
- accepted_countries = Europe,Japan,United Kingdom,United States,[Worldwide],Australia,Canada
53
- # Don't check the region of the release
54
- skip_region_check = False
55
- # Accepted formats
56
- accepted_formats = CD,Digital Media,Vinyl
57
-
58
- [Search Settings]
59
- search_timeout = 5000
60
- maximum_peer_queue = 50
61
- # Minimum upload speed (bits/sec)
62
- minimum_peer_upload_speed = 0
63
- # Minimum match ratio between Lidarr track and Soulseek filename
64
- minimum_filename_match_ratio = 0.8
65
- # Preferred file types and qualities (most to least preferred)
66
- allowed_filetypes = flac 24/192,flac 16/44.1,flac,mp3 320,mp3
67
- ignored_users =
68
- # Set to False to only search for album titles
69
- search_for_tracks = True
70
- # Prepend artist name when searching
71
- album_prepend_artist = False
72
- track_prepend_artist = True
73
- # Search modes: all, incrementing_page, first_page
74
- search_type = incrementing_page
75
- # Albums to process per run
76
- number_of_albums_to_grab = 10
77
- # Unmonitor album on failure
78
- remove_wanted_on_failure = False
79
- # Blacklist words in album or track titles
80
- title_blacklist =
81
- # Lidarr search source: "missing" or "cutoff_unmet"
82
- search_source = missing
83
- # Enable search denylist to skip albums that repeatedly fail
84
- enable_search_denylist = False
85
- # Number of consecutive search failures before denylisting
86
- max_search_failures = 3
87
-
88
- [Download Settings]
89
- download_filtering = True
90
- use_extension_whitelist = False
91
- extensions_whitelist = lrc,nfo,txt
92
-
93
- [Logging]
94
- level = INFO
95
- format = [%(levelname)s|%(module)s|L%(lineno)d] %(asctime)s: %(message)s
96
- datefmt = %Y-%m-%dT%H:%M:%S%z
97
- `
98
- }
99
-
100
- /**
101
- * Get the path where Soularr config should be saved
102
- */
103
- export function getSoularrConfigPath(rootDir: string): string {
104
- return `${rootDir}/config/soularr/config.ini`
105
- }
@@ -1,213 +0,0 @@
1
- /**
2
- * TRaSH Guides Quality Definitions (File Size Limits)
3
- * Min/Preferred/Max in MB/min
4
- * Source: ../Guides/docs/json/radarr/quality-size/movie.json
5
- * Source: ../Guides/docs/json/sonarr/quality-size/series.json
6
- */
7
-
8
- export interface TrashQualityDefinition {
9
- quality: string
10
- min: number
11
- preferred: number
12
- max: number
13
- }
14
-
15
- export const TRASH_RADARR_QUALITY_DEFINITIONS: TrashQualityDefinition[] = [
16
- {
17
- quality: "HDTV-720p",
18
- min: 17.1,
19
- preferred: 1999,
20
- max: 2000,
21
- },
22
- {
23
- quality: "WEBDL-720p",
24
- min: 12.5,
25
- preferred: 1999,
26
- max: 2000,
27
- },
28
- {
29
- quality: "WEBRip-720p",
30
- min: 12.5,
31
- preferred: 1999,
32
- max: 2000,
33
- },
34
- {
35
- quality: "Bluray-720p",
36
- min: 25.7,
37
- preferred: 1999,
38
- max: 2000,
39
- },
40
- {
41
- quality: "HDTV-1080p",
42
- min: 33.8,
43
- preferred: 1999,
44
- max: 2000,
45
- },
46
- {
47
- quality: "WEBDL-1080p",
48
- min: 12.5,
49
- preferred: 1999,
50
- max: 2000,
51
- },
52
- {
53
- quality: "WEBRip-1080p",
54
- min: 12.5,
55
- preferred: 1999,
56
- max: 2000,
57
- },
58
- {
59
- quality: "Bluray-1080p",
60
- min: 50.8,
61
- preferred: 1999,
62
- max: 2000,
63
- },
64
- {
65
- quality: "Remux-1080p",
66
- min: 102,
67
- preferred: 1999,
68
- max: 2000,
69
- },
70
- {
71
- quality: "HDTV-2160p",
72
- min: 85,
73
- preferred: 1999,
74
- max: 2000,
75
- },
76
- {
77
- quality: "WEBDL-2160p",
78
- min: 34.5,
79
- preferred: 1999,
80
- max: 2000,
81
- },
82
- {
83
- quality: "WEBRip-2160p",
84
- min: 34.5,
85
- preferred: 1999,
86
- max: 2000,
87
- },
88
- {
89
- quality: "Bluray-2160p",
90
- min: 102,
91
- preferred: 1999,
92
- max: 2000,
93
- },
94
- {
95
- quality: "Remux-2160p",
96
- min: 187.4,
97
- preferred: 1999,
98
- max: 2000,
99
- },
100
- ]
101
-
102
- export const TRASH_SONARR_QUALITY_DEFINITIONS: TrashQualityDefinition[] = [
103
- {
104
- quality: "HDTV-720p",
105
- min: 10,
106
- preferred: 995,
107
- max: 1000,
108
- },
109
- {
110
- quality: "HDTV-1080p",
111
- min: 15,
112
- preferred: 995,
113
- max: 1000,
114
- },
115
- {
116
- quality: "WEBRip-720p",
117
- min: 10,
118
- preferred: 995,
119
- max: 1000,
120
- },
121
- {
122
- quality: "WEBDL-720p",
123
- min: 10,
124
- preferred: 995,
125
- max: 1000,
126
- },
127
- {
128
- quality: "Bluray-720p",
129
- min: 17.1,
130
- preferred: 995,
131
- max: 1000,
132
- },
133
- {
134
- quality: "WEBRip-1080p",
135
- min: 15,
136
- preferred: 995,
137
- max: 1000,
138
- },
139
- {
140
- quality: "WEBDL-1080p",
141
- min: 15,
142
- preferred: 995,
143
- max: 1000,
144
- },
145
- {
146
- quality: "Bluray-1080p",
147
- min: 50.4,
148
- preferred: 995,
149
- max: 1000,
150
- },
151
- {
152
- quality: "Bluray-1080p Remux",
153
- min: 69.1,
154
- preferred: 995,
155
- max: 1000,
156
- },
157
- {
158
- quality: "HDTV-2160p",
159
- min: 25,
160
- preferred: 995,
161
- max: 1000,
162
- },
163
- {
164
- quality: "WEBRip-2160p",
165
- min: 25,
166
- preferred: 995,
167
- max: 1000,
168
- },
169
- {
170
- quality: "WEBDL-2160p",
171
- min: 25,
172
- preferred: 995,
173
- max: 1000,
174
- },
175
- {
176
- quality: "Bluray-2160p",
177
- min: 94.6,
178
- preferred: 995,
179
- max: 1000,
180
- },
181
- {
182
- quality: "Bluray-2160p Remux",
183
- min: 187.4,
184
- preferred: 995,
185
- max: 1000,
186
- },
187
- ]
188
-
189
- /**
190
- * Lidarr Quality Definitions (Davo's Community Guide)
191
- * Source: https://wiki.servarr.com/lidarr/community-guide
192
- * Filters out single track rips for entire albums (FLAC/CUE files)
193
- */
194
- export const TRASH_LIDARR_QUALITY_DEFINITIONS: TrashQualityDefinition[] = [
195
- {
196
- quality: "FLAC",
197
- min: 0,
198
- preferred: 895,
199
- max: 1400,
200
- },
201
- {
202
- quality: "FLAC 24bit",
203
- min: 0,
204
- preferred: 895,
205
- max: 1495,
206
- },
207
- {
208
- quality: "MP3-320",
209
- min: 0,
210
- preferred: 0,
211
- max: 0, // No size limit for MP3
212
- },
213
- ]
@@ -1,127 +0,0 @@
1
- /**
2
- * Lidarr Custom Formats (Davo's Community Guide)
3
- * Source: https://wiki.servarr.com/lidarr/community-guide
4
- *
5
- * Unlike Radarr/Sonarr, these are NOT from TRaSH Guides.
6
- * Lidarr custom formats use different implementation types.
7
- * Uses the same CustomFormat interface from custom-format-api.ts for compatibility.
8
- */
9
-
10
- import type { CustomFormat } from "~/api/custom-format-api"
11
-
12
- /**
13
- * Preferred Groups - Release groups that are consistently high quality
14
- */
15
- export const CF_PREFERRED_GROUPS: Omit<CustomFormat, "id"> = {
16
- name: "Preferred Groups",
17
- includeCustomFormatWhenRenaming: false,
18
- specifications: [
19
- {
20
- name: "DeVOiD",
21
- implementation: "ReleaseGroupSpecification",
22
- negate: false,
23
- required: false,
24
- fields: [{ name: "value", value: "\\bDeVOiD\\b" }],
25
- },
26
- {
27
- name: "PERFECT",
28
- implementation: "ReleaseGroupSpecification",
29
- negate: false,
30
- required: false,
31
- fields: [{ name: "value", value: "\\bPERFECT\\b" }],
32
- },
33
- {
34
- name: "ENRiCH",
35
- implementation: "ReleaseGroupSpecification",
36
- negate: false,
37
- required: false,
38
- fields: [{ name: "value", value: "\\bENRiCH\\b" }],
39
- },
40
- ],
41
- }
42
-
43
- /**
44
- * CD - Tag releases that are from CD source
45
- */
46
- export const CF_CD: Omit<CustomFormat, "id"> = {
47
- name: "CD",
48
- includeCustomFormatWhenRenaming: false,
49
- specifications: [
50
- {
51
- name: "CD",
52
- implementation: "ReleaseTitleSpecification",
53
- negate: false,
54
- required: false,
55
- fields: [{ name: "value", value: "\\bCD\\b" }],
56
- },
57
- ],
58
- }
59
-
60
- /**
61
- * WEB - Tag releases that are from WEB source
62
- */
63
- export const CF_WEB: Omit<CustomFormat, "id"> = {
64
- name: "WEB",
65
- includeCustomFormatWhenRenaming: false,
66
- specifications: [
67
- {
68
- name: "WEB",
69
- implementation: "ReleaseTitleSpecification",
70
- negate: false,
71
- required: false,
72
- fields: [{ name: "value", value: "\\bWEB\\b" }],
73
- },
74
- ],
75
- }
76
-
77
- /**
78
- * Lossless - Tag releases that are lossless (flac/flac24)
79
- */
80
- export const CF_LOSSLESS: Omit<CustomFormat, "id"> = {
81
- name: "Lossless",
82
- includeCustomFormatWhenRenaming: false,
83
- specifications: [
84
- {
85
- name: "Flac",
86
- implementation: "ReleaseTitleSpecification",
87
- negate: false,
88
- required: false,
89
- fields: [{ name: "value", value: "\\blossless\\b" }],
90
- },
91
- ],
92
- }
93
-
94
- /**
95
- * Vinyl - Tag releases that are from Vinyl source
96
- */
97
- export const CF_VINYL: Omit<CustomFormat, "id"> = {
98
- name: "Vinyl",
99
- includeCustomFormatWhenRenaming: false,
100
- specifications: [
101
- {
102
- name: "Vinyl",
103
- implementation: "ReleaseTitleSpecification",
104
- negate: false,
105
- required: false,
106
- fields: [{ name: "value", value: "\\bVinyl\\b" }],
107
- },
108
- ],
109
- }
110
-
111
- /**
112
- * All Lidarr custom formats from Davo's guide
113
- */
114
- export const LIDARR_CUSTOM_FORMATS: Omit<CustomFormat, "id">[] = [
115
- CF_PREFERRED_GROUPS,
116
- CF_CD,
117
- CF_WEB,
118
- CF_LOSSLESS,
119
- CF_VINYL,
120
- ]
121
-
122
- /**
123
- * Get all Lidarr custom format names
124
- */
125
- export function getLidarrCFNames(): string[] {
126
- return LIDARR_CUSTOM_FORMATS.map((cf) => cf.name)
127
- }