From 76316629300d1d33cc0bd2d4fbcaedd3faa61f41 Mon Sep 17 00:00:00 2001 From: Paul Busch Date: Fri, 8 Jul 2011 20:18:29 +0200 Subject: [PATCH 1/6] adding template files --- data/interfaces/default/_inc_footer.tmpl | 6 ++++ data/interfaces/default/_inc_header.tmpl | 37 +++++++++++++++++++ data/interfaces/default/albumPage.tmpl | 45 ++++++++++++++++++++++++ data/interfaces/default/artistInfo.tmpl | 13 +++++++ data/interfaces/default/artistPage.tmpl | 39 ++++++++++++++++++++ data/interfaces/default/index.tmpl | 33 +++++++++++++++++ data/interfaces/default/manage.tmpl | 28 +++++++++++++++ data/interfaces/default/search.tmpl | 31 ++++++++++++++++ 8 files changed, 232 insertions(+) create mode 100644 data/interfaces/default/_inc_footer.tmpl create mode 100644 data/interfaces/default/_inc_header.tmpl create mode 100644 data/interfaces/default/albumPage.tmpl create mode 100644 data/interfaces/default/artistInfo.tmpl create mode 100644 data/interfaces/default/artistPage.tmpl create mode 100644 data/interfaces/default/index.tmpl create mode 100644 data/interfaces/default/manage.tmpl create mode 100644 data/interfaces/default/search.tmpl diff --git a/data/interfaces/default/_inc_footer.tmpl b/data/interfaces/default/_inc_footer.tmpl new file mode 100644 index 00000000..9bf2eafe --- /dev/null +++ b/data/interfaces/default/_inc_footer.tmpl @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/data/interfaces/default/_inc_header.tmpl b/data/interfaces/default/_inc_header.tmpl new file mode 100644 index 00000000..0468460c --- /dev/null +++ b/data/interfaces/default/_inc_header.tmpl @@ -0,0 +1,37 @@ +#attr title = "" +#attr rootPath = "" +#attr scripts = "" +#attr styles = "" + + + Headphones $title + + + + + + + + + +
+ + +
+
+
+
\ No newline at end of file diff --git a/data/interfaces/default/albumPage.tmpl b/data/interfaces/default/albumPage.tmpl new file mode 100644 index 00000000..66b9f4d1 --- /dev/null +++ b/data/interfaces/default/albumPage.tmpl @@ -0,0 +1,45 @@ +#attr $albumASIN = "" +#attr $albumTitle = "" +#attr $albumID = "" +#attr $artitstID = "" +#attr $artistName = "" +#import os.path +#import time +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl") + + + + + + + + + + + + #for $track in $tracks + + + + + + #end for +
+ #if $albumASIN: + +
+ #end if +
+ ${artistName} -${albumTitle}
+ Download
+
Track #Track TitleDuration
${track[7]} + ${track[3]}(link) + + #try + #echo time.strftime("%M:%S", time.gmtime(int($track[4])/1000)) + #except + n/a + #end try +
+ +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_footer.tmpl") \ No newline at end of file diff --git a/data/interfaces/default/artistInfo.tmpl b/data/interfaces/default/artistInfo.tmpl new file mode 100644 index 00000000..ae8480ae --- /dev/null +++ b/data/interfaces/default/artistInfo.tmpl @@ -0,0 +1,13 @@ +#attr $artistName = "" +#attr $artistUuid = "" +#attr $releaseGroups = [] +#import os.path +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl") + Artist Name: $artistName
+ Unique ID: $artistUuid
+
+ Albums:
+ #for $releaseGroup in $releaseGroups: + $releaseGroup
+ #end for +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_footer.tmpl") \ No newline at end of file diff --git a/data/interfaces/default/artistPage.tmpl b/data/interfaces/default/artistPage.tmpl new file mode 100644 index 00000000..76af1721 --- /dev/null +++ b/data/interfaces/default/artistPage.tmpl @@ -0,0 +1,39 @@ +#attr $artistName = "" +#attr $artistID = "" +#import os.path +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl") + + + + + + + + + + + #for $album in $albums + + + + + + + #end for +
+

