From 45b76908677a8c35c3d2b2fbef280cb978f5fd57 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 17 Sep 2024 15:58:07 +0100 Subject: [PATCH] serve dlna: sort the directory entries by directories first then alphabetically by name Some media boxes don't sort the items returned from the DLNA server, so sort them here, directories first then alphabetically by name. See: https://forum.rclone.org/t/serve-dlna-files-order-directories-first/47790 --- cmd/serve/dlna/cds.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cmd/serve/dlna/cds.go b/cmd/serve/dlna/cds.go index 2e2752c73..adcc580df 100644 --- a/cmd/serve/dlna/cds.go +++ b/cmd/serve/dlna/cds.go @@ -11,6 +11,7 @@ import ( "path" "path/filepath" "regexp" + "sort" "strings" "github.com/anacrolix/dms/dlna" @@ -158,6 +159,18 @@ func (cds *contentDirectoryService) readContainer(o object, host string) (ret [] } } + // Sort the directory entries by directories first then alphabetically by name + sort.Slice(dirEntries, func(i, j int) bool { + iNode, jNode := dirEntries[i], dirEntries[j] + iIsDir, jIsDir := iNode.IsDir(), jNode.IsDir() + if iIsDir && !jIsDir { + return true + } else if !iIsDir && jIsDir { + return false + } + return strings.ToLower(iNode.Name()) < strings.ToLower(jNode.Name()) + }) + dirEntries, mediaResources := mediaWithResources(dirEntries) for _, de := range dirEntries { child := object{