From 1a6831ab683f75cf9f0fb6d067d5f07871c08f53 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Fri, 29 Oct 2010 23:06:58 +0200 Subject: [PATCH] Add tracks_to_directory_tree helper --- mopidy/frontends/mpd/translator.py | 14 ++++++- tests/frontends/mpd/serializer_test.py | 56 ++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/mopidy/frontends/mpd/translator.py b/mopidy/frontends/mpd/translator.py index 98b3f907..36a6e7ea 100644 --- a/mopidy/frontends/mpd/translator.py +++ b/mopidy/frontends/mpd/translator.py @@ -3,7 +3,7 @@ import re from mopidy import settings from mopidy.frontends.mpd import protocol -from mopidy.utils.path import path_to_uri, uri_to_path +from mopidy.utils.path import path_to_uri, uri_to_path, split_path def track_to_mpd_format(track, position=None, cpid=None, key=False, mtime=False): """ @@ -123,3 +123,15 @@ def tracks_to_tag_cache_format(tracks): result.append(('songList end',)) return result + +def tracks_to_directory_tree(tracks): + directories = ({}, []) + for track in tracks: + folder = os.path.dirname(uri_to_path(track.uri)) + current = directories + for part in split_path(folder): + if part not in current[0]: + current[0][part] = ({}, []) + current = current[0][part] + current[1].append(track) + return directories diff --git a/tests/frontends/mpd/serializer_test.py b/tests/frontends/mpd/serializer_test.py index 689347fe..5fc610b0 100644 --- a/tests/frontends/mpd/serializer_test.py +++ b/tests/frontends/mpd/serializer_test.py @@ -173,3 +173,59 @@ class TracksToTagCacheFormatTest(unittest.TestCase): self.assertEqual(song_list, formated) self.assertEqual(len(result), 0) + + +class TracksToDirectoryTreeTest(unittest.TestCase): + def setUp(self): + settings.LOCAL_MUSIC_FOLDER = '/' + + def tearDown(self): + settings.runtime.clear() + + def test_no_tracks_gives_emtpy_tree(self): + tree = translator.tracks_to_directory_tree([]) + self.assertEqual(tree, ({}, [])) + + def test_top_level_files(self): + tracks = [ + Track(uri='file:///file1.mp3'), + Track(uri='file:///file2.mp3'), + Track(uri='file:///file3.mp3'), + ] + tree = translator.tracks_to_directory_tree(tracks) + self.assertEqual(tree, ({}, tracks)) + + def test_single_file_in_subdir(self): + tracks = [Track(uri='file:///dir/file1.mp3')] + tree = translator.tracks_to_directory_tree(tracks) + expected = ({'dir': ({}, tracks)}, []) + self.assertEqual(tree, expected) + + def test_single_file_in_sub_subdir(self): + tracks = [Track(uri='file:///dir1/dir2/file1.mp3')] + tree = translator.tracks_to_directory_tree(tracks) + expected = ({'dir1': ({'dir2': ({}, tracks)}, [])}, []) + self.assertEqual(tree, expected) + + def test_complex_file_structure(self): + tracks = [ + Track(uri='file:///file1.mp3'), + Track(uri='file:///dir1/file2.mp3'), + Track(uri='file:///dir1/file3.mp3'), + Track(uri='file:///dir2/file4.mp3'), + Track(uri='file:///dir2/sub/file5.mp3'), + ] + tree = translator.tracks_to_directory_tree(tracks) + expected = ( + { + 'dir1': ({}, [tracks[1], tracks[2]]), + 'dir2': ( + { + 'sub': ({}, [tracks[4]]) + }, + [tracks[3]] + ), + }, + [tracks[0]] + ) + self.assertEqual(tree, expected)