tagliatelle

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
Minternal/app/uploads.go | 35++++++++++++++++++++++++++++++-----
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)