Add tracks_to_directory_tree helper
This commit is contained in:
parent
a48e881040
commit
1a6831ab68
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user