$artistName

+
Album NameRelease DateStatus
+ + $album[0] + (link)$album[1] + #if $album[3] == 'Skipped': + $album[3][want] + #elif $album[3] == 'Wanted': + $album[3][skip] + #elif $album[3] == 'Downloaded' or $album[3] == 'Snatched': + $album[3][retry] + #else: + $album[3] + #end if +
+#include os.path.abspath($appPath+"/data/interfaces/default/_inc_footer.tmpl") \ No newline at end of file diff --git a/data/interfaces/default/index.tmpl b/data/interfaces/default/index.tmpl new file mode 100644 index 00000000..570c355a --- /dev/null +++ b/data/interfaces/default/index.tmpl @@ -0,0 +1,33 @@ +#import os.path +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl") + + + + + + + #for $artist in $artists + + + + + + #end for +
Artist NameStatusUpcoming Albums
+ $artist[0] + (link) + [delete] + + #if $artist[2] == 'Active': + $artist[2] (pause) + #else: + $artist[2](resume) + #end if + + #try + $artist[3] $artist[4] + #except + None + #end try +
+#include os.path.abspath($appPath+"/data/interfaces/default/_inc_footer.tmpl") \ No newline at end of file diff --git a/data/interfaces/default/manage.tmpl b/data/interfaces/default/manage.tmpl new file mode 100644 index 00000000..92da4055 --- /dev/null +++ b/data/interfaces/default/manage.tmpl @@ -0,0 +1,28 @@ +#attr $path = "" +#import os.path +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl") + +
+

Import or Sync Your iTunes Library/Music Folder

+

Enter the full path to your iTunes XML file or music folder + i.e. /Users/"username"/Music/iTunes/iTunes Music Library.xml + or /Users/"username"/Music/iTunes/iTunes Media/Music + (artists should have their own directories for folder import to work) + note: This process can take a LONG time! + Once you click "Submit" you can navigate away from this + page while the process runs.

+
+ + +
+
+ + +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_footer.tmpl") \ No newline at end of file diff --git a/data/interfaces/default/search.tmpl b/data/interfaces/default/search.tmpl new file mode 100644 index 00000000..4ac94ebd --- /dev/null +++ b/data/interfaces/default/search.tmpl @@ -0,0 +1,31 @@ +#import os.path +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl") + +
+ Results: +
    +
      +
+

