1# This program is free software; you can redistribute it and/or modify 2# it under the terms of the GNU General Public License as published by 3# the Free Software Foundation; either version 2 of the License, or 4# (at your option) any later version. 5 6from tests import TestCase 7 8import os 9 10from senf import fsnative 11 12from quodlibet.util.tagsfrompath import TagsFromPattern 13 14 15class TTagsFromPattern(TestCase): 16 17 def setUp(self): 18 if os.name == "nt": 19 self.f1 = u'C:\\path\\Artist\\Album\\01 - Title.mp3' 20 self.f2 = u'C:\\path\\Artist - Album\\01. Title.mp3' 21 self.f3 = u'C:\\path\\01 - Artist - Title.mp3' 22 self.b1 = u'C:\\path\\01 - Title' 23 self.b2 = u'C:\\path\\01 - Artist - Title' 24 25 else: 26 self.f1 = '/path/Artist/Album/01 - Title.mp3' 27 self.f2 = '/path/Artist - Album/01. Title.mp3' 28 self.f3 = '/path/01 - Artist - Title.mp3' 29 self.b1 = '/path/01 - Title' 30 self.b2 = '/path/01 - Artist - Title' 31 self.nomatch = {} 32 33 def test_songtypes(self): 34 from quodlibet import formats 35 pat = TagsFromPattern('<tracknumber>. <title>') 36 tracktitle = {'tracknumber': '01', 'title': 'Title'} 37 for ext, kind in formats.loaders.items(): 38 f = formats._audio.AudioFile() 39 if not isinstance(kind, type): 40 continue 41 f.__class__ = kind 42 if os.name == "nt": 43 f["~filename"] = u'C:\\path\\Artist - Album\\01. Title' + ext 44 else: 45 f["~filename"] = '/path/Artist - Album/01. Title' + ext 46 self.assertEquals(pat.match(f), tracktitle, ext) 47 48 def test_skip(self): 49 if os.name == "nt": 50 pat = TagsFromPattern('<path>\\<~>\\<~>\\<tracknumber> - <title>') 51 else: 52 pat = TagsFromPattern('<path>/<~>/<~>/<tracknumber> - <title>') 53 self.failUnlessEqual(len(pat.headers), 3) 54 song = pat.match({"~filename": self.f1}) 55 self.failUnlessEqual(song.get("path"), "path") 56 self.failUnlessEqual(song.get("title"), "Title") 57 self.failIf(song.get("album")) 58 self.failIf(song.get("artist")) 59 60 def test_dict(self): 61 tracktitle = {'tracknumber': '01', 'title': 'Title'} 62 pat = TagsFromPattern('<tracknumber> - <title>') 63 self.assertEquals(pat.match({"~filename": self.f1}), tracktitle) 64 65 def test_nongreedy(self): 66 pat = TagsFromPattern('<artist> - <title>') 67 dic = pat.match_path( 68 fsnative(u"Prefuse 73 - The End of Biters - International.ogg")) 69 self.assertEquals(dic["artist"], "Prefuse 73") 70 self.assertEquals(dic["title"], "The End of Biters - International") 71 72 def test_empty(self): 73 pat = TagsFromPattern('') 74 self.assertEquals(pat.match_path(self.f1), self.nomatch) 75 self.assertEquals(pat.match_path(self.f2), self.nomatch) 76 self.assertEquals(pat.match_path(self.f3), self.nomatch) 77 self.assertEquals(pat.match_path(self.b1), self.nomatch) 78 self.assertEquals(pat.match_path(self.b2), self.nomatch) 79 80 def test_tracktitle(self): 81 tracktitle = {'tracknumber': '01', 'title': 'Title'} 82 btracktitle = {'tracknumber': '01', 'title': 'Artist - Title'} 83 pat = TagsFromPattern('<tracknumber> - <title>') 84 self.assertEquals(pat.match_path(self.f1), tracktitle) 85 self.assertEquals(pat.match_path(self.f2), self.nomatch) 86 self.assertEquals(pat.match_path(self.f3), btracktitle) 87 self.assertEquals(pat.match_path(self.b1), self.nomatch) 88 self.assertEquals(pat.match_path(self.b2), self.nomatch) 89 90 def test_path(self): 91 albumtracktitle = {'tracknumber': '01', 'title': 'Title', 92 'album': 'Album'} 93 balbumtracktitle = {'tracknumber': '01', 'title': 'Artist - Title', 94 'album': 'path'} 95 if os.name == "nt": 96 pat = TagsFromPattern('<album>\\<tracknumber> - <title>') 97 else: 98 pat = TagsFromPattern('<album>/<tracknumber> - <title>') 99 self.assertEquals(pat.match_path(self.f1), albumtracktitle) 100 self.assertEquals(pat.match_path(self.f2), self.nomatch) 101 self.assertEquals(pat.match_path(self.f3), balbumtracktitle) 102 self.assertEquals(pat.match_path(self.b1), self.nomatch) 103 self.assertEquals(pat.match_path(self.b2), self.nomatch) 104 105 def test_all(self): 106 all = {'tracknumber': '01', 'title': 'Title', 107 'album': 'Album', 'artist': 'Artist'} 108 if os.name == "nt": 109 pat = TagsFromPattern('<artist>\\<album>\\<tracknumber> - <title>') 110 else: 111 pat = TagsFromPattern('<artist>/<album>/<tracknumber> - <title>') 112 self.assertEquals(pat.match_path(self.f1), all) 113 self.assertEquals(pat.match_path(self.f2), self.nomatch) 114 self.assertEquals(pat.match_path(self.f3), self.nomatch) 115 self.assertEquals(pat.match_path(self.b1), self.nomatch) 116 self.assertEquals(pat.match_path(self.b2), self.nomatch) 117 118 def test_post(self): 119 btracktitle = {'tracknumber': '01', 'title': 'Titl'} 120 vbtracktitle = {'tracknumber': '01', 'title': 'Artist - Titl'} 121 pat = TagsFromPattern('<tracknumber> - <title>e') 122 self.assertEquals(pat.match_path(self.f1), btracktitle) 123 self.assertEquals(pat.match_path(self.f2), self.nomatch) 124 self.assertEquals(pat.match_path(self.f3), vbtracktitle) 125 self.assertEquals(pat.match_path(self.b1), btracktitle) 126 self.assertEquals(pat.match_path(self.b2), vbtracktitle) 127 128 def test_nofakes(self): 129 pat = TagsFromPattern('<~#track> - <title>') 130 self.assertEquals(pat.match_path(self.f1), self.nomatch) 131 self.assertEquals(pat.match_path(self.f2), self.nomatch) 132 self.assertEquals(pat.match_path(self.f3), self.nomatch) 133 self.assertEquals(pat.match_path(self.b1), self.nomatch) 134 self.assertEquals(pat.match_path(self.b2), self.nomatch) 135 136 def test_disctrack(self): 137 pat = TagsFromPattern('<discnumber><tracknumber>. <title>') 138 self.assertEquals(pat.match_path(fsnative(u'101. T1.ogg')), 139 dict(discnumber='1', tracknumber='01', title='T1')) 140 self.assertEquals(pat.match_path(fsnative(u'1318. T18.ogg')), 141 dict(discnumber='13', tracknumber='18', title='T18')) 142 self.assertEquals(pat.match_path(fsnative(u'24. T4.ogg')), 143 dict(discnumber='2', tracknumber='4', title='T4')) 144