commit c35f2210f71be213123e41a4ce9368ef5bc2aa32
parent 3657c7d7bcf2ff58f4961f1f37e6129c0ecf421f
Author: Peter <peter@minskio.co.uk>
Date: Tue, 13 Oct 2026 11:19:56 +0100
Try get a unique name from very short filenames
Diffstat:
1 file changed, 30 insertions(+), 5 deletions(-)
diff --git a/internal/app/uploads.go b/internal/app/uploads.go
@@ -161,11 +161,7 @@ func uploadFromURLHandler(w http.ResponseWriter, r *http.Request) {
filename += urlExt
}
} else {
- parts := strings.Split(parsedURL.Path, "/")
- filename = parts[len(parts)-1]
- if filename == "" {
- filename = "file_from_url"
- }
+ filename = filenameFromURLPath(parsedURL.Path)
}
id, warningMsg, err := processUpload(resp.Body, filename)
@@ -177,6 +173,35 @@ func uploadFromURLHandler(w http.ResponseWriter, r *http.Request) {
redirectWithWarning(w, r, fmt.Sprintf("/file/%d", id), warningMsg)
}
+// Shortest accepted base name, otherwise use previous part of URL
+const minMeaningfulStemLen = 3
+func filenameFromURLPath(urlPath string) string {
+ var parts []string
+ for _, p := range strings.Split(urlPath, "/") {
+ if p != "" {
+ parts = append(parts, p)
+ }
+ }
+ if len(parts) == 0 {
+ return "file_from_url"
+ }
+
+ last := parts[len(parts)-1]
+ ext := filepath.Ext(last)
+ stem := strings.TrimSuffix(last, ext)
+
+ if len(stem) < minMeaningfulStemLen && len(parts) >= 2 {
+ prev := parts[len(parts)-2]
+ // Don't duplicate file extensions
+ prev = strings.TrimSuffix(prev, filepath.Ext(prev))
+ if prev != "" {
+ return prev + ext
+ }
+ }
+
+ return last
+}
+
func ytdlpHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Redirect(w, r, "/upload", http.StatusSeeOther)