+#include os.path.abspath($appPath+"/data/interfaces/default/_inc_footer.tmpl") \ No newline at end of file From 873bdf7c64ac46016777f42d89f8691915705fe5 Mon Sep 17 00:00:00 2001 From: Paul Busch Date: Fri, 8 Jul 2011 20:19:16 +0200 Subject: [PATCH 2/6] Switching to templates --- headphones.py | 5 +- webServer.py | 174 ++++++++++++++++---------------------------------- 2 files changed, 59 insertions(+), 120 deletions(-) diff --git a/headphones.py b/headphones.py index 0dc8a3c6..64d2ab32 100755 --- a/headphones.py +++ b/headphones.py @@ -106,8 +106,9 @@ def serverstart(): cherrypy.engine.subscribe('start', browser, priority=90) logger.log(u"Starting Headphones on port:" + settings['http_port']) - cherrypy.quickstart(webServer.Headphones(), config = conf) - + root = webServer.Headphones("data/interfaces/default/") + cherrypy.quickstart(root, config = conf) + if __name__ == '__main__': serverstart() diff --git a/webServer.py b/webServer.py index c75ff37d..5efab693 100644 --- a/webServer.py +++ b/webServer.py @@ -13,15 +13,22 @@ import sys import configobj from headphones import FULL_PATH, config_file import logger +from Cheetah.Template import Template database = os.path.join(FULL_PATH, 'headphones.db') class Headphones: + + def __init__(self,templatePath): + """docstring for __init__""" + self.templatePath = templatePath def index(self): - page = [templates._header] - page.append(templates._logobar) - page.append(templates._nav) + + filename = os.path.join(self.templatePath,"index.tmpl") + template = Template(file=filename) + template.rootPath = "." + template.appPath = "." #Display Database if it exists: if os.path.exists(database): #logger.log(u"Loading artists from the database...") @@ -30,129 +37,71 @@ class Headphones: c.execute('SELECT ArtistName, ArtistID, Status from artists order by ArtistSortName collate nocase') results = c.fetchall() i = 0 - page.append('''
- - - - - - ''') + template.artists = [] while i < len(results): c.execute('''SELECT AlbumTitle, ReleaseDate, DateAdded, AlbumID from albums WHERE ArtistID='%s' order by ReleaseDate DESC''' % results[i][1]) latestalbum = c.fetchall() today = datetime.date.today() - if len(latestalbum) > 0: - if latestalbum[0][1] > datetime.date.isoformat(today): - newalbumName = '%s' % (latestalbum[0][3], latestalbum[0][0]) - releaseDate = '(%s)' % latestalbum[0][1] - else: - newalbumName = 'None' - releaseDate = "" if len(latestalbum) == 0: - newalbumName = 'None' - releaseDate = "" - if results[i][2] == 'Paused': - newStatus = '''%s(resume)''' % (results[i][2], results[i][1]) - else: - newStatus = '''%s(pause)''' % (results[i][2], results[i][1]) - page.append(''' - - ''' % (results[i][1], results[i][0], results[i][1], results[i][1], newStatus, newalbumName, releaseDate)) + results[i][3] = 'None' + results[i][4] = "" + elif latestalbum[0][1] > datetime.date.isoformat(today): + results[i][3] = '%s' % (latestalbum[0][3], latestalbum[0][0]) + results[i][4] = '(%s)' % latestalbum[0][1] + + template.artists.append(results[i]) i = i+1 c.close() - page.append('''
Artist NameStatusUpcoming Albums
%s - (link) [delete]%s%s %s
''') - - else: - page.append("""
Add some artists to the database!
""") - page.append(templates._footer) - return page + return str(template) index.exposed = True - def artistPage(self, ArtistID): - page = [templates._header] - page.append(templates._logobar) - page.append(templates._nav) + filename = os.path.join(self.templatePath,"artistPage.tmpl") + template = Template(file=filename) + template.rootPath = "." + template.appPath = "." + template.artistID = ArtistID conn=sqlite3.connect(database) c=conn.cursor() c.execute('''SELECT ArtistName from artists WHERE ArtistID="%s"''' % ArtistID) artistname = c.fetchall() + template.artistName = artistname[0] c.execute('''SELECT AlbumTitle, ReleaseDate, AlbumID, Status, ArtistName, AlbumASIN from albums WHERE ArtistID="%s" order by ReleaseDate DESC''' % ArtistID) results = c.fetchall() c.close() i = 0 - page.append('''
-

%s

- - - - - - - ''' % (artistname[0])) + template.albums = [] while i < len(results): - if results[i][3] == 'Skipped': - newStatus = '''%s [want]''' % (results[i][3], results[i][2], ArtistID) - elif results[i][3] == 'Wanted': - newStatus = '''%s[skip]''' % (results[i][3], results[i][2], ArtistID) - elif results[i][3] == 'Downloaded': - newStatus = '''%s[retry]''' % (results[i][3], results[i][2], ArtistID) - elif results[i][3] == 'Snatched': - newStatus = '''%s[retry]''' % (results[i][3], results[i][2], ArtistID) - else: - newStatus = '%s' % (results[i][3]) - page.append(''' - - - ''' % (results[i][5], results[i][2], results[i][0], results[i][2], results[i][1], newStatus)) + template.albums.append(results[i]) i = i+1 - page.append('''
Album NameRelease DateStatus
%s - (link)%s%s
''') - page.append(templates._footer) - return page + return str(template) artistPage.exposed = True def albumPage(self, AlbumID): - page = [templates._header] - page.append(templates._logobar) - page.append(templates._nav) + filename = os.path.join(self.templatePath,"albumPage.tmpl") + template = Template(file=filename) + template.rootPath = "." + template.appPath = "." conn=sqlite3.connect(database) c=conn.cursor() c.execute('''SELECT ArtistID, ArtistName, AlbumTitle, TrackTitle, TrackDuration, TrackID, AlbumASIN from tracks WHERE AlbumID="%s"''' % AlbumID) results = c.fetchall() - if results[0][6]: - albumart = '''


