From b4ef890aa0316d171de272f53b71bc71c6b90c4e 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{