Commits

Vladimir Kolev committed 0267f50

Added Last.FM Scrobbling support with pylast library
Modified the preferences dialog
Updated translations
Updated README file

Comments (0)

Files changed (9)

 gSharkDown
 ==========
 
-It is a easy to use GNOME Desktop application for downloading and
-playing audio files from the grooveshark audioservice. 
+It is a easy to use GNOME Desktop application for playing and
+downloading audio files from the grooveshark audioservice. 
 
-.. image:: http://min.us/ilqaY4.png
+.. image:: http://i.min.us/ij5Ok2.png
 
 Features
 ========
     - Remembers the playlist on exit
     - Notifications on track change *(disabled by default)*
     - Multimedia Keys support under GNOME Desktop
+    - Saving/Opening playlist in own format
+    - Searching for Lyrics in two services: lyrdb and chartlyrics
+    - Last.FM scrobbling *(disabled by default)*
     
 
 Dependenices
     - python-gobject
     - python-gstreamer0.10
     - pynotofy (python-notify)
+    - pylast (for the Last.FM scrobbling)
 
 Licenses and Thanks
 ===================
 webaddress: `groove-dl@github <https://github.com/jacktheripper51/groove-dl>`_
 
 Any comments and help are welcome
-
-
-
-0.3.3
+0.3.4

data/about_dialog.ui

     <property name="icon">gsharkdown_64.png</property>
     <property name="type_hint">dialog</property>
     <property name="program_name">gSharkDown</property>
-    <property name="version">0.3.3</property>
+    <property name="version">0.3.4</property>
     <property name="copyright" translatable="yes">(c) Vladimir Kolev 2011</property>
     <property name="comments" translatable="yes">Gnome-toolkit based desktop application for downloading music files from Grooveshark.com</property>
     <property name="website">https://bitbucket.org/vkolev/gsharkdown</property>

data/preferenes_dialog.ui

           </packing>
         </child>
         <child>
+          <object class="GtkFrame" id="frame1">
+            <property name="visible">True</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <object class="GtkVBox" id="vbox2">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkHBox" id="hbox4">
+                        <property name="visible">True</property>
+                        <child>
+                          <object class="GtkLabel" id="label3">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Username:</property>
+                          </object>
+                          <packing>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkEntry" id="entry2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="invisible_char">&#x2022;</property>
+                            <property name="primary_icon_name">face-monkey</property>
+                          </object>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkHBox" id="hbox5">
+                        <property name="visible">True</property>
+                        <child>
+                          <object class="GtkLabel" id="label4">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Password:  </property>
+                          </object>
+                          <packing>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkEntry" id="entry3">
+                            <property name="visible">True</property>
+                            <property name="sensitive">False</property>
+                            <property name="can_focus">True</property>
+                            <property name="invisible_char_set">True</property>
+                            <property name="primary_icon_name">dialog-password</property>
+                          </object>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="checkbutton3">
+                        <property name="label" translatable="yes">Enable Last.fm Scrobbling</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="on_scrobble_toggle"/>
+                      </object>
+                      <packing>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">&lt;b&gt;Last.fm Scrobbling&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
           <object class="GtkHSeparator" id="hseparator1">
             <property name="visible">True</property>
           </object>
           <packing>
             <property name="expand">False</property>
-            <property name="position">3</property>
+            <property name="position">4</property>
           </packing>
         </child>
         <child>
           <packing>
             <property name="expand">False</property>
             <property name="padding">5</property>
-            <property name="position">4</property>
+            <property name="position">5</property>
           </packing>
         </child>
       </object>
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-08-04 03:29+0200\n"
+"POT-Creation-Date: 2011-08-04 12:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: gsharkdown.py:151
+#: gsharkdown.py:164
 msgid "gSharkDown : Download from Grooveshark"
 msgstr ""
 
-#: gsharkdown.py:189
+#: gsharkdown.py:210
 msgid "Error saving the playlist"
 msgstr ""
 
