- Migration 00008: upload_batches, upload_files, upload_quota. - Quota reserved under a row lock when a batch is created; every status change goes through one transition that frees space in the same transaction. SHA-256 duplicates are rejected before any upload. - tus 1.0.0 core (HEAD/PATCH) for the author only; offset is the real staging file size, data beyond the declared size is refused (ADR-015). - Processing worker: ffprobe checks, SHA-256 verification, exact and Chromaprint duplicates against library and queue, metadata from tags or the dropped folder path, possible_duplicate on metadata match, and the target path from write_template reusing existing folder spelling. - Import worker: edited tags written with ffmpeg stream copy, file written by storage-agent, point scan of the new file, imported status; idempotent and resumed after restart. Stale uploads expire after 24 h, orphan staging files are removed at startup. - API: quota, precheck, batches, my uploads, withdraw, admin list, metadata edit, bulk review, retry and queue settings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
98 lines
4.7 KiB
JSON
98 lines
4.7 KiB
JSON
{
|
|
"common": {
|
|
"internal": "Something went wrong on the server. Please try again",
|
|
"bad_request": "Invalid request",
|
|
"not_found": "Not found",
|
|
"method_not_allowed": "This action is not supported",
|
|
"network": "Cannot reach the server. Check your network"
|
|
},
|
|
"auth": {
|
|
"invalid_credentials": "Wrong username or password",
|
|
"too_many_attempts": "Too many sign-in attempts. Please wait a bit",
|
|
"user_blocked": "This account is blocked. Contact your administrator",
|
|
"unauthorized": "Sign in to continue",
|
|
"token_expired": "Your session has expired, please sign in again",
|
|
"token_invalid": "Your session is invalid, please sign in again",
|
|
"token_revoked": "Your session has ended, please sign in again",
|
|
"refresh_invalid": "Your session has ended, please sign in again",
|
|
"refresh_reused": "Your session was ended for security reasons, please sign in again",
|
|
"refresh_race": "Your session is being refreshed, please retry",
|
|
"credentials_change_required": "Change the administrator username and password first",
|
|
"password_change_required": "Change your temporary password first",
|
|
"current_password_required": "Enter your current password",
|
|
"current_password_invalid": "The current password is wrong",
|
|
"bootstrap_not_required": "The administrator credentials have already been changed",
|
|
"session_not_found": "Session not found",
|
|
"forbidden": "You don't have permission to do this"
|
|
},
|
|
"validation": {
|
|
"password_too_short": "The password must be at least {{min}} characters",
|
|
"password_too_long": "The password must be at most {{max}} characters",
|
|
"password_same_as_username": "The password must not match the username",
|
|
"password_too_common": "This password is too common — choose another one",
|
|
"password_unchanged": "The new password must differ from the current one",
|
|
"username_invalid": "Username: {{min}} to {{max}} characters — Latin letters, digits, \".\", \"_\", \"-\"",
|
|
"username_taken": "This username is already taken",
|
|
"locale_unsupported": "This language is not supported",
|
|
"display_name_too_long": "The name must be at most {{max}} characters",
|
|
"ui_prefs_invalid": "Invalid setting value",
|
|
"client_type_invalid": "Unknown app type",
|
|
"role_invalid": "Unknown role",
|
|
"cursor_invalid": "The list is outdated, please reload",
|
|
"pattern_invalid": "Pattern error: {{reason}}",
|
|
"nfs_invalid": "Invalid value",
|
|
"local_path_invalid": "Folder not found",
|
|
"name_invalid": "The name must be 1 to {{max}} characters",
|
|
"scan_interval_invalid": "The interval must be at least {{min}} minutes",
|
|
"source_type_invalid": "Unknown storage type",
|
|
"query_empty": "Enter a query",
|
|
"wave_activity_invalid": "Unknown activity",
|
|
"wave_mood_invalid": "Unknown mood",
|
|
"template_invalid": "Invalid path template: {{reason}}"
|
|
},
|
|
"users": {
|
|
"not_found": "User not found",
|
|
"last_admin": "The last administrator cannot be demoted, blocked or deleted"
|
|
},
|
|
"library": {
|
|
"source_not_found": "Storage not found",
|
|
"scan_running": "A scan is already running",
|
|
"source_offline": "The storage is not connected",
|
|
"template_unavailable": "Could not suggest a template: no storage pattern converts to a template, or the storage has no files"
|
|
},
|
|
"catalog": {
|
|
"not_found": "Not found"
|
|
},
|
|
"search": {
|
|
"unavailable": "Search is temporarily unavailable"
|
|
},
|
|
"playback": {
|
|
"link_invalid": "The link has expired — reload the page",
|
|
"track_unavailable": "Track is unavailable",
|
|
"transcode_failed": "Could not prepare the track"
|
|
},
|
|
"wave": {
|
|
"session_not_found": "The wave session has ended"
|
|
},
|
|
"app": {
|
|
"update_unavailable": "Update is unavailable"
|
|
},
|
|
"uploads": {
|
|
"queue_full": "The upload queue is full",
|
|
"user_quota_full": "Your upload queue limit is exceeded",
|
|
"too_large": "The file is larger than allowed",
|
|
"duplicate": "This track is already in the library or in the queue",
|
|
"invalid_audio": "The file does not look like audio (one audio stream, 5 s to 3 h)",
|
|
"unsupported_format": "Unsupported format: FLAC, MP3, M4A, OGG, Opus, WAV, AIFF and WavPack are accepted",
|
|
"not_found": "Upload not found",
|
|
"wrong_status": "The file is already in another status; refresh the page",
|
|
"no_target": "No storage accepts uploads (or several do and none is the default)",
|
|
"no_template": "The storage has no path template",
|
|
"missing_field": "Not enough metadata to build the storage path",
|
|
"offset_mismatch": "The upload got out of sync; try again",
|
|
"size_mismatch": "The file size does not match the declared one",
|
|
"hash_mismatch": "The file was corrupted in transit (SHA-256 mismatch)",
|
|
"import_failed": "Could not write the file to the storage"
|
|
}
|
|
}
|