''' % results[0][6] - else: - albumart = '' c.close() + template.albumASIN = results[0][6] + template.artistID = results[0][0] + template.artistName = results[0][1] + template.albumTitle = results[0][2] + template.tracks = [] i = 0 - page.append('''''') - - page.append(templates._footer) - return page - + return str(template) albumPage.exposed = True @@ -182,15 +131,17 @@ class Headphones: findArtist.exposed = True def artistInfo(self, artistid): - page = [templates._header] + + filename = os.path.join(self.templatePath,"artistInfo.tmpl") + template = Template(file=filename) + template.rootPath = "." + template.appPath = "." inc = ws.ArtistIncludes(releases=(m.Release.TYPE_OFFICIAL, m.Release.TYPE_ALBUM), releaseGroups=True) artist = ws.Query().getArtistById(artistid, inc) - page.append('''Artist Name: %s
''' % artist.name) - page.append('''Unique ID: %s

Albums:
''' % u.extractUuid(artist.id)) - for rg in artist.getReleaseGroups(): - page.append('''%s
''' % rg.title) - return page - + template.artistName = artist.name + template.artistUuid = artistid + template.releaseGroups = artist.getReleaseGroups() + return str(template) artistInfo.exposed = True def addArtist(self, artistid): @@ -316,30 +267,17 @@ class Headphones: upcoming.exposed = True def manage(self): + filename = os.path.join(self.templatePath,"manage.tmpl") + template = Template(file=filename) + template.rootPath = "." + template.appPath = "." config = configobj.ConfigObj(config_file) try: path = config['General']['path_to_xml'] except: path = 'Absolute path to iTunes XML or Top-Level Music Directory' - page = [templates._header] - page.append(templates._logobar) - page.append(templates._nav) - page.append('''

Import or Sync Your iTunes Library/Music Folder


- Enter the full path to your iTunes XML file or music folder

- i.e. /Users/"username"/Music/iTunes/iTunes Music Library.xml
- or /Users/"username"/Music/iTunes/iTunes Media/Music

(artists should have their own directories for folder import to work) -

note: This process can take a LONG time!

- Once you click "Submit" you can navigate away from this - page while the process runs.


-
- -


