diff options
-rw-r--r-- | tests/test_mpg.py | 2 | ||||
-rw-r--r-- | tests/test_nfo.py | 2 | ||||
-rw-r--r-- | tests/test_path_to_node_mapping.py | 6 | ||||
-rw-r--r-- | vdrnfofs/filesystemnodes.py | 71 | ||||
-rw-r--r-- | vdrnfofs/vdrnfofs.py | 2 |
5 files changed, 59 insertions, 24 deletions
diff --git a/tests/test_mpg.py b/tests/test_mpg.py index cebfec9..68d68d8 100644 --- a/tests/test_mpg.py +++ b/tests/test_mpg.py @@ -47,11 +47,13 @@ class TestMpg(unittest.TestCase): def test_mpg(self): node = get_node(self.video, '/sample_2008-03-28.20.13.99.99.rec.mpg') + self.assertEqual('sample_2008-03-28.20.13.99.99.rec.mpg', node.file_system_name()) self.assertEqual(40, node.size()) self.assertEqual('1234567890abcdefghij1234567890abcdefghij', node.read(0, 4096)) def test_mpg_new(self): node = get_node(self.video, '/sample-vdr1.7_2008-03-28.20.13.10-1.rec.mpg') + self.assertEqual('sample-vdr1.7_2008-03-28.20.13.10-1.rec.mpg', node.file_system_name()) self.assertEqual(40, node.size()) self.assertEqual('1234567890abcdefghij1234567890abcdefghij', node.read(0, 4096)) diff --git a/tests/test_nfo.py b/tests/test_nfo.py index 71c352d..7fa915b 100644 --- a/tests/test_nfo.py +++ b/tests/test_nfo.py @@ -48,11 +48,13 @@ class TestNfo(unittest.TestCase): def test_nfo(self): node = get_node(self.video, '/sample_2008-03-28.20.13.99.99.rec.nfo') nfo = xml.etree.ElementTree.fromstring(node.read(0, 4096)) + self.assertEqual('sample_2008-03-28.20.13.99.99.rec.nfo', node.file_system_name()) self.assertEqual('Movie Title', nfo.find('title').text) self.assertEqual('A movie about something', nfo.find('plot').text) def test_nfo_new(self): node = get_node(self.video, '/sample-vdr1.7_2008-03-28.20.13.10-1.rec.nfo') nfo = xml.etree.ElementTree.fromstring(node.read(0, 4096)) + self.assertEqual('sample-vdr1.7_2008-03-28.20.13.10-1.rec.nfo', node.file_system_name()) self.assertEqual('Movie Title', nfo.find('title').text) self.assertEqual('A movie about something', nfo.find('plot').text) diff --git a/tests/test_path_to_node_mapping.py b/tests/test_path_to_node_mapping.py index 51e7852..917c462 100644 --- a/tests/test_path_to_node_mapping.py +++ b/tests/test_path_to_node_mapping.py @@ -42,15 +42,15 @@ class TestPathToNodeMapping(unittest.TestCase): def test_root(self): node = get_node(self.video, '/') - self.assertEqual('', node.file_system_name) + self.assertEqual('', node.file_system_name()) self.assertEqual(self.video + '/', node.path) def test_subdir(self): node = get_node(self.video, '/folder') - self.assertEqual('folder', node.file_system_name) + self.assertEqual('folder', node.file_system_name()) self.assertEqual(self.video + '/folder', node.path) def test_mpg(self): node = get_node(self.video, '/sample_2008-03-28.20.13.99.99.rec.mpg') - self.assertEqual('sample_2008-03-28.20.13.99.99.rec.mpg', node.file_system_name) + self.assertEqual('sample_2008-03-28.20.13.99.99.rec.mpg', node.file_system_name()) self.assertEqual(self.video + '/sample/2008-03-28.20.13.99.99.rec', node.path) diff --git a/vdrnfofs/filesystemnodes.py b/vdrnfofs/filesystemnodes.py index 758a1e4..07eec7e 100644 --- a/vdrnfofs/filesystemnodes.py +++ b/vdrnfofs/filesystemnodes.py @@ -54,24 +54,40 @@ class NodeAttributes(fuse.Stat): class MpgNode: def __init__(self, path): self.path = path - self.mpeg_files = glob.glob(path + '/[0-9]*.vdr') - if not self.mpeg_files: - self.mpeg_files = glob.glob(path + '/[0-9]*.ts') - self.mpeg_files.sort() - self.file_system_name = '_'.join(path.rsplit('/', 3)[-2:]) + '.mpg' - self.reader = ConcatenatedFileReader(self.mpeg_files) + self._file_system_name = None + self._mpeg_files = None + self._reader = None + + def file_system_name(self): + if not self._file_system_name: + self._file_system_name = '_'.join(self.path.rsplit('/', 3)[-2:]) + '.mpg' + return self._file_system_name + + def mpeg_files(self): + if not self._mpeg_files: + self._mpeg_files = glob.glob(self.path + '/[0-9]*.vdr') + if not self._mpeg_files: + self._mpeg_files = glob.glob(self.path + '/[0-9]*.ts') + self._mpeg_files.sort() + return self._mpeg_files + + def reader(self): + if not self._reader: + self._reader = ConcatenatedFileReader(self.mpeg_files()) + return self._reader def size(self): size = 0 - for file in self.mpeg_files: + for file in self.mpeg_files(): size += os.path.getsize(file) return size def read(self, offset, size): - return self.reader.read(offset, size) + return self.reader().read(offset, size) def release(self): - self.reader.release() + if self._reader: + self._reader.release() def get_stat(self): attr = NodeAttributes() @@ -85,26 +101,36 @@ class MpgNode: class NfoNode: def __init__(self, path): + self._file_system_name = None self.path = path - self.file_system_name = '_'.join(path.rsplit('/', 3)[-2:]) + '.nfo' - if os.path.exists(path + '/info.vdr'): - info_vdr = InfoVdr(path + '/info.vdr') - elif os.path.exists(path + '/info'): - info_vdr = InfoVdr(path + '/info') - else: - info_vdr = InfoVdr() - self.nfo_content = """<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> + self._nfo_content = None + + def file_system_name(self): + if not self._file_system_name: + self._file_system_name = '_'.join(self.path.rsplit('/', 3)[-2:]) + '.nfo' + return self._file_system_name + + def nfo_content(self): + if not self._nfo_content: + if os.path.exists(self.path + '/info.vdr'): + info_vdr = InfoVdr(self.path + '/info.vdr') + elif os.path.exists(self.path + '/info'): + info_vdr = InfoVdr(self.path + '/info') + else: + info_vdr = InfoVdr() + self._nfo_content = """<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <movie> <title>%s</title> <plot>%s</plot> </movie> """ % (info_vdr['T'], info_vdr['D']) + return self._nfo_content def size(self): - return len(self.nfo_content) + return len(self.nfo_content()) def read(self, offset, size): - return self.nfo_content[offset:offset+size] + return self.nfo_content()[offset:offset+size] def get_stat(self): attr = NodeAttributes() @@ -121,8 +147,13 @@ class NfoNode: class DirNode: def __init__(self, path): self.path = path - self.file_system_name = path.rsplit('/',1)[1] self.cache = [] + self._file_system_name = None + + def file_system_name(self): + if not self._file_system_name: + self._file_system_name = self.path.rsplit('/',1)[1] + return self._file_system_name def content(self): if not self.cache: diff --git a/vdrnfofs/vdrnfofs.py b/vdrnfofs/vdrnfofs.py index 8e32a79..9053bb3 100644 --- a/vdrnfofs/vdrnfofs.py +++ b/vdrnfofs/vdrnfofs.py @@ -123,7 +123,7 @@ class VdrNfoFs(fuse.Fuse): node = get_node(self.video, path) if node: for item in node.content(): - yield fuse.Direntry(item.file_system_name) + yield fuse.Direntry(item.file_system_name()) except: logging.error('VdrFuseFs: Unexpected error for readdir(%s): %s' % (path, format_exception_info())) |