-#: gsharkdown.py:193 data/main_window.ui.h:22
+#: gsharkdown.py:214 data/main_window.ui.h:22
 msgid "Save playlist to file"
 msgstr ""
 
-#: gsharkdown.py:208
+#: gsharkdown.py:229
 msgid "Select Playlist to open"
 msgstr ""
 
-#: gsharkdown.py:214
+#: gsharkdown.py:235
 msgid "Playlist files"
 msgstr ""
 
-#: gsharkdown.py:259 data/about_dialog.ui.h:4
+#: gsharkdown.py:280 data/about_dialog.ui.h:4
 msgid "Check for update"
 msgstr ""
 
-#: gsharkdown.py:291
+#: gsharkdown.py:312
 msgid "New update"
 msgstr ""
 
-#: gsharkdown.py:292
+#: gsharkdown.py:313
 msgid "To update to the latest version click on the button "
 msgstr ""
 
-#: gsharkdown.py:293
+#: gsharkdown.py:314
 msgid ""
 "'Update'\n"
 "and download it. After that you can "
 msgstr ""
 
-#: gsharkdown.py:294
+#: gsharkdown.py:315
 msgid "remove the old one and install the new gSharkDown"
 msgstr ""
 
-#: gsharkdown.py:295
+#: gsharkdown.py:316
 #, python-format
 msgid "<b>New version <i>%s</i> is available</b>"
 msgstr ""
 
-#: gsharkdown.py:311
+#: gsharkdown.py:332
 msgid "No updates"
 msgstr ""
 
-#: gsharkdown.py:312
+#: gsharkdown.py:333
 msgid "Congratulations!\n"
 msgstr ""
 
-#: gsharkdown.py:313
+#: gsharkdown.py:334
 msgid "<b>You are using the latest version!</b>"
 msgstr ""
 
-#: gsharkdown.py:341 gsharkdown.py:366
+#: gsharkdown.py:362 gsharkdown.py:387
 msgid "Title"
 msgstr ""
 
-#: gsharkdown.py:346 gsharkdown.py:371
+#: gsharkdown.py:367 gsharkdown.py:392
 msgid "Artist"
 msgstr ""
 
-#: gsharkdown.py:351
+#: gsharkdown.py:372
 msgid "Album"
 msgstr ""
 
-#: gsharkdown.py:356 gsharkdown.py:376
+#: gsharkdown.py:377 gsharkdown.py:397
 msgid "SongID"
 msgstr ""
 
-#: gsharkdown.py:387
+#: gsharkdown.py:408
 msgid "Are you sure to quit?"
 msgstr ""
 
-#: gsharkdown.py:388
+#: gsharkdown.py:409
 msgid "Quit?"
 msgstr ""
 
-#: gsharkdown.py:552
-msgid "Song Information - {sonid}"
+#: gsharkdown.py:579
+msgid "Song Information - {songid}"
 msgstr ""
 
-#: gsharkdown.py:553
+#: gsharkdown.py:580
 msgid "<b>Filename:</b> {artist} - {title}.mp3\n"
 msgstr ""
 
-#: gsharkdown.py:555
+#: gsharkdown.py:582
 msgid "<b>Artist:</b> {artist}\n"
 msgstr ""
 
-#: gsharkdown.py:556
+#: gsharkdown.py:583
 msgid "<b>Title:</b> {title}\n"
 msgstr ""
 
-#: gsharkdown.py:558
+#: gsharkdown.py:585
 msgid "<b>Duration:</b> {mins}:{secs} min\n"
 msgstr ""
 
-#: gsharkdown.py:560
+#: gsharkdown.py:587
 msgid "<b>Album:</b> {album}\n"
 msgstr ""
 
-#: gsharkdown.py:561
+#: gsharkdown.py:588
 msgid "<b>Year:</b> {year}\n"
 msgstr ""
 
-#: gsharkdown.py:650
+#: gsharkdown.py:686
 msgid "Select destination directory"
 msgstr ""
 
-#: gsharkdown.py:734
+#: gsharkdown.py:787
 msgid "Playing: {artist} - {title}"
 msgstr ""
 