-
''' % path) - page.append(templates._footer) - return page + template.path = path + return str(template) manage.exposed = True def importItunes(self, path): From 9b78a50c179bd2a3b1f7101a84c94d6984d72e4a Mon Sep 17 00:00:00 2001 From: Paul Busch Date: Sun, 10 Jul 2011 19:00:04 +0200 Subject: [PATCH 3/6] more templates --- data/interfaces/default/config.tmpl | 237 ++++++++++++++++++++++++++ data/interfaces/default/hostory.tmpl | 3 + data/interfaces/default/upcoming.tmpl | 3 + webServer.py | 20 +-- 4 files changed, 253 insertions(+), 10 deletions(-) create mode 100644 data/interfaces/default/config.tmpl create mode 100644 data/interfaces/default/hostory.tmpl create mode 100644 data/interfaces/default/upcoming.tmpl diff --git a/data/interfaces/default/config.tmpl b/data/interfaces/default/config.tmpl new file mode 100644 index 00000000..b5b2fa8b --- /dev/null +++ b/data/interfaces/default/config.tmpl @@ -0,0 +1,237 @@ +#import os.path +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl") +
+ +
+
+
+

Web Interface

+ + + + + + + + + + + + + + + + +
+

+ HTTP Host:

+
+ i.e. localhost or 0.0.0.0 +

+
+

+ HTTP Username:

+ +

+
+

+ HTTP Port:

+ +

+
+

+ HTTP Password:

+ +

+
+

Launch Browser on Startup:

+
+ +

Download Settings

+ + + + + + + + + + + + + + + + + + + + + + + +
+

SABnzbd Host:


+ + usually localhost:8080 +
+

SABnzbd Username:

+
+
+ +

SABnzbd API:

+
+
+ +

SABnzbd Password:

+
+
+ +

SABnzbd Category:

+
+
+ +

Music Download Directory:


+ + Absolute or relative path to the dir where SAB downloads your music
+ i.e. Downloads/music or /Users/name/Downloads/music
+
+
+ +

Usenet Retention:

+
+ +

Search Providers

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+

NZBMatrix:

+
+

+ NZBMatrix Username:
+ +

+
+

+ NZBMatrix API:
+ +

+
+
+ +

Newznab:

+
+
+ +

+ Newznab Host:
+
+ i.e. http://nzb.su +

+
+
+ +

+ Newznab API:
+ +

+
+
+ +

NZBs.org:

+
+
+ +

+ NZBs.org UID:
+ +

+
+
+ +

+ NZBs.org Hash:
+ +

+
+ +

Quality & Post Processing

+ + + + + + + + + + + + + + + + +
+

Album Quality:

+ Include lossless
+ Convert lossless to mp3 +
+

+

iTunes:

+ Move downloads to iTunes +

+
+
+ +

Path to iTunes folder:
+
+ i.e. Music/iTunes or /Users/name/Music/iTunes +

+
+ Renaming & Metadata: +

+ Rename & add metadata +
+ Delete leftover files +

+
+
+

Album Art:

+ Add album art +
+ +


+ (For now, all changes require a restart to take effect)

+
+
+#include os.path.abspath($appPath+"/data/interfaces/default/_inc_footer.tmpl") \ No newline at end of file diff --git a/data/interfaces/default/hostory.tmpl b/data/interfaces/default/hostory.tmpl new file mode 100644 index 00000000..0c03e2bf --- /dev/null +++ b/data/interfaces/default/hostory.tmpl @@ -0,0 +1,3 @@ +#import os.path +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl") +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_footer.tmpl") \ No newline at end of file diff --git a/data/interfaces/default/upcoming.tmpl b/data/interfaces/default/upcoming.tmpl new file mode 100644 index 00000000..0c03e2bf --- /dev/null +++ b/data/interfaces/default/upcoming.tmpl @@ -0,0 +1,3 @@ +#import os.path +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl") +#include os.path.abspath($appPath+"/data/interfaces/default/_inc_footer.tmpl") \ No newline at end of file diff --git a/webServer.py b/webServer.py index 5efab693..4d308280 100644 --- a/webServer.py +++ b/webServer.py @@ -259,11 +259,11 @@ class Headphones: unqueueAlbum.exposed = True def upcoming(self): - page = [templates._header] - page.append(templates._logobar) - page.append(templates._nav) - page.append(templates._footer) - return page + filename = os.path.join(self.templatePath,"upcoming.tmpl") + template = Template(file=filename) + template.rootPath = "." + template.appPath = "." + return str(template) upcoming.exposed = True def manage(self): @@ -303,11 +303,11 @@ class Headphones: def history(self): - page = [templates._header] - page.append(templates._logobar) - page.append(templates._nav) - page.append(templates._footer) - return page + filename = os.path.join(self.templatePath,"history.tmpl") + template = Template(file=filename) + template.rootPath = "." + template.appPath = "." + return str(template) history.exposed = True def config(self): From aa51a08f20ad33e2dfed6b6506354274f79942d4 Mon Sep 17 00:00:00 2001 From: Paul Busch Date: Sun, 10 Jul 2011 19:05:59 +0200 Subject: [PATCH 4/6] fixed typo --- data/interfaces/default/{hostory.tmpl => history.tmpl} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename data/interfaces/default/{hostory.tmpl => history.tmpl} (100%) diff --git a/data/interfaces/default/hostory.tmpl b/data/interfaces/default/history.tmpl similarity index 100% rename from data/interfaces/default/hostory.tmpl rename to data/interfaces/default/history.tmpl From ab73c797f1ab622b891c98e3ba4aaf9002939b69 Mon Sep 17 00:00:00 2001 From: Paul Busch Date: Sun, 10 Jul 2011 22:48:26 +0200 Subject: [PATCH 5/6] config also as template --- data/interfaces/default/config.tmpl | 57 +++++++++++++++-------------- webServer.py | 12 +++--- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/data/interfaces/default/config.tmpl b/data/interfaces/default/config.tmpl index b5b2fa8b..0697a50d 100644 --- a/data/interfaces/default/config.tmpl +++ b/data/interfaces/default/config.tmpl @@ -1,4 +1,5 @@ #import os.path +#import config #include os.path.abspath($appPath+"/data/interfaces/default/_inc_header.tmpl")
@@ -17,14 +18,14 @@

HTTP Host:

-
+
i.e. localhost or 0.0.0.0

HTTP Username:

- +

@@ -33,21 +34,21 @@

HTTP Port:

- +

HTTP Password:

- +

-

Launch Browser on Startup:

+

Launch Browser on Startup:

@@ -57,13 +58,13 @@ @@ -71,13 +72,13 @@ @@ -85,13 +86,13 @@
-

SABnzbd Host:


+

SABnzbd Host:


usually localhost:8080
-

SABnzbd Username:

+

SABnzbd Username:


-

SABnzbd API:

+

SABnzbd API:


-

SABnzbd Password:

+

SABnzbd Password:


-

SABnzbd Category:

+

SABnzbd Category:


-

Music Download Directory:


+

Music Download Directory:


Absolute or relative path to the dir where SAB downloads your music
i.e. Downloads/music or /Users/name/Downloads/music
@@ -102,7 +103,7 @@

-

Usenet Retention:

+

Usenet Retention:

@@ -112,20 +113,20 @@ @@ -134,7 +135,7 @@ @@ -152,7 +153,7 @@

Newznab API:
- +

@@ -161,7 +162,7 @@ @@ -178,7 +179,7 @@

NZBs.org Hash:
- +

@@ -190,14 +191,14 @@ @@ -206,7 +207,7 @@ @@ -225,7 +226,7 @@
-

NZBMatrix:

+

NZBMatrix:

NZBMatrix Username:
- +

NZBMatrix API:
- +


-

Newznab:

+

Newznab:

@@ -142,7 +143,7 @@

Newznab Host:
-
+
i.e. http://nzb.su


-

NZBs.org:

+

NZBs.org:

@@ -169,7 +170,7 @@

NZBs.org UID:
- +

Album Quality:

- Include lossless
- Convert lossless to mp3 + Include lossless
+ Convert lossless to mp3

iTunes:

- Move downloads to iTunes + Move downloads to iTunes


-

Path to iTunes folder:
+

Path to iTunes folder:

i.e. Music/iTunes or /Users/name/Music/iTunes

@@ -214,9 +215,9 @@
Renaming & Metadata:

- Rename & add metadata + Rename & add metadata
- Delete leftover files + Delete leftover files


Album Art:

- Add album art + Add album art
diff --git a/webServer.py b/webServer.py index 4d308280..10ff0738 100644 --- a/webServer.py +++ b/webServer.py @@ -311,13 +311,11 @@ class Headphones: history.exposed = True def config(self): - page = [templates._header] - page.append(templates._logobar) - page.append(templates._nav) - page.append(config.form) - page.append(templates._footer) - return page - + filename = os.path.join(self.templatePath,"config.tmpl") + template = Template(file=filename) + template.rootPath = "." + template.appPath = "." + return str(template) config.exposed = True From 6b2834e85d41d725921baf9ef7aa008c44aa33a4 Mon Sep 17 00:00:00 2001 From: Paul Busch Date: Sun, 10 Jul 2011 22:50:52 +0200 Subject: [PATCH 6/6] changed back to old search form --- data/interfaces/default/_inc_header.tmpl | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/data/interfaces/default/_inc_header.tmpl b/data/interfaces/default/_inc_header.tmpl index 0468460c..c28e76cd 100644 --- a/data/interfaces/default/_inc_header.tmpl +++ b/data/interfaces/default/_inc_header.tmpl @@ -8,22 +8,15 @@ - - - -