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