-#: gsharkdown.py:738
+#: gsharkdown.py:791
 msgid "<b>Playing:</b> {artist} - {title}"
 msgstr ""
 
-#: gsharkdown.py:742
+#: gsharkdown.py:795
 msgid "Now playing"
 msgstr ""
 
-#: gsharkdown.py:749
+#: gsharkdown.py:802
 msgid "gSharkDown: GrooveShark Downloader"
 msgstr ""
 
+#: lib/tfuncs.py:34
+msgid "Ready"
+msgstr ""
+
+#: lib/tfuncs.py:130
+msgid "gSharkDown : Grooveshark Downloader"
+msgstr ""
+
 #: data/main_window.ui.h:1
 msgid "<b>Playlist</b>"
 msgstr ""
 msgid "Play/Stop"
 msgstr ""
 
-#: data/main_window.ui.h:18 data/preferenes_dialog.ui.h:2
+#: data/main_window.ui.h:18 data/preferenes_dialog.ui.h:5
 msgid "Preferences"
 msgstr ""
 
 msgid "gSharkDown"
 msgstr ""
 
-#: data/main_window.ui.h:29 data/lyrics_dialog.ui.h:3
+#: data/main_window.ui.h:29
 msgid "label"
 msgstr ""
 
 #: data/preferenes_dialog.ui.h:1
+msgid "<b>Last.fm Scrobbling</b>"
+msgstr ""
+
+#: data/preferenes_dialog.ui.h:2
 msgid "Download Directory:"
 msgstr ""
 
 #: data/preferenes_dialog.ui.h:3
+msgid "Enable Last.fm Scrobbling"
+msgstr ""
+
+#: data/preferenes_dialog.ui.h:4
+msgid "Password:  "
+msgstr ""
+
+#: data/preferenes_dialog.ui.h:6
 msgid "Quit application on close without confirmation"
 msgstr ""
 
-#: data/preferenes_dialog.ui.h:4
+#: data/preferenes_dialog.ui.h:7
 msgid "Show notifications on track change"
 msgstr ""
 
-#: data/lyrics_dialog.ui.h:1
-msgid "<b>Lyrics for:</b>"
-msgstr ""
-
-#: data/lyrics_dialog.ui.h:2
-msgid "Lyrics viewer"
+#: data/preferenes_dialog.ui.h:8
+msgid "Username:"
 msgstr ""
 
 #: data/about_dialog.ui.h:1
 
 #: data/about_dialog.ui.h:2
 msgid ""
-"<b>Downloading mp3s is illegal in some countries! Please check the low in "
+"<b>Downloading mp3s is illegal in some countries! Please check the law in "
 "your country.</b>"
 msgstr ""
 
 import os
 import sys
 import random
+import time
 from lib.tfuncs import t_init
 from lib.tfuncs import t_download
 from lib.tfuncs import t_play
     sys.exit(1)
 
 try:
+    import pylast
+except ImportError:
+    print "You need to install pylast: sudo pip install pylast"
+    sys.exit(1)
+
+try:
     from configobj import ConfigObj
 except ImportError:
     print "You don't have python-configobj installed!"
 gettext.textdomain(APP)
 gettext.install(APP, localedir=DIR, unicode=True)
 
+LAST_KEY = "51fd71dc8939360b25a1029e556258a4"
+LAST_SECRET = "cf35dd38f998ca4d3af4adbe59ae23f7"
+
 if os.path.exists("%s/.gsharkdown/gsharkdown.ini" % os.environ.get("HOME")):
     CONFIG = ConfigObj("%s/.gsharkdown/gsharkdown.ini" % os.environ.get("HOME"))
 else:
     CONFIG['show_notification'] = 0
     CONFIG['update_checked'] = 0
     CONFIG['completition'] = ""
+    CONFIG['scrobbling'] = 0
+    CONFIG['lastuser'] = ""
+    CONFIG['lastpass'] = ""
     CONFIG.write()
 
 
 
         if int(CONFIG['show_notification']) == 1:
             pynotify.init("gSharkDown")
