From c451c3243715f54ebeac1099f1f474ece6967334 Mon Sep 17 00:00:00 2001 From: coderkun Date: Sun, 4 Jun 2017 15:39:07 +0200 Subject: [PATCH] =?UTF-8?q?Add=20support=20for=20=E2=80=9Calbumartist?= =?UTF-8?q?=E2=80=9D=20tag=20(resolve=20#27)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locale/de/LC_MESSAGES/mcg.mo | Bin 3445 -> 3510 bytes locale/de/LC_MESSAGES/mcg.po | 37 ++++++++++++++++++++--------------- locale/en/LC_MESSAGES/mcg.mo | Bin 3228 -> 3295 bytes locale/en/LC_MESSAGES/mcg.po | 33 ++++++++++++++++++------------- mcg/client.py | 30 ++++++++++++++++++++++++++++ mcg/utils.py | 21 ++++++++++++++++++++ mcg/widgets.py | 12 ++++++------ 7 files changed, 97 insertions(+), 36 deletions(-) diff --git a/locale/de/LC_MESSAGES/mcg.mo b/locale/de/LC_MESSAGES/mcg.mo index 731113904406134e13b0cb1bc83fb9c2df0a2b59..5c4242775b0389cf9a94423af0f613ce0b38f1a2 100644 GIT binary patch delta 921 zcmew=wN1MIo)F7a1_lNOLk0#083qQ1C5#LV&I}9;I?NzZ1_lcj1_nU}1_nzO1_m|; z1_o~y1_nL`28JLO1_mJp28Kiy1_pKp28I$A1_n_E28J3I1_mw$28Ky23=FIc3=DHw z7#O%27#J3_Ffhb3FfgoVVPFtvU|`^91>0B8pw7y`Aj`nO;KB+qD2WxKF^iRfL4bjQ zp@5ZvfrWvAp^+70VH;H4OjZU4UIqq+g{%w=A|QiV85lSj7#NN~)t_U9IQTLv0|N&G z1H&z-xsRdpFTwii85rI{4Q6J87$nBVz@W&$z@W{>z#z@Qz~IXUaX=;;#G!d?3=DD% z3=BPN3=EPC3=FHG>W;F3eZ=sP4dQ`+Y!C;rutP$OkDY;mpMilv7RuKJ@#`5F7;K;d zKI{-5MYA(7@GvkiWU@nou8f_5L63=np^2S=L4tvSVIwER;8UCs1Fvv0Fi0^lFg$^Z z|L0_2P-9?V;N*ftg#j1DLDpOla~-)D7|IzK82q>x80tYjImX4npv1ty@DxgOa6>H6 z=7wlA<%T%Kni~=l?%WIv!VC-yKHLxs61X90B%7OoL5zWcp%$ut3Y4D54T-uH+z=_X)YcH24w~Y22~yg1_K5L22UP{g;hKZ45|za46Qtn zs94PdiHcKD{u8J^W?qN~)OjKLba^3BY{3h0urIGZ#KrMYfihl5Ty;P-Oy`A!#3CrY zX0jx+Go#_=SY}QZ?&?~FwA92BJ%#Gp$*JsiTxPlkCJKh8R>mfi*RsnYaW`LOU&1IA up&O8&nvz+f8=RV0l$;TeSdyV@Y^9K!oW8k&^Di@3b*(~fW{E;|Edv0vR9>n8 delta 855 zcmdlc{Z*>|o)F7a1_lNO0|o{L83qQ1IgAVp&LB23NR)v=gN1=Xkb!|glZAnSje&u| znuURZkAZ=~iG_hdh=GA2kcEMPoq>TNg@u7Zl!1XEhlPQGi-CcmiG_iIm4ShwmxY0W zn}LC0G7AGkJOcy6d=>@KVjY85m?47#K`gAqEApLNrFPGB5}*Ffb&r zGBB_(FfbIdLM$wUs_SHBVBlq7V3^3tz#sxLn3aKnlYxO@3sn6+R)~WSvobJnFfcHj zf|`37Dt{BKubzS79@OB^U;zdOHZ}$ZMFs{2X*LE1X$A%cTQ-OTBH17gjbmeAkYiwA zs9|GZkYr$BmZ8IOq!-B*gx)F);8mFfj14L-?}n3=I7B3=9l9 zPyriuh>yJ485npN7#Jei85o3_7#Pyn85krO7#ONJAqGz7gcvlJlYv2sfq`KyRQv=d z1A`g^1H&awNEH0!ggAtS3t}D@7Xw2%0|SFN7sLboTnr5LN(>AP>$n&gK=ef}hy`D` zAR7O1LE?^u8xjHn+zbrD3=9mS+z<;ixglx8gqwjujDdl{jT@pr7D}gcL!zvZ8{*&= zZiu;4xFJzJi<_YyoM;wtLwvFWN?+z?U{GdYV0gz3Nti-B5DT4o7#LI;7#RF`AU-JJ zfkeS%D1R*vMBf=6h(#Zu`o8f%(g-6j#KB^`5C?1U%0mR~c_DEU$P2M3ffwSF?8%zU z&WsG3bD23=CO5I$a+&BFnJE|=Ss9v6KFKZz;#w#e8d#ZHZvM!=gmLo*&OgimlUPl~ diff --git a/locale/de/LC_MESSAGES/mcg.po b/locale/de/LC_MESSAGES/mcg.po index b1e5ed7..3ba2bbc 100644 --- a/locale/de/LC_MESSAGES/mcg.po +++ b/locale/de/LC_MESSAGES/mcg.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: CoverGrid (mcg)\n" -"POT-Creation-Date: 2017-04-26 12:15+0200\n" -"PO-Revision-Date: 2017-04-28 10:59+0200\n" +"POT-Creation-Date: 2017-06-04 15:34+0200\n" +"PO-Revision-Date: 2017-06-04 15:34+0200\n" "Last-Translator: coderkun \n" "Language-Team: \n" "Language: de\n" @@ -16,6 +16,7 @@ msgstr "" "X-Poedit-SearchPath-0: data/gtk.glade\n" "X-Poedit-SearchPath-1: data/gtk.menu.ui\n" "X-Poedit-SearchPath-2: data/gtk.shortcuts.ui\n" +"X-Poedit-SearchPath-3: mcg\n" #: data/gtk.glade:21 msgid "Tracklist" @@ -89,57 +90,57 @@ msgstr "Bildordner:" msgid "Connection" msgstr "Verbindung" -#: data/gtk.glade:698 data/gtk.menu.ui:30 +#: data/gtk.glade:715 data/gtk.menu.ui:30 msgid "Cover" msgstr "Cover" -#: data/gtk.glade:809 data/gtk.menu.ui:36 +#: data/gtk.glade:826 data/gtk.menu.ui:36 msgid "Playlist" msgstr "Wiedergabeliste" -#: data/gtk.glade:836 +#: data/gtk.glade:853 msgid "search library" msgstr "Bibliothek durchsuchen" -#: data/gtk.glade:977 data/gtk.menu.ui:42 +#: data/gtk.glade:994 data/gtk.menu.ui:42 msgid "Library" msgstr "Bibliothek" -#: data/gtk.glade:1049 data/gtk.shortcuts.ui:74 +#: data/gtk.glade:1066 data/gtk.shortcuts.ui:74 msgid "Connect or disconnect" msgstr "Die Verbindung herstellen oder trennen" -#: data/gtk.glade:1071 data/gtk.shortcuts.ui:81 +#: data/gtk.glade:1088 data/gtk.shortcuts.ui:81 msgid "Switch between play and pause" msgstr "Zwischen Abspielen und Pause wechseln" -#: data/gtk.glade:1091 +#: data/gtk.glade:1108 msgid "Adjust the volume" msgstr "Die Lautstärke anpassen" -#: data/gtk.glade:1149 data/gtk.shortcuts.ui:101 +#: data/gtk.glade:1166 data/gtk.shortcuts.ui:101 msgid "Show the cover in fullscreen mode" msgstr "Das Cover im Vollbildmodus anzeigen" -#: data/gtk.glade:1172 data/gtk.glade:1277 +#: data/gtk.glade:1189 data/gtk.glade:1294 msgid "Settings and actions" msgstr "Einstellungen und Aktionen" -#: data/gtk.glade:1220 data/gtk.shortcuts.ui:88 +#: data/gtk.glade:1237 data/gtk.shortcuts.ui:88 msgid "Clear the playlist" msgstr "Die Wiedergabeliste leeren" -#: data/gtk.glade:1254 data/gtk.shortcuts.ui:114 +#: data/gtk.glade:1271 data/gtk.shortcuts.ui:114 msgid "Search the library" msgstr "Die Bibliothek durchsuchen" -#: data/gtk.glade:1322 +#: data/gtk.glade:1339 msgid "" "CoverGrid is a client for the Music Player Daemon, focusing on albums " "instead of single tracks." msgstr "" -"CoverGrid ist ein ein Client für den Music Player Daemon, der sich " -"auf Alben anstellen von einzelnen Songs fokussiert." +"CoverGrid ist ein ein Client für den Music Player Daemon, der sich auf Alben " +"anstellen von einzelnen Songs fokussiert." #: data/gtk.menu.ui:7 msgid "Connect" @@ -209,6 +210,10 @@ msgstr "Cover-Paneel" msgid "Library Panel" msgstr "Bibliothekspaneel" +#: mcg/utils.py:61 mcg/widgets.py:989 +msgid "{} feat. {}" +msgstr "{} mit {}" + #~ msgid "_Play" #~ msgstr "_Abspielen" diff --git a/locale/en/LC_MESSAGES/mcg.mo b/locale/en/LC_MESSAGES/mcg.mo index 6d527478303fe22f6399e05dd5f643a63470e81e..17a5cd18d7e274c6dbf671690dd5b66d9b9da70e 100644 GIT binary patch delta 906 zcmbOud0(>ro)F7a1_lNOLk0#083qQ1C5#LV&I}9;I?NzZ1_lcj1_nU}1_nzO1_m|; z1_o~y1_nL`28JLO1_mJp28Kiy1_pKp28I$A1_n_E28J3I1_mw$28Ky23=FIc3=DHw z7#O%27#J3_Ffhb3FfgoVVPFtvU|`^91>0B8pw7y`Aj`nO;KB+qD2WxKF^iRfL4bjQ zp@5ZvfrWvAp^+70VH;H4OjZU4UIqq+g{%w=A|QiV85lSj7#NN~)t_U9IQTLv0|N&G z1H&z-xsRdpFTwii85rI{4Q6J87$nBVz@W&$z@W{>z#z@Qz~IXUaX=;;#G!d?3=DD% z3=BPN3=EPC3=FHG>W;F3eZ=sP4dQ`+Y!C;rutP$OkDY;mpMilv7RuKJ@#`5F7;K;d zKI{-5MYA(7@GvkiWU@nou8f_5L4b*Yp@|(56_Yt3K3mEOF?bCpBxH7TLPGEyCnPGa zaYCZv4JX7w-#H=X{pEy21t%8+Lp>-iGPxiwZ{&jba2^-Lpgmj=jYqg3QE`e35)!w$ zAQnD=s{70Zarkd8NCI}! zU%(BCidJq022BPAhUMH4A6?{zIP?xTBr1M!L!v^G2SOY3Ks@Bj1FTNg@u7Zl!1XEhlPQGi-CcmiG_iIm4ShwmxY0W zn}LC0G7AGkJOcy6d=>@KVjY85m?47#K`gAqEApLNrFPGB5}*Ffb&r zGBB_(FfbIdLM$wUs_SHBVBlq7V3^3tz#sxLn3aKnlYxO@3sn6+R)~WSvobJnFfcHj zf|`37Dt{BKubzS79@OB^U;zdOHZ}$ZMFs{2X*LE1X$A%cTQ-OTBH17gjbmeAkYiwA zs9|GZkYr$BmZ8IOq!-B*gx)F);8mFfj14L-?}n3=I7B3=9l9 zPyriuh>yJ485npN7#Jei85q7YGBBjEL!uyt6XK&hPKW`eoRAP{;e>?TbWR3v6wK#@ zM8Q^0h(iu=LZaXpCnO3kaYCZNh>L-t9u((ZTo9k7b3qJh<$`GJ<$^@PWG+YuEa8G! zxDu*v4;RG2N4OwSaES}zBA~g1=C6*|;I*@o+QLgX2z+8)C2;H^d-I zZb%gPaWgPzGB7X{a6^1FiyPw5rQDDxILr-+f=5vL4>u$V#CRYcFy?_c$dU&VV$M8} zC\n" "Language-Team: \n" "Language: en\n" @@ -15,6 +15,7 @@ msgstr "" "X-Poedit-SearchPath-0: data/gtk.glade\n" "X-Poedit-SearchPath-1: data/gtk.menu.ui\n" "X-Poedit-SearchPath-2: data/gtk.shortcuts.ui\n" +"X-Poedit-SearchPath-3: mcg\n" #: data/gtk.glade:21 msgid "Tracklist" @@ -88,51 +89,51 @@ msgstr "Image Directory:" msgid "Connection" msgstr "Connection" -#: data/gtk.glade:698 data/gtk.menu.ui:30 +#: data/gtk.glade:715 data/gtk.menu.ui:30 msgid "Cover" msgstr "Cover" -#: data/gtk.glade:809 data/gtk.menu.ui:36 +#: data/gtk.glade:826 data/gtk.menu.ui:36 msgid "Playlist" msgstr "Playlist" -#: data/gtk.glade:836 +#: data/gtk.glade:853 msgid "search library" msgstr "search library" -#: data/gtk.glade:977 data/gtk.menu.ui:42 +#: data/gtk.glade:994 data/gtk.menu.ui:42 msgid "Library" msgstr "Library" -#: data/gtk.glade:1049 data/gtk.shortcuts.ui:74 +#: data/gtk.glade:1066 data/gtk.shortcuts.ui:74 msgid "Connect or disconnect" msgstr "Connect or disconnect" -#: data/gtk.glade:1071 data/gtk.shortcuts.ui:81 +#: data/gtk.glade:1088 data/gtk.shortcuts.ui:81 msgid "Switch between play and pause" msgstr "Switch between play and pause" -#: data/gtk.glade:1091 +#: data/gtk.glade:1108 msgid "Adjust the volume" msgstr "Adjust the volume" -#: data/gtk.glade:1149 data/gtk.shortcuts.ui:101 +#: data/gtk.glade:1166 data/gtk.shortcuts.ui:101 msgid "Show the cover in fullscreen mode" msgstr "Show the cover in fullscreen mode" -#: data/gtk.glade:1172 data/gtk.glade:1277 +#: data/gtk.glade:1189 data/gtk.glade:1294 msgid "Settings and actions" msgstr "Settings and actions" -#: data/gtk.glade:1220 data/gtk.shortcuts.ui:88 +#: data/gtk.glade:1237 data/gtk.shortcuts.ui:88 msgid "Clear the playlist" msgstr "Clear the playlist" -#: data/gtk.glade:1254 data/gtk.shortcuts.ui:114 +#: data/gtk.glade:1271 data/gtk.shortcuts.ui:114 msgid "Search the library" msgstr "Search the library" -#: data/gtk.glade:1322 +#: data/gtk.glade:1339 msgid "" "CoverGrid is a client for the Music Player Daemon, focusing on albums " "instead of single tracks." @@ -208,6 +209,10 @@ msgstr "Cover Panel" msgid "Library Panel" msgstr "Library Panel" +#: mcg/utils.py:61 mcg/widgets.py:989 +msgid "{} feat. {}" +msgstr "{} feat. {}" + #~ msgid "Show the keyboard shortcuts (this dialog)" #~ msgstr "Show the keyboard shortcuts (this dialog)" diff --git a/mcg/client.py b/mcg/client.py index 30a3cc4..e434ced 100644 --- a/mcg/client.py +++ b/mcg/client.py @@ -628,6 +628,8 @@ class Client(Base): track.set_length(song['time']) if 'date' in song: track.set_date(song['date']) + if 'albumartist' in song: + track.set_albumartists(song['albumartist']) return track @@ -653,6 +655,7 @@ class MCGAlbum: def __init__(self, title, host, image_dir): self._artists = [] + self._albumartists = [] self._pathes = [] if type(title) is list: title = title[0] @@ -672,6 +675,14 @@ class MCGAlbum: def get_artists(self): + if self._albumartists: + return [artist for artist in self._artists if artist not in self._albumartists] + return self._artists + + + def get_albumartists(self): + if self._albumartists: + return self._albumartists return self._artists @@ -699,6 +710,9 @@ class MCGAlbum: for artist in track.get_artists(): if artist not in self._artists: self._artists.append(artist) + for artist in track.get_albumartists(): + if artist not in self._albumartists: + self._albumartists.append(artist) if track.get_date() is not None and track.get_date() not in self._dates: self._dates.append(track.get_date()) path = os.path.dirname(track.get_file()) @@ -849,6 +863,7 @@ class MCGTrack: file = file[0] self._file = file + self._albumartists = [] self._track = None self._length = 0 self._date = None @@ -859,6 +874,20 @@ class MCGTrack: def get_artists(self): + if self._albumartists: + return [artist for artist in self._artists if artist not in self._albumartists] + return self._artists + + + def set_albumartists(self, artists): + if type(artists) is not list: + artists = [artists] + self._albumartists = artists + + + def get_albumartists(self): + if self._albumartists: + return self._albumartists return self._artists @@ -915,6 +944,7 @@ class MCGPlaylistTrack(MCGTrack): track.get_title(), track.get_file() ) + self.set_albumartists(track.get_albumartists()) self.set_track(track.get_track()) self.set_length(track.get_length()) self.set_date(track.get_date()) diff --git a/mcg/utils.py b/mcg/utils.py index 7cb9e2f..03da77c 100644 --- a/mcg/utils.py +++ b/mcg/utils.py @@ -3,6 +3,7 @@ import gi gi.require_version('Gtk', '3.0') +import locale import os import urllib @@ -54,6 +55,26 @@ class Utils: return pixbuf + def create_artists_label(album): + label = ', '.join(album.get_albumartists()) + if album.get_artists(): + label = locale.gettext("{} feat. {}").format( + label, + ", ".join(album.get_artists()) + ) + return label + + + def create_track_title(track): + title = track.get_title() + if track.get_artists(): + title = locale.gettext("{} feat. {}").format( + title, + ", ".join(track.get_artists()) + ) + return title + + class TracklistSize: diff --git a/mcg/widgets.py b/mcg/widgets.py index c654125..2e91c3c 100644 --- a/mcg/widgets.py +++ b/mcg/widgets.py @@ -907,7 +907,7 @@ class CoverPanel(GObject.GObject): ) self._album_artist_label.set_markup( GObject.markup_escape_text( - ', '.join(album.get_artists()) + ', '.join(album.get_albumartists()) ) ) @@ -985,7 +985,7 @@ class CoverPanel(GObject.GObject): cur_length, Gtk.PositionType.RIGHT, GObject.markup_escape_text( - track.get_title() + Utils.create_track_title(track) ) ) length = length + track.get_length() @@ -1138,7 +1138,7 @@ class PlaylistPanel(GObject.GObject): # Set labels self._standalone_title.set_text(album.get_title()) - self._standalone_artist.set_text(", ".join(album.get_artists())) + self._standalone_artist.set_text(", ".join(album.get_albumartists())) # Show panel self._open_standalone() @@ -1213,7 +1213,7 @@ class PlaylistPanel(GObject.GObject): GObject.markup_escape_text("\n".join([ album.get_title(), ', '.join(album.get_dates()), - ', '.join(album.get_artists()) + Utils.create_artists_label(album) ])), album.get_hash() ]) @@ -1454,7 +1454,7 @@ class LibraryPanel(GObject.GObject): # Set labels self._standalone_title.set_text(album.get_title()) - self._standalone_artist.set_text(", ".join(album.get_artists())) + self._standalone_artist.set_text(", ".join(album.get_albumartists())) # Show panel self._open_standalone() @@ -1581,7 +1581,7 @@ class LibraryPanel(GObject.GObject): GObject.markup_escape_text("\n".join([ album.get_title(), ', '.join(album.get_dates()), - ', '.join(album.get_artists()) + Utils.create_artists_label(album) ])), hash ])