Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
a1f8b1b
feat(seed): add advanced transfer seed UI (generate/preview/manage)
PIKACHUIM Sep 8, 2026
e37e7bd
feat(seed): enable edit, recalculate and relayed transfer UI
PIKACHUIM Sep 8, 2026
618c679
feat(seed): channel update toggle, share validity and CAS direct acce…
PIKACHUIM Sep 8, 2026
6cdfc9a
feat(frontend): add dedicated seed settings page with visual controls
PIKACHUIM Sep 8, 2026
acbcbed
feat(frontend): seed settings page with Item components and EN i18n keys
PIKACHUIM Sep 8, 2026
9b1f1b4
refactor(frontend): redesign seed settings page layout
PIKACHUIM Sep 8, 2026
d205244
feat(frontend): redesign transfer seed preview
PIKACHUIM Sep 8, 2026
2a52d36
feat(frontend): select hash matrix for bulk seed recalculation
PIKACHUIM Sep 8, 2026
8e76d94
feat(frontend): polish seed preview layout and offline download flow
PIKACHUIM Sep 8, 2026
e264264
feat(frontend): handle async seed generation response
PIKACHUIM Sep 9, 2026
0be7081
refactor(frontend): widen recalc source directory and move save butto…
PIKACHUIM Sep 9, 2026
b5f7c28
refactor(frontend): clean up seed preview header
PIKACHUIM Sep 9, 2026
339c687
refactor(frontend): let destination and convert inputs fill the row
PIKACHUIM Sep 9, 2026
13ee114
refactor(frontend): revert driver info to badges and inline update-ch…
PIKACHUIM Sep 9, 2026
ca010bd
refactor(frontend): remove recalc source file mapping preview
PIKACHUIM Sep 9, 2026
b90cf75
refactor(frontend): collapse conversion feasibility to check/cross wi…
PIKACHUIM Sep 9, 2026
27c612a
feat(frontend): editable seed name in generate dialog
PIKACHUIM Sep 9, 2026
8e78976
fix(frontend): hide legacy CAS warning when piece hashes exist
PIKACHUIM Sep 9, 2026
c1fca2a
fix(seed): pre-check CAS rapid capability before direct access
PIKACHUIM Sep 9, 2026
275d7ad
feat: enhance torrent preview UI with detailed driver capabilities an…
PIKACHUIM Sep 11, 2026
2895568
feat(i18n): add entry.ts module glob support\n\n- Extend i18n initial…
PIKACHUIM Sep 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/app/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ const langs = import.meta.glob("~/lang/*/index.json", {
import: "lang",
})

// glob search for all entry.ts files
const entryModules = import.meta.glob<{ dict: RawDictionary }>(
"~/lang/*/entry.ts",
)