+        
+        # Scrobbling initialisation
+        self.lastfm = ""
+        if int(CONFIG['scrobbling']) == 1:
+            self.lastfm = pylast.LastFMNetwork(api_key=LAST_KEY,
+                                          api_secret=LAST_SECRET,
+                                          username=CONFIG['lastuser'],
+                                          password_hash=CONFIG['lastpass'])
 
         builder.connect_signals(self)
         self.tlisten = t_key_listener(self)
         self.play_button.set_stock_id(gtk.STOCK_MEDIA_STOP)
         song = self.playitems[column[0]]
         self.set_songinfos(song)
-        t = t_play(self, song, int(CONFIG['repeat_playlist']))
+        t = t_play(self, song, int(CONFIG['repeat_playlist']), self.lastfm)
         t.start()
 
     def add_and_play_result(self, path, column, data=None):
                 self.player.set_state(gst.STATE_NULL)
                 song = self.playitems[index]
                 self.set_songinfos(song)
-                t = t_play(self, song, int(CONFIG['repeat_playlist']))
+                t = t_play(self, song,
+                           int(CONFIG['repeat_playlist']),
+                           self.lastfm)
                 t.start()
 
     def play_previous(self, widget, data=None):
                     self.player.set_state(gst.STATE_NULL)
                     song = self.playitems[len(self.playitems) - 1]
                     self.set_songinfos(song)
-                    t = t_play(self, song, int(CONFIG['repeat_playlist']))
+                    t = t_play(self, song,
+                               int(CONFIG['repeat_playlist']),
+                              self.lastfm)
                     t.start()
                 else:
                     self.player.set_state(gst.STATE_NULL)
                 self.player.set_state(gst.STATE_NULL)
                 song = self.playitems[index]
                 self.set_songinfos(song)
-                t = t_play(self, song, int(CONFIG['repeat_playlist']))
+                t = t_play(self, song,
+                           int(CONFIG['repeat_playlist']),
+                          self.lastfm)
                 t.start()
 
     def on_volume_change(self, widget, data=0.5):
         self.notify.set_active(int(CONFIG['show_stat_icon']))
         self.bubble = builder.get_object("checkbutton2")
         self.bubble.set_active(int(CONFIG['show_notification']))
+        self.lastuser = builder.get_object("entry2")
+        self.lastuser.set_text(CONFIG['lastuser'])
+        self.lastpass = builder.get_object("entry3")
+        self.lastpass.set_visibility(False)
+        self.lastpass.set_text(CONFIG['lastpass'])
+        self.scrobble = builder.get_object("checkbutton3")
+        self.scrobble.set_active(int(CONFIG['scrobbling']))
+        self.lastuser.set_sensitive(self.scrobble.get_active())
+        self.lastpass.set_sensitive(self.scrobble.get_active())
         builder.connect_signals(self)
         self.prefs.show_all()
 
             chooser.destroy()
         chooser.destroy()
 
