Merge adamcik/gstreamer
This commit is contained in:
commit
1eb88c1803
@ -46,10 +46,10 @@ class BaseBackend(object):
|
||||
uri_handlers = []
|
||||
|
||||
def destroy(self):
|
||||
'''
|
||||
"""
|
||||
Call destroy on all sub-components in backend so that they can cleanup
|
||||
after themselves.
|
||||
'''
|
||||
"""
|
||||
|
||||
if self.current_playlist:
|
||||
self.current_playlist.destroy()
|
||||
@ -227,7 +227,7 @@ class BaseCurrentPlaylistController(object):
|
||||
self.playlist = self.playlist.with_(tracks=before+shuffled+after)
|
||||
|
||||
def destroy(self):
|
||||
'''Cleanup after component'''
|
||||
"""Cleanup after component"""
|
||||
pass
|
||||
|
||||
|
||||
@ -284,7 +284,7 @@ class BaseLibraryController(object):
|
||||
raise NotImplementedError
|
||||
|
||||
def destroy(self):
|
||||
'''Cleanup after component'''
|
||||
"""Cleanup after component"""
|
||||
pass
|
||||
|
||||
|
||||
@ -604,7 +604,7 @@ class BasePlaybackController(object):
|
||||
raise NotImplementedError
|
||||
|
||||
def destroy(self):
|
||||
'''Cleanup after component'''
|
||||
"""Cleanup after component"""
|
||||
pass
|
||||
|
||||
|
||||
@ -720,5 +720,5 @@ class BaseStoredPlaylistsController(object):
|
||||
return filter(lambda p: query in p.name, self._playlists)
|
||||
|
||||
def destroy(self):
|
||||
'''Cleanup after component'''
|
||||
"""Cleanup after component"""
|
||||
pass
|
||||
|
||||
@ -9,12 +9,14 @@ pygst.require('0.10')
|
||||
import gst
|
||||
import logging
|
||||
import os
|
||||
import glob
|
||||
import shutil
|
||||
import threading
|
||||
|
||||
from mopidy.backends import *
|
||||
from mopidy.models import Playlist
|
||||
from mopidy.models import Playlist, Track
|
||||
from mopidy import settings
|
||||
from mopidy.utils import m3u_to_uris
|
||||
|
||||
logger = logging.getLogger(u'backends.gstreamer')
|
||||
|
||||
@ -117,8 +119,23 @@ class GStreamerPlaybackController(BasePlaybackController):
|
||||
class GStreamerStoredPlaylistsController(BaseStoredPlaylistsController):
|
||||
def __init__(self, *args):
|
||||
super(GStreamerStoredPlaylistsController, self).__init__(*args)
|
||||
# FIXME need test that ensures that folder is created
|
||||
self._folder = os.path.expanduser(settings.PLAYLIST_FOLDER)
|
||||
self.refresh()
|
||||
|
||||
def refresh(self):
|
||||
playlists = []
|
||||
|
||||
for m3u in glob.glob(os.path.join(self._folder, '*.m3u')):
|
||||
name = os.path.basename(m3u)[:len('.m3u')]
|
||||
track_uris = m3u_to_uris(m3u)
|
||||
tracks = map(lambda u: Track(uri=u), track_uris)
|
||||
playlist = Playlist(tracks=tracks, name=name)
|
||||
|
||||
# FIXME playlist name needs better handling
|
||||
|
||||
playlists.append(playlist)
|
||||
|
||||
self.playlists = playlists
|
||||
|
||||
def create(self, name):
|
||||
playlist = Playlist(name=name)
|
||||
@ -149,6 +166,13 @@ class GStreamerStoredPlaylistsController(BaseStoredPlaylistsController):
|
||||
shutil.move(src, dst)
|
||||
|
||||
def save(self, playlist):
|
||||
file = os.path.join(self._folder, playlist.name + '.m3u')
|
||||
open(file, 'w').close()
|
||||
file_path = os.path.join(self._folder, playlist.name + '.m3u')
|
||||
|
||||
with open(file_path, 'w') as file:
|
||||
for track in playlist.tracks:
|
||||
if track.uri.startswith('file:'):
|
||||
file.write(track.uri[len('file:'):] + '\n')
|
||||
else:
|
||||
file.write(track.uri + '\n')
|
||||
|
||||
self._playlists.append(playlist)
|
||||
|
||||
@ -97,7 +97,7 @@ def m3u_to_uris(file_path):
|
||||
"""
|
||||
Convert M3U file list of uris
|
||||
|
||||
Example M3U data:
|
||||
Example M3U data::
|
||||
|
||||
# This is a comment
|
||||
Alternative\Band - Song.mp3
|
||||
|
||||
@ -2,11 +2,13 @@ import unittest
|
||||
import os
|
||||
import urllib
|
||||
|
||||
from mopidy.models import Playlist, Track
|
||||
from mopidy.backends.gstreamer import GStreamerBackend
|
||||
from mopidy import settings
|
||||
from mopidy.backends.gstreamer import GStreamerBackend
|
||||
from mopidy.mixers.dummy import DummyMixer
|
||||
from mopidy.models import Playlist, Track
|
||||
|
||||
from tests.backends.base import *
|
||||
from tests import SkipTest
|
||||
|
||||
folder = os.path.dirname(__file__)
|
||||
folder = os.path.join(folder, '..', 'data')
|
||||
@ -78,6 +80,46 @@ class GStreamerBackendStoredPlaylistsControllerTest(BaseStoredPlaylistsControlle
|
||||
self.assert_(not os.path.exists(file1))
|
||||
self.assert_(os.path.exists(file2))
|
||||
|
||||
def test_playlist_contents_get_written_to_disk(self):
|
||||
track = Track(uri=generate_song(1))
|
||||
uri = track.uri[len('file:'):]
|
||||
playlist = Playlist(tracks=[track], name='test')
|
||||
file_path = os.path.join(settings.PLAYLIST_FOLDER, 'test.m3u')
|
||||
|
||||
self.stored.save(playlist)
|
||||
|
||||
with open(file_path) as file:
|
||||
contents = file.read()
|
||||
|
||||
self.assertEqual(uri, contents.strip())
|
||||
|
||||
def test_playlists_are_loaded_at_startup(self):
|
||||
track = Track(uri=generate_song(1))
|
||||
uri = track.uri[len('file:'):]
|
||||
playlist = Playlist(tracks=[track], name='test')
|
||||
file_path = os.path.join(settings.PLAYLIST_FOLDER, 'test.m3u')
|
||||
|
||||
self.stored.save(playlist)
|
||||
|
||||
self.backend.destroy()
|
||||
self.backend = self.backend_class(mixer=DummyMixer())
|
||||
self.stored = self.backend.stored_playlists
|
||||
|
||||
self.assert_(self.stored.playlists)
|
||||
self.assertEqual('test', self.stored.playlists[0].name)
|
||||
self.assertEqual(track.uri, self.stored.playlists[0].tracks[0].uri)
|
||||
|
||||
def test_santitising_of_playlist_filenames(self):
|
||||
raise SkipTest
|
||||
|
||||
def test_playlist_folder_is_createad(self):
|
||||
raise SkipTest
|
||||
|
||||
def test_create_sets_playlist_uri(self):
|
||||
raise SkipTest
|
||||
|
||||
def test_save_sets_playlist_uri(self):
|
||||
raise SkipTest
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user