// all available languages
export const languages = Object.keys(langs).map((langPath) => {
const langCode = langPath.split("/")[3]
Expand Down
109 changes: 107 additions & 2 deletions src/lang/en/home.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"asciinema": "Asciinema Player",
"video360": "Video360 Player",
"archive": "Archive Previewer",
"torrent": "Torrent Previewer"
"torrent": "Transfer Seed Previewer"
}
},
"layouts": {
Expand All @@ -78,6 +78,7 @@
"choose_dst_folder": "Select destination folder",
"delete": "Delete",
"delete-tips": "Are you sure to delete the selected object?",
"follow_seed": "Follow transfer seed sidecars",
"decompress": "Decompress",
"decompress-pass": "Extraction password: ",
"decompress-cache-full": "Cache full into a temp-file",
Expand All @@ -101,6 +102,7 @@
"offline_download": "Offline download",
"offline_download-tips": "One URL per line",
"offline_download_torrent": "BT Fetch",
"generate_transfer_seed": "Generate transfer seed",
"offline_download_enhanced": {
"tab_link": "Link Download",
"tab_bt": "BT Download",
Expand Down Expand Up @@ -168,6 +170,107 @@
"find_replace": "Find and Replace",
"find_replace_desc": "Find and Replace"
},
"transfer_seed": {
"generate_title": "Generate transfer seed",
"generate": "Generate",
"formats": "Output formats",
"hash_matrix": "Content hash matrix",
"whole": "Whole file",
"pieces": "Pieces",
"required_by_format": "Required by selected format",
"piece_size": "Piece size",
"seed_name": "Seed name",
"seed_name_placeholder": "Leave empty to auto-derive from selection",
"output_path": "Output path",
"comment": "Comment",
"file_comment": "File comment",
"trackers": "Trackers",
"trackers_hint": "One tracker per line",
"include_share": "Include share link",
"include_direct_source": "Include direct source",
"direct_generate": "Direct generation",
"async_task_created": "Seed generation queued. The files will appear in the destination folder once finished.",
"cannot_stream": "Cannot stream",
"cannot_stream_hint": "Some files require downloading to compute hashes, but the current driver cannot stream them. Seed generation is unavailable for these files.",
"direct_source_disabled_hint": "Direct sources require an unencrypted file and enabled guest access",
"checking": "Checking storage capabilities...",
"capability_summary": "Source capability summary",
"estimated_traffic": "Estimated traffic",
"requires_fetch": "Requires fetch",
"parse_failed": "Failed to parse transfer seed",
"cas_legacy_warning": "Legacy CAS contains only name, size, MD5, aggregate slice MD5, and creation time. Conversion is lossy: per-piece lists, comments, channels, trackers, and sources cannot be preserved.",
"share_valid": "Share valid",
"share_invalid": "Share invalid",
"channel": "Channel",
"conversion_feasibility": "Conversion feasibility",
"feasible": "Feasible",
"unavailable": "Unavailable",
"destination": "Destination path",
"destination_driver": "Destination driver",
"rapid_save": "Rapid save",
"transit_save": "Transfer save",
"convert_to": "Convert to",
"convert": "Convert",
"recalculate": "Recalculate",
"transit_path": "Transit path (intermediate storage)",
"recalc_source_path": "Recalculate source paths (server files)",
"cas_direct_access_success": "CAS file restored to this folder",
"cas_direct_access_failed": "CAS direct access failed",
"update_channel": "Update channel on success",
"invalid_share": "Invalid share",
"preview": "Preview",
"preview_file": "Preview file",
"preview_confirm_title": "Preview file",
"preview_confirm_body": "Rapid-upload this file to the destination folder, then open its preview?",
"remove_file": "Remove file",
"remove_file_confirm_title": "Remove file",
"remove_file_confirm_body": "Remove this file from the seed and save the updated seed?",
"copy_hash": "Copy {{alg}} hash",
"hash_missing": "{{alg}} hash not available",
"piece_hashes": "Piece hashes",
"piece_info": "{{count}} pieces × {{size}}",
"copy_all_hashes": "Copy all hashes",
"copy_piece_hashes": "Copy piece hashes",
"piece_hash_title": "{{alg}} piece hashes",
"overall_comment": "Overall comment",
"comment_placeholder": "Optional comment for the whole seed",
"copy_comment": "Copy comment",
"no_comment": "No comment",
"recalc_file": "Recalculate this file",
"recalc_source": "Source file path (server-side)",
"recalc_matrix": "Hash matrix for recalculation",
"recalc_source_dir": "Source directory",
"recalc_source_hint": "Source files are located at",
"source_dir_required": "Please select a source directory",
"file_count": "files",
"save_method": "Save method",
"method_189pc_cas": "CAS rapid upload",
"method_put_url": "Direct URL upload",
"method_offline_download": "Offline download",
"method_download_required": "Download required",
"method_unavailable": "Unavailable",
"destination_hint": "Selected files are saved into this folder",
"driver_supports": "Supports",
"rapid_available": "Rapid available",
"rapid_unavailable": "Rapid unavailable",
"requires_hashes": "Requires hashes",
"available_hashes": "Available hashes",
"missing_hashes": "Missing hashes",
"unavailable_reason": "Unavailable reason",
"loading_capabilities": "Loading driver capabilities...",
"driver_no_rapid": "Driver does not support rapid upload",
"put_url": "URL upload",
"offline": "Offline download",
"rapid_upload": "Rapid upload",
"offline_tool": "Download tool",
"offline_delete_policy": "Delete policy",
"tool_required": "Please select a download tool",
"preview_rapid_success": "File restored, opening preview...",
"preview_rapid_failed": "Failed to restore file",
"select_at_least_one": "Select at least one file",
"transit_path_required": "Transit path is required",
"source_path_required": "Source path is required for every selected file"
},
"upload": {
"add_as_task": "Add as task",
"try_rapid": "Try rapid",
Expand All @@ -184,7 +287,9 @@
"error": "Error",
"back": "Back to Upload",
"clear_done": "Clear Done",
"retry": "Retry"
"retry": "Retry",
"sidecars": "Generate transfer seed sidecars",
"sidecars_hint": "Sidecars are disabled by default and generated after each upload completes."
},
"local_settings": {
"aria2_rpc_url": "Aria2 RPC URL",
Expand Down
3 changes: 2 additions & 1 deletion src/lang/en/manage.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@
"s3": "S3",
"ftp": "FTP",
"traffic": "Traffic",
"plugins": "Plugins"
"plugins": "Plugins",
"seed": "Seed"
},
"title": "OpenList Management",
"not_admin": "You are not an admin user, please login with an admin account.",
Expand Down
18 changes: 17 additions & 1 deletion src/lang/en/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,5 +146,21 @@
"version": "Version",
"video_autoplay": "Video autoplay",
"video_types": "Video types",
"webauthn_login_enabled": "WebAuthn login enabled"
"webauthn_login_enabled": "WebAuthn login enabled",
"seed_site_url": "Seed site URL",
"seed_default_matrix": "Default hash matrix",
"seed_format_policies": "Seed format policies",
"seed_default_format": "Default seed format",
"seed_default_formats": {
"oss": "OSS",
"torrent": "Torrent",
"cas": "CAS"
},
"seed_auto_generate_policy": "Auto-generate seeds on upload",
"seed_auto_generate_policys": {
"off": "Off",
"on": "On"
},
"seed_single_direct_preview": "Single-file seed direct preview",
"seed_cas_direct_access": "CAS direct access"
}
23 changes: 23 additions & 0 deletions src/lang/en/settings_seed.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"site_config": "Site configuration",
"site_url": "Site URL",
"site_url_help": "Public base URL embedded into seed sources when generating share links. Leave empty to use the current request origin.",
"default_matrix": "Default hash matrix",
"default_matrix_help": "Hashes preselected when generating seeds from the file list. Torrent forces SHA-1 and CAS forces MD5 at generation time.",
"whole": "Whole file",
"pieces": "Pieces",
"default_format": "Default format",
"default_format_help": "Format preselected in the seed generation dialog.",
"format_policies": "Automatic format policies",
"format_policies_help": "Formats generated automatically as sidecars. Each storage can still override the global policy.",
"oss_format": "OSS (.oss)",
"torrent_format": "Torrent (.torrent)",
"cas_format": "CAS (.cas)",
"other_options": "Other options",
"auto_generate": "Auto-generate seeds on upload",
"auto_generate_help": "Generate sidecar seeds while uploading, using the format policies above.",
"single_direct_preview": "Direct preview for single-file seeds",
"single_direct_preview_help": "Open the contained file directly instead of the seed detail view when a seed holds exactly one file.",
"cas_direct_access": "CAS direct access",
"cas_direct_access_help": "When opening a single-file CAS seed, rapid-upload it into the same folder and preview the restored file."
}
18 changes: 16 additions & 2 deletions src/pages/home/folder/context-menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "solid-contextmenu/dist/style.css"
import { HStack, Icon, Text, useColorMode, Image } from "@hope-ui/solid"
import { operations } from "../toolbar/operations"
import { createMemo, For, Show } from "solid-js"
import { bus, convertURL, notify, torrentParse } from "~/utils"
import { bus, convertURL, notify, pathJoin, torrentParse } from "~/utils"
import { ObjType, UserMethods } from "~/types"
import {
getSettingBool,
Expand Down Expand Up @@ -46,7 +46,7 @@ export const ContextMenu = () => {
return UserMethods.is_admin(me()) || getSettingBool("package_download")
}
const { rawLink } = useLink()
const { isShare, pushHref, to } = useRouter()
const { isShare, pathname, pushHref, to } = useRouter()
const openWithPreviews = createMemo(() => {
const objs = selectedObjs()
if (objs.length !== 1) return []
Expand Down Expand Up @@ -97,6 +97,20 @@ export const ContextMenu = () => {
>
<ItemContent name="share" />
</Item>
<Item
hidden={() =>
isShare() ||
!haveSelected() ||
selectedObjs().some((obj) => obj.is_dir)
}
onClick={() => {
bus.emit("generate_transfer_seed", {
paths: selectedObjs().map((obj) => pathJoin(pathname(), obj.name)),
})
}}
>
<ItemContent name="generate_transfer_seed" />
</Item>
<Item
hidden={() => {
return (
Expand Down
2 changes: 1 addition & 1 deletion src/pages/home/previews/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ const previews: Preview[] = [
},
{
key: "torrent",
exts: ["torrent"],
exts: ["torrent", "cas", "oss"],
component: lazy(() => import("./torrent")),
prior: true,
},
Expand Down
Loading