+    def on_scrobble_toggle(self, widget, data=None):
+        self.lastuser.set_sensitive(widget.get_active())
+        self.lastpass.set_sensitive(widget.get_active())
+
     def save_preferences(self, widget, data=None):
         """
         Saves the information from the Preferences dialog in the
             CONFIG['show_notification'] = 1
         else:
             CONFIG['show_notification'] = 0
+
+        if self.scrobble.get_active():
+            CONFIG['scrobbling'] = 1
+            CONFIG['lastuser'] = self.lastuser.get_text()
+            CONFIG['lastpass'] = pylast.md5(self.lastpass.get_text())
+            self.lastfm = pylast.LastFMNetwork(api_key=LAST_KEY,
+                                          api_secret=LAST_SECRET,
+                                          username=CONFIG['lastuser'],
+                                          password_hash=CONFIG['lastpass'])
+
+        else:
+            CONFIG['scrobbling'] = 0
         CONFIG.write()
         self.prefs.destroy()
 
                 song = self.playitems[0]
                 self.set_songinfos(song)
                 self.playing = 0
-                t = t_play(self, song, int(CONFIG['repeat_playlist']))
+                t = t_play(self, song, int(CONFIG['repeat_playlist']),
+                          self.lastfm)
                 t.start()
         else:
             self.player.set_state(gst.STATE_NULL)
 
 class t_play(threading.Thread):
 
-    def __init__(self, _window, _song, _conf):
+    def __init__(self, _window, _song, _conf, _lastfm):
         threading.Thread.__init__(self)
         self.win = _window
         self.songid = _song["SongID"]
+        self.song = _song
         self.repeat = _conf
+        self.lastfm = _lastfm
 
     def run(self):
         try:
                                key["result"]["%s" % self.songid]["streamKey"])
         self.win.player.set_property('uri', play_url)
         self.win.player.set_state(gst.STATE_PLAYING)
+        if self.lastfm != "":
+            self.lastfm.scrobble(self.song['ArtistName'],
+                                    self.song['SongName'],
+                                    int(time.time()))
+            self.lastfm.update_now_playing(self.song['ArtistName'],
+                                              self.song['SongName'])
         bus = self.win.player.get_bus()
         bus.enable_sync_message_emission()
         bus.add_signal_watch()
Add a comment to this file

locale/bg_BG/LC_MESSAGES/gsharkdown.mo

Binary file modified.

locale/bg_BG/LC_MESSAGES/gsharkdown.po

 msgstr ""
 "Project-Id-Version: gsharkdown\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-08-04 03:29+0200\n"
-"PO-Revision-Date: 2011-08-04 04:03+0200\n"
-"Last-Translator: Vladimir Kolev <vladimir.r.kolev@gmail.com>\n"
+"POT-Creation-Date: 2011-08-04 12:20+0200\n"
+"PO-Revision-Date: 2011-08-04 12:22+0100\n"
+"Last-Translator: Vladimir Kolev <vladi@vladimirkolev.com>\n"
 "Language-Team: Bulgarian\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "X-Poedit-Country: BULGARIA\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: gsharkdown.py:151
+#: gsharkdown.py:164
 msgid "gSharkDown : Download from Grooveshark"
 msgstr "gSharkDown : Изтегляй от Grooveshark"
 
-#: gsharkdown.py:189
+#: gsharkdown.py:210
 msgid "Error saving the playlist"
 msgstr "Грешка при записването на списъка с песни"
 
-#: gsharkdown.py:193
+#: gsharkdown.py:214
 #: data/main_window.ui.h:22
 msgid "Save playlist to file"
 msgstr "Запиши списъка с песни във файл"
 
-#: gsharkdown.py:208
+#: gsharkdown.py:229
 msgid "Select Playlist to open"
 msgstr "Изберете списък с песни"
 
-#: gsharkdown.py:214
+#: gsharkdown.py:235
 msgid "Playlist files"
 msgstr "Списъци с песни"
 
-#: gsharkdown.py:259
+#: gsharkdown.py:280
 #: data/about_dialog.ui.h:4
 msgid "Check for update"
 msgstr "Провери за нова версия"
 
-#: gsharkdown.py:291
+#: gsharkdown.py:312
 msgid "New update"
 msgstr "Нова версия"
 
-#: gsharkdown.py:292
+#: gsharkdown.py:313
 msgid "To update to the latest version click on the button "
 msgstr "За да обновите до последната версия изберете бутона"
 
-#: gsharkdown.py:293
+#: gsharkdown.py:314
 msgid ""
 "'Update'\n"
 "and download it. After that you can "
 "'Изпълни'\n"
 "и я изтеглете. След това можете да"
 
-#: gsharkdown.py:294
+#: gsharkdown.py:315
 msgid "remove the old one and install the new gSharkDown"
 msgstr "премахнете старата версия и да инсталирате новия gSharkDown"
 
-#: gsharkdown.py:295
+#: gsharkdown.py:316
 #, python-format
 msgid "<b>New version <i>%s</i> is available</b>"
 msgstr "<b>Достъпна е нова версия <i>%s</i></b>"
 
-#: gsharkdown.py:311
+#: gsharkdown.py:332
 msgid "No updates"
 msgstr "Няма нови версии"
 
-#: gsharkdown.py:312
+#: gsharkdown.py:333
 msgid "Congratulations!\n"
 msgstr "Поздравления!\n"
 
-#: gsharkdown.py:313
+#: gsharkdown.py:334
 msgid "<b>You are using the latest version!</b>"
 msgstr "<b>Вие използвате последната версия!</b>"
 
-#: gsharkdown.py:341
-#: gsharkdown.py:366
+#: gsharkdown.py:362
+#: gsharkdown.py:387
 msgid "Title"
 msgstr "Заглавие"
 
-#: gsharkdown.py:346
-#: gsharkdown.py:371
+#: gsharkdown.py:367
+#: gsharkdown.py:392
 msgid "Artist"
 msgstr "Изпълнител"
 
-#: gsharkdown.py:351
+#: gsharkdown.py:372
 msgid "Album"
 msgstr "Албум"
 
-#: gsharkdown.py:356
-#: gsharkdown.py:376
+#: gsharkdown.py:377
+#: gsharkdown.py:397
 msgid "SongID"
 msgstr "SongID"
 
-#: gsharkdown.py:387
+#: gsharkdown.py:408
 msgid "Are you sure to quit?"
 msgstr "Наистина изключване на програмата?"
 
-#: gsharkdown.py:388
+#: gsharkdown.py:409
 msgid "Quit?"
 msgstr "Изход?"
 
-#: gsharkdown.py:552
-msgid "Song Information - {sonid}"
-msgstr "Информация за песента - {sonid}"
+#: gsharkdown.py:579
+msgid "Song Information - {songid}"
+msgstr "Информация за песента - {songid}"
 
-#: gsharkdown.py:553
+#: gsharkdown.py:580
 msgid "<b>Filename:</b> {artist} - {title}.mp3\n"
 msgstr "<b>Име на файла:</b> {artist} - {title}.mp3\n"
 
-#: gsharkdown.py:555
+#: gsharkdown.py:582
 msgid "<b>Artist:</b> {artist}\n"
 msgstr "<b>Изпълнител:</b> {artist}\n"
 
-#: gsharkdown.py:556
+#: gsharkdown.py:583
 msgid "<b>Title:</b> {title}\n"
 msgstr "<b>Заглавие:</b> {title}\n"
 
-#: gsharkdown.py:558
+#: gsharkdown.py:585
 msgid "<b>Duration:</b> {mins}:{secs} min\n"
 msgstr "<b>Времетраене:</b> {mins}:{secs} min\n"
 
-#: gsharkdown.py:560
+#: gsharkdown.py:587
 msgid "<b>Album:</b> {album}\n"
 msgstr "<b>Албум:</b> {album}\n"
 
-#: gsharkdown.py:561
+#: gsharkdown.py:588
 msgid "<b>Year:</b> {year}\n"
 msgstr "<b>Година:</b> {year}\n"
 
-#: gsharkdown.py:650
+#: gsharkdown.py:686
 msgid "Select destination directory"
 msgstr "Изберете дестинация за записване"
 
-#: gsharkdown.py:734
+#: gsharkdown.py:787
 msgid "Playing: {artist} - {title}"
 msgstr "Свири: {artist} - {title}"
 
-#: gsharkdown.py:738
+#: gsharkdown.py:791
 msgid "<b>Playing:</b> {artist} - {title}"
 msgstr "<b>Свири:</b> {artist} - {title}"
 
-#: gsharkdown.py:742
+#: gsharkdown.py:795
 msgid "Now playing"
 msgstr "В момента свири"
 
-#: gsharkdown.py:749
+#: gsharkdown.py:802
 msgid "gSharkDown: GrooveShark Downloader"
 msgstr "gSharkDown: GrooveShark Downloader"
 
+#: lib/tfuncs.py:34
+msgid "Ready"
+msgstr "Готов"
+
+#: lib/tfuncs.py:130
+msgid "gSharkDown : Grooveshark Downloader"
+msgstr "gSharkDown : Grooveshark Downloader"
+
 #: data/main_window.ui.h:1
 msgid "<b>Playlist</b>"
 msgstr "<b>Списък за изпълнение</b>"
 msgstr "Пускане/Спиране"
 
 #: data/main_window.ui.h:18
-#: data/preferenes_dialog.ui.h:2
+#: data/preferenes_dialog.ui.h:5
 msgid "Preferences"
 msgstr "Настройки"
 
 msgstr "gSharkDown"
 
 #: data/main_window.ui.h:29
-#: data/lyrics_dialog.ui.h:3
 msgid "label"
 msgstr "label"
 
 #: data/preferenes_dialog.ui.h:1
+msgid "<b>Last.fm Scrobbling</b>"
+msgstr "<b>Last.fm Scrobbling</b>"
+
+#: data/preferenes_dialog.ui.h:2
 msgid "Download Directory:"
 msgstr "Директория за изтегляне:"
 
 #: data/preferenes_dialog.ui.h:3
+msgid "Enable Last.fm Scrobbling"
+msgstr "Разреши Last.fm Scrobbling"
+
+#: data/preferenes_dialog.ui.h:4
+msgid "Password:  "
+msgstr "Парола:     "
+
+#: data/preferenes_dialog.ui.h:6
 msgid "Quit application on close without confirmation"
 msgstr "Изключи приложението без потвърждение"
 
-#: data/preferenes_dialog.ui.h:4
+#: data/preferenes_dialog.ui.h:7
 msgid "Show notifications on track change"
 msgstr "Показвай информативен балон при смяна на песента"
 
-#: data/lyrics_dialog.ui.h:1
-msgid "<b>Lyrics for:</b>"
-msgstr "<b>Текст за:</b>"
-
-#: data/lyrics_dialog.ui.h:2
-msgid "Lyrics viewer"
-msgstr "Текст на песен"
+#: data/preferenes_dialog.ui.h:8
+msgid "Username:"
+msgstr "Потребител:"
 
 #: data/about_dialog.ui.h:1
 msgid "(c) Vladimir Kolev 2011"
 msgstr "(c) Vladimir Kolev 2011"
 
 #: data/about_dialog.ui.h:2
-msgid "<b>Downloading mp3s is illegal in some countries! Please check the low in your country.</b>"
-msgstr "<b>Изтеглянето на mp3 файлове е нелегално в някои държави! Моля уверете се, че не нарушавате закона на държавата, в която се намирате.</b>"
+msgid "<b>Downloading mp3s is illegal in some countries! Please check the law in your country.</b>"
+msgstr "<b>Изтеглянето на mp3 файлове е нелегално в някои държави! Моля уверете се, че нарушавате закона във вашата държава.</b>"
 
 #: data/about_dialog.ui.h:3
 msgid "About GrooveDown"
 "Библиотеката groove.py е разработена от George Stephanos (jacktheripper51 @ github)\n"
 "Вързка към изходния код: https://github.com/jacktheripper51/groove-dl"
 
+#~ msgid "<b>Lyrics for:</b>"
+#~ msgstr "<b>Текст за:</b>"
+#~ msgid "Lyrics viewer"
+#~ msgstr "Текст на песен"
 #~ msgid "ERROR: Cant't find lyrics for {artist} - {track}"
 #~ msgstr "ГРЕШКА: Не може да бъде намерен текст за {artist} - {track}"
-#~ msgid "Ready"
-#~ msgstr "Готов"
 #~ msgid "Downloading: %s"
 #~ msgstr "Изтегляне: %s"
 #~ msgid "Downloaded!"
 #~ msgstr "Изтеглена"
-#~ msgid "gSharkDown : Grooveshark Downloader"
-#~ msgstr "gSharkDown : Grooveshark Downloader"
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.