Hello community,

here is the log from the commit of package lollypop for openSUSE:Factory 
checked in at 2017-06-04 02:02:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/lollypop (Old)
 and      /work/SRC/openSUSE:Factory/.lollypop.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "lollypop"

Sun Jun  4 02:02:13 2017 rev:26 rq:500877 version:0.9.239

Changes:
--------
--- /work/SRC/openSUSE:Factory/lollypop/lollypop.changes        2017-05-16 
14:46:27.420154628 +0200
+++ /work/SRC/openSUSE:Factory/.lollypop.new/lollypop.changes   2017-06-04 
02:02:38.764342786 +0200
@@ -1,0 +2,6 @@
+Sat Jun  3 15:43:36 UTC 2017 - [email protected]
+
+- Update to version 0.9.239:
+  + Bug fixes, including for boo#1040253.
+
+-------------------------------------------------------------------

Old:
----
  lollypop-0.9.233.tar.xz

New:
----
  lollypop-0.9.239.tar.xz

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

Other differences:
------------------
++++++ lollypop.spec ++++++
--- /var/tmp/diff_new_pack.PkWHDg/_old  2017-06-04 02:02:39.604224237 +0200
+++ /var/tmp/diff_new_pack.PkWHDg/_new  2017-06-04 02:02:39.604224237 +0200
@@ -19,7 +19,7 @@
 %global gobject_introspection_version 1.35.9
 %global gtk3_version 3.14
 Name:           lollypop
-Version:        0.9.233
+Version:        0.9.239
 Release:        0
 Summary:        GNOME music playing application
 License:        GPL-3.0+

++++++ lollypop-0.9.233.tar.xz -> lollypop-0.9.239.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/Makefile.am 
new/lollypop-0.9.239/Makefile.am
--- old/lollypop-0.9.233/Makefile.am    2017-03-18 12:53:53.000000000 +0100
+++ new/lollypop-0.9.239/Makefile.am    2017-05-16 10:37:15.000000000 +0200
@@ -48,7 +48,7 @@
                -e s!\@libexecdir\@!$(libexecdir)!      \
                -e s!\@libdir\@!$(libdir)!              \
                -e s!\@pkglibdir\@!$(pkglibdir)!        \
-        -e s!\@PYTHON\@!$(PYTHON)!     \
+               -e s!\@PYTHON\@!$(PYTHON)!      \
                -e s!\@localedir\@!$(localedir)!        \
                -e s!\@pythondir\@!$(pythondir)!        \
                -e s!\@pyexecdir\@!$(pyexecdir)!        \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/Makefile.in 
new/lollypop-0.9.239/Makefile.in
--- old/lollypop-0.9.233/Makefile.in    2017-05-10 14:35:01.000000000 +0200
+++ new/lollypop-0.9.239/Makefile.in    2017-06-02 11:04:45.000000000 +0200
@@ -950,7 +950,7 @@
                -e s!\@libexecdir\@!$(libexecdir)!      \
                -e s!\@libdir\@!$(libdir)!              \
                -e s!\@pkglibdir\@!$(pkglibdir)!        \
-        -e s!\@PYTHON\@!$(PYTHON)!     \
+               -e s!\@PYTHON\@!$(PYTHON)!      \
                -e s!\@localedir\@!$(localedir)!        \
                -e s!\@pythondir\@!$(pythondir)!        \
                -e s!\@pyexecdir\@!$(pyexecdir)!        \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/configure 
new/lollypop-0.9.239/configure
--- old/lollypop-0.9.233/configure      2017-05-10 14:35:02.000000000 +0200
+++ new/lollypop-0.9.239/configure      2017-06-02 11:04:46.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for lollypop 0.9.233.
+# Generated by GNU Autoconf 2.69 for lollypop 0.9.239.
 #
 # Report bugs to <https://github.com/gnumdk/lollypop>.
 #
@@ -579,8 +579,8 @@
 # Identity of this package.
 PACKAGE_NAME='lollypop'
 PACKAGE_TARNAME='lollypop'
-PACKAGE_VERSION='0.9.233'
-PACKAGE_STRING='lollypop 0.9.233'
+PACKAGE_VERSION='0.9.239'
+PACKAGE_STRING='lollypop 0.9.239'
 PACKAGE_BUGREPORT='https://github.com/gnumdk/lollypop'
 PACKAGE_URL='https://github.com/gnumdk/lollypop'
 
@@ -1287,7 +1287,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures lollypop 0.9.233 to adapt to many kinds of systems.
+\`configure' configures lollypop 0.9.239 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1353,7 +1353,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of lollypop 0.9.233:";;
+     short | recursive ) echo "Configuration of lollypop 0.9.239:";;
    esac
   cat <<\_ACEOF
 
@@ -1454,7 +1454,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-lollypop configure 0.9.233
+lollypop configure 0.9.239
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1471,7 +1471,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by lollypop $as_me 0.9.233, which was
+It was created by lollypop $as_me 0.9.239, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2338,7 +2338,7 @@
 
 # Define the identity of the package.
  PACKAGE='lollypop'
- VERSION='0.9.233'
+ VERSION='0.9.239'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -4801,7 +4801,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by lollypop $as_me 0.9.233, which was
+This file was extended by lollypop $as_me 0.9.239, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4868,7 +4868,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-lollypop config.status 0.9.233
+lollypop config.status 0.9.239
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/configure.ac 
new/lollypop-0.9.239/configure.ac
--- old/lollypop-0.9.233/configure.ac   2017-05-10 14:34:54.000000000 +0200
+++ new/lollypop-0.9.239/configure.ac   2017-06-02 11:04:10.000000000 +0200
@@ -1,6 +1,6 @@
 AC_PREREQ(2.63)
 AC_INIT([lollypop],
-        [0.9.233],
+        [0.9.239],
         [https://github.com/gnumdk/lollypop],
         [lollypop],
         [https://github.com/gnumdk/lollypop])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/data/AboutDialog.ui 
new/lollypop-0.9.239/data/AboutDialog.ui
--- old/lollypop-0.9.233/data/AboutDialog.ui    2017-05-10 14:35:03.000000000 
+0200
+++ new/lollypop-0.9.239/data/AboutDialog.ui    2017-06-02 11:04:47.000000000 
+0200
@@ -8,7 +8,7 @@
     <property name="destroy_with_parent">True</property>
     <property name="type_hint">normal</property>
     <property name="program_name">Lollypop</property>
-    <property name="version">0.9.233</property>
+    <property name="version">0.9.239</property>
     <property name="copyright">Copyright © 2014-2016 Cédric 
Bellegarde</property>
     <property name="comments" translatable="yes">A music player for 
GNOME.</property>
     <property name="website">https://github.com/gnumdk/lollypop</property>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/data/CoverBox.ui 
new/lollypop-0.9.239/data/CoverBox.ui
--- old/lollypop-0.9.233/data/CoverBox.ui       2016-12-16 11:05:26.000000000 
+0100
+++ new/lollypop-0.9.239/data/CoverBox.ui       2017-05-16 10:32:45.000000000 
+0200
@@ -3,8 +3,8 @@
 <interface>
   <requires lib="gtk+" version="3.14"/>
   <object class="GtkGrid" id="coverbox">
-    <property name="can_focus">False</property>
     <property name="visible">True</property>
+    <property name="can_focus">False</property>
     <property name="margin_top">2</property>
     <property name="orientation">vertical</property>
     <property name="column_homogeneous">True</property>
@@ -38,8 +38,10 @@
               <object class="GtkEventBox" id="play-event">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="halign">center</property>
-                <property name="valign">center</property>
+                <property name="halign">start</property>
+                <property name="valign">end</property>
+                <property name="margin_bottom">6</property>
+                <property name="margin_left">5</property>
                 <signal name="button-press-event" 
handler="_on_play_press_event" swapped="no"/>
                 <signal name="realize" handler="_on_eventbox_realize" 
swapped="no"/>
                 <child>
@@ -48,7 +50,7 @@
                     <property name="tooltip_text" 
translatable="yes">Play</property>
                     <property name="opacity">0</property>
                     <property 
name="icon_name">media-playback-start-symbolic</property>
-                    <property name="icon_size">5</property>
+                    <property name="icon_size">1</property>
                   </object>
                 </child>
               </object>
@@ -59,7 +61,7 @@
                 <property name="can_focus">False</property>
                 <property name="halign">end</property>
                 <property name="valign">end</property>
-                <property name="margin_end">5</property>
+                <property name="margin_right">5</property>
                 <property name="margin_bottom">6</property>
                 <property name="column_spacing">5</property>
                 <child>
@@ -74,6 +76,7 @@
                         <property name="tooltip_text" 
translatable="yes">Change artwork</property>
                         <property name="opacity">0</property>
                         <property 
name="icon_name">image-x-generic-symbolic</property>
+                        <property name="icon_size">1</property>
                       </object>
                     </child>
                   </object>
@@ -93,6 +96,7 @@
                         <property name="can_focus">False</property>
                         <property name="opacity">0</property>
                         <property name="icon_name">list-add-symbolic</property>
+                        <property name="icon_size">1</property>
                       </object>
                     </child>
                   </object>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/data/org.gnome.Lollypop.gschema.xml 
new/lollypop-0.9.239/data/org.gnome.Lollypop.gschema.xml
--- old/lollypop-0.9.233/data/org.gnome.Lollypop.gschema.xml    2017-02-05 
11:20:56.000000000 +0100
+++ new/lollypop-0.9.239/data/org.gnome.Lollypop.gschema.xml    2017-05-23 
17:48:44.000000000 +0200
@@ -276,6 +276,11 @@
             <summary>Mix duration</summary>
             <description></description>
         </key>
+        <key type="b" name="smart-previous">
+            <default>false</default>
+            <summary>Reset current track position on previous</summary>
+            <description></description>
+        </key>
         <key enum="org.gnome.Lollypop.Shuffle" name="shuffle">
             <default>'none'</default>
             <summary>Shuffle mode</summary>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/help/pt_BR/pt_BR.po 
new/lollypop-0.9.239/help/pt_BR/pt_BR.po
--- old/lollypop-0.9.233/help/pt_BR/pt_BR.po    2017-04-13 15:54:55.000000000 
+0200
+++ new/lollypop-0.9.239/help/pt_BR/pt_BR.po    2017-05-16 11:09:18.000000000 
+0200
@@ -1,16 +1,16 @@
 # 
 # Translators:
 # Laís Figueiredo <[email protected]>, 2016
-# Lidáque <[email protected]>, 2017
-# Lidáque <[email protected]>, 2016
-# Lidáque <[email protected]>, 2016
+# Lucas Miranda <[email protected]>, 2017
+# Lucas Miranda <[email protected]>, 2016
+# Lucas Miranda <[email protected]>, 2016
 # Ricardo Borges Jr. <[email protected]>, 2015-2016
 msgid ""
 msgstr ""
 "Project-Id-Version: lollypop\n"
 "POT-Creation-Date: 2017-01-24 17:28+0100\n"
 "PO-Revision-Date: 2017-01-25 00:25+0000\n"
-"Last-Translator: Lidáque <[email protected]>\n"
+"Last-Translator: Lucas Miranda <[email protected]>\n"
 "Language-Team: Portuguese (Brazil) 
(http://www.transifex.com/gnumdk/lollypop/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/lollypop.in 
new/lollypop-0.9.239/lollypop.in
--- old/lollypop-0.9.233/lollypop.in    2017-04-12 13:06:21.000000000 +0200
+++ new/lollypop-0.9.239/lollypop.in    2017-05-16 10:38:08.000000000 +0200
@@ -44,7 +44,7 @@
     resource = Gio.resource_load(os.path.join(pkgdatadir, 
'lollypop.gresource'))
     Gio.Resource._register(resource)
 
-    app = Application()
+    app = Application("@VERSION@")
     signal.signal(signal.SIGINT, signal.SIG_DFL)
     if 'LOLLYPOP_TRACE' in os.environ:
         graphviz = GraphvizOutput()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/m4/pkg.m4 
new/lollypop-0.9.239/m4/pkg.m4
--- old/lollypop-0.9.233/m4/pkg.m4      2016-11-20 18:32:50.000000000 +0100
+++ new/lollypop-0.9.239/m4/pkg.m4      2017-05-10 15:53:13.000000000 +0200
@@ -1,6 +1,6 @@
-dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
-dnl serial 11 (pkg-config-0.29.1)
-dnl
+# pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
+# serial 11 (pkg-config-0.29.1)
+
 dnl Copyright © 2004 Scott James Remnant <[email protected]>.
 dnl Copyright © 2012-2015 Dan Nicholson <[email protected]>
 dnl
@@ -273,3 +273,71 @@
 
 AS_VAR_IF([$1], [""], [$5], [$4])dnl
 ])dnl PKG_CHECK_VAR
+
+dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES,
+dnl   [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],
+dnl   [DESCRIPTION], [DEFAULT])
+dnl ------------------------------------------
+dnl
+dnl Prepare a "--with-" configure option using the lowercase
+dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and
+dnl PKG_CHECK_MODULES in a single macro.
+AC_DEFUN([PKG_WITH_MODULES],
+[
+m4_pushdef([with_arg], m4_tolower([$1]))
+
+m4_pushdef([description],
+           [m4_default([$5], [build with ]with_arg[ support])])
+
+m4_pushdef([def_arg], [m4_default([$6], [auto])])
+m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes])
+m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no])
+
+m4_case(def_arg,
+            [yes],[m4_pushdef([with_without], [--without-]with_arg)],
+            [m4_pushdef([with_without],[--with-]with_arg)])
+
+AC_ARG_WITH(with_arg,
+     AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),,
+    [AS_TR_SH([with_]with_arg)=def_arg])
+
+AS_CASE([$AS_TR_SH([with_]with_arg)],
+            [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)],
+            [auto],[PKG_CHECK_MODULES([$1],[$2],
+                                        [m4_n([def_action_if_found]) $3],
+                                        [m4_n([def_action_if_not_found]) $4])])
+
+m4_popdef([with_arg])
+m4_popdef([description])
+m4_popdef([def_arg])
+
+])dnl PKG_WITH_MODULES
+
+dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
+dnl   [DESCRIPTION], [DEFAULT])
+dnl -----------------------------------------------
+dnl
+dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES
+dnl check._[VARIABLE-PREFIX] is exported as make variable.
+AC_DEFUN([PKG_HAVE_WITH_MODULES],
+[
+PKG_WITH_MODULES([$1],[$2],,,[$3],[$4])
+
+AM_CONDITIONAL([HAVE_][$1],
+               [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"])
+])dnl PKG_HAVE_WITH_MODULES
+
+dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
+dnl   [DESCRIPTION], [DEFAULT])
+dnl ------------------------------------------------------
+dnl
+dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after
+dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make
+dnl and preprocessor variable.
+AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES],
+[
+PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4])
+
+AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"],
+        [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])])
+])dnl PKG_HAVE_DEFINE_WITH_MODULES
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/po/pt_BR.po 
new/lollypop-0.9.239/po/pt_BR.po
--- old/lollypop-0.9.233/po/pt_BR.po    2017-04-13 15:54:45.000000000 +0200
+++ new/lollypop-0.9.239/po/pt_BR.po    2017-05-16 11:09:07.000000000 +0200
@@ -6,9 +6,9 @@
 # Cédric Bellegarde <[email protected]>, 2016
 # Ian Brunelli <[email protected]>, 2015
 # Laís Figueiredo <[email protected]>, 2016
-# Lidáque <[email protected]>, 2016-2017
-# Lidáque <[email protected]>, 2016-2017
-# Lidáque <[email protected]>, 2016
+# Lucas Miranda <[email protected]>, 2016-2017
+# Lucas Miranda <[email protected]>, 2016-2017
+# Lucas Miranda <[email protected]>, 2016
 # Ricardo Borges Jr. <[email protected]>, 2015
 msgid ""
 msgstr ""
@@ -16,7 +16,7 @@
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-02-27 13:51+0100\n"
 "PO-Revision-Date: 2017-03-01 16:23+0000\n"
-"Last-Translator: Lidáque <[email protected]>\n"
+"Last-Translator: Lucas Miranda <[email protected]>\n"
 "Language-Team: Portuguese (Brazil) 
(http://www.transifex.com/gnumdk/lollypop/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/po/pt_PT.po 
new/lollypop-0.9.239/po/pt_PT.po
--- old/lollypop-0.9.233/po/pt_PT.po    2017-04-13 15:54:50.000000000 +0200
+++ new/lollypop-0.9.239/po/pt_PT.po    2017-05-16 11:09:02.000000000 +0200
@@ -10,7 +10,7 @@
 "Project-Id-Version: lollypop\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-02-27 13:51+0100\n"
-"PO-Revision-Date: 2017-03-01 16:25+0000\n"
+"PO-Revision-Date: 2017-05-10 22:57+0000\n"
 "Last-Translator: Alberto Almeida <[email protected]>\n"
 "Language-Team: Portuguese (Portugal) 
(http://www.transifex.com/gnumdk/lollypop/language/pt_PT/)\n"
 "MIME-Version: 1.0\n"
@@ -549,11 +549,11 @@
 
 #: ../src/pop_menu.py:226
 msgid "Remove from \"Not in party\""
-msgstr ""
+msgstr "Remover de \"Não no modo de festa\""
 
 #: ../src/pop_menu.py:231
 msgid "Add to \"Not in party\""
-msgstr ""
+msgstr "Adicionar a \"Não no modo de festa\""
 
 #: ../src/pop_menu.py:252
 #, python-format
@@ -662,7 +662,7 @@
 
 #: ../src/selectionlist.py:301
 msgid "Not in party"
-msgstr ""
+msgstr "Não no modo de festa"
 
 #: ../src/settings.py:91
 msgid "Google Web Services need a custom API key"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/po/zh_CN.po 
new/lollypop-0.9.239/po/zh_CN.po
--- old/lollypop-0.9.233/po/zh_CN.po    2017-04-13 15:54:47.000000000 +0200
+++ new/lollypop-0.9.239/po/zh_CN.po    2017-05-16 11:09:10.000000000 +0200
@@ -6,7 +6,7 @@
 # mabier <[email protected]>, 2015-2016
 # Mingcong Bai <[email protected]>, 2016-2017
 # orange <[email protected]>, 2015
-# Michikora, 2016
+# michikora, 2016
 # Mingcong Bai <[email protected]>, 2016
 msgid ""
 msgstr ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/search-provider/lollypop-sp 
new/lollypop-0.9.239/search-provider/lollypop-sp
--- old/lollypop-0.9.233/search-provider/lollypop-sp    2017-05-10 
14:35:04.000000000 +0200
+++ new/lollypop-0.9.239/search-provider/lollypop-sp    2017-06-02 
11:04:48.000000000 +0200
@@ -180,7 +180,7 @@
                     gicon = self.art.get_album_cache_path(album, ArtSize.BIG)
                 else:
                     track = Track(int(search_id[2:]))
-                    name = track.name
+                    name = "♫ " + track.name
                     description = " ".join(track.artists)
                     surface = self.art.get_album_artwork(track.album,
                                                          ArtSize.BIG, 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/search-provider/lollypop-sp.in 
new/lollypop-0.9.239/search-provider/lollypop-sp.in
--- old/lollypop-0.9.233/search-provider/lollypop-sp.in 2017-03-18 
12:55:47.000000000 +0100
+++ new/lollypop-0.9.239/search-provider/lollypop-sp.in 2017-06-01 
18:58:33.000000000 +0200
@@ -180,7 +180,7 @@
                     gicon = self.art.get_album_cache_path(album, ArtSize.BIG)
                 else:
                     track = Track(int(search_id[2:]))
-                    name = track.name
+                    name = "♫ " + track.name
                     description = " ".join(track.artists)
                     surface = self.art.get_album_artwork(track.album,
                                                          ArtSize.BIG, 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/application.py 
new/lollypop-0.9.239/src/application.py
--- old/lollypop-0.9.233/src/application.py     2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/application.py     2017-06-01 18:54:36.000000000 
+0200
@@ -60,14 +60,16 @@
             - Create main window
     """
 
-    def __init__(self):
+    def __init__(self, version):
         """
             Create application
+            @param version as str
         """
         Gtk.Application.__init__(
                             self,
                             application_id="org.gnome.Lollypop",
                             flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE)
+        self.__version = version
         self.set_property("register-session", True)
         GLib.setenv("PULSE_PROP_media.role", "music", True)
         GLib.setenv("PULSE_PROP_application.icon_name",
@@ -113,6 +115,10 @@
                              GLib.OptionArg.NONE,
                              "Emulate an Android Phone",
                              None)
+        self.add_main_option("version", b"V", GLib.OptionFlags.NONE,
+                             GLib.OptionArg.NONE,
+                             "Lollypop version",
+                             None)
         self.connect("command-line", self.__on_command_line)
         self.connect("activate", self.__on_activate)
         self.register(None)
@@ -418,6 +424,9 @@
             self.player.prev()
         elif options.contains("emulate-phone"):
             self.window.add_fake_phone()
+        elif options.contains("version"):
+            print("Lollypop %s" % self.__version)
+            exit(0)
         elif len(args) > 1:
             self.player.clear_externals()
             for uri in args[1:]:
@@ -429,7 +438,7 @@
                 parser.connect("entry-parsed", self.__on_entry_parsed)
                 parser.parse_async(uri, True, None, None)
         elif self.window is not None and self.window.is_visible():
-            self.window.present()
+            self.window.present_with_time(Gtk.get_current_event_time())
         elif self.window is not None:
             # self.window.setup_window()
             # self.window.present()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/container.py 
new/lollypop-0.9.239/src/container.py
--- old/lollypop-0.9.233/src/container.py       2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/container.py       2017-05-30 11:22:30.000000000 
+0200
@@ -268,10 +268,26 @@
     def show_artists_albums(self, artist_ids):
         """
             Show albums from artists
+            @param artist id as int
         """
-        self.__update_view_artists([], artist_ids)
-        GLib.idle_add(self.__list_two.hide)
         GLib.idle_add(self.__list_one.select_ids, [])
+        GLib.idle_add(self.__list_two.select_ids, [])
+        if self.__show_genres:
+            # Get artist genres
+            genre_ids = []
+            for artist_id in artist_ids:
+                album_ids = Lp().artists.get_albums(artist_ids)
+                for album_id in album_ids:
+                    for genre_id in Lp().albums.get_genre_ids(album_id):
+                        if genre_id not in genre_ids:
+                            genre_ids.append(genre_id)
+            # Select genres on list one
+            GLib.idle_add(self.__list_one.select_ids, genre_ids)
+            # Select artists on list two
+            GLib.idle_add(self.__list_two.select_ids, artist_ids)
+        else:
+            # Select artists on list one
+            GLib.idle_add(self.__list_one.select_ids, artist_ids)
 
 ##############
 # PROTECTED  #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/controllers.py 
new/lollypop-0.9.239/src/controllers.py
--- old/lollypop-0.9.233/src/controllers.py     2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/controllers.py     2017-05-17 15:21:45.000000000 
+0200
@@ -164,7 +164,7 @@
             self._progress.set_range(0.0, 0.0)
         else:
             self._progress.set_sensitive(True)
-            self._progress.set_range(0.0, player.current_track.duration * 60)
+            self._progress.set_range(0.0, player.current_track.duration)
             self._total_time_label.set_text(
                 seconds_to_string(player.current_track.duration))
 
@@ -252,7 +252,7 @@
         if self._show_volume_control or event.button != 1:
             return
         value = scale.get_value()
-        Lp().player.seek(value/60)
+        Lp().player.seek(value)
         self.__seeking = False
         self._update_position(value)
 
@@ -279,15 +279,15 @@
             elif Lp().player.is_playing:
                 position = Lp().player.position
                 if y > 0:
-                    seek = position/1000000/60-5
+                    seek = position - 5 * Gst.SECOND
                 else:
-                    seek = position/1000000/60+5
+                    seek = position + 5 * Gst.SECOND
                 if seek < 0:
                     seek = 0
                 if seek > Lp().player.current_track.duration:
                     seek = Lp().player.current_track.duration - 2
                 Lp().player.seek(seek)
-                self._update_position(seek*60)
+                self._update_position(seek)
 
     def _update_position(self, value=None):
         """
@@ -302,10 +302,10 @@
             self._total_time_label.set_text(volume)
         elif not self.__seeking:
             if value is None and Lp().player.get_status() != Gst.State.PAUSED:
-                value = Lp().player.position/1000000
+                value = Lp().player.position / Gst.SECOND
             if value is not None:
                 self._progress.set_value(value)
-                self._timelabel.set_text(seconds_to_string(value/60))
+                self._timelabel.set_text(seconds_to_string(value))
         return True
 
 #######################
@@ -318,7 +318,7 @@
             @param track id as int
         """
         if track_id == player.current_track.id:
-            self._progress.set_range(0.0, player.current_track.duration * 60)
+            self._progress.set_range(0.0, player.current_track.duration)
             self._total_time_label.set_text(
                     seconds_to_string(player.current_track.duration))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/database_albums.py 
new/lollypop-0.9.239/src/database_albums.py
--- old/lollypop-0.9.233/src/database_albums.py 2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/database_albums.py 2017-05-29 13:01:08.000000000 
+0200
@@ -1064,6 +1064,23 @@
                                  (album_id,))
             return list(itertools.chain(*result))
 
+    def has_loves(self):
+        """
+            True if db has loved albums
+            @return bool
+        """
+        with SqlCursor(Lp().db) as sql:
+            filters = ()
+            request = "SELECT albums.rowid\
+                       FROM albums\
+                       WHERE loved=1"
+            if not get_network_available():
+                request += " AND albums.synced!=?"
+                filters = (Type.NONE, )
+            request += " LIMIT 1"
+            result = sql.execute(request, filters)
+            return list(itertools.chain(*result)) != []
+
     def search(self, string, limit=25):
         """
             Search for albums looking like string
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/database_history.py 
new/lollypop-0.9.239/src/database_history.py
--- old/lollypop-0.9.233/src/database_history.py        2017-05-10 
13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/database_history.py        2017-05-12 
16:26:12.000000000 +0200
@@ -91,8 +91,8 @@
                              (name, duration, popularity, rate, ltime, mtime,\
                              loved_album, album_popularity, album_rate)\
                              VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
-                            (name, duration, popularity, rate, loved_album,
-                             ltime, mtime, album_popularity, album_rate))
+                            (name, duration, popularity, rate, ltime, mtime,
+                             loved_album, album_popularity, album_rate))
             sql.commit()
 
     def get(self, name, duration):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/database_upgrade.py 
new/lollypop-0.9.239/src/database_upgrade.py
--- old/lollypop-0.9.233/src/database_upgrade.py        2017-05-10 
13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/database_upgrade.py        2017-05-18 
15:06:04.000000000 +0200
@@ -18,6 +18,7 @@
 from lollypop.sqlcursor import SqlCursor
 from lollypop.utils import translate_artist_name
 from lollypop.database_history import History
+from lollypop.radios import Radios
 from lollypop.define import Lp
 
 
@@ -55,6 +56,7 @@
             18: self.__upgrade_18,
             19: self.__upgrade_19,
             20: self.__upgrade_20,
+            21: self.__upgrade_21,
                          }
 
     """
@@ -405,3 +407,12 @@
             sql.commit()
         # Clean all charts
         Lp().db.del_tracks(Lp().tracks.get_old_charts_track_ids(mtime*2))
+
+    def __upgrade_21(self):
+        """
+            Add rate to radios
+        """
+        with SqlCursor(Radios()) as sql:
+            sql.execute("ALTER TABLE radios ADD rate\
+                         INT NOT NULL DEFAULT -1")
+            sql.commit()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/fullscreen.py 
new/lollypop-0.9.239/src/fullscreen.py
--- old/lollypop-0.9.233/src/fullscreen.py      2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/fullscreen.py      2017-05-23 18:12:57.000000000 
+0200
@@ -10,7 +10,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
 
-from gi.repository import Gtk, Gdk, GLib
+from gi.repository import Gtk, Gdk, GLib, Gio
 
 from datetime import datetime
 
@@ -99,15 +99,16 @@
         Gtk.Window.do_show(self)
         self.__parent.set_skip_pager_hint(True)
         self.__parent.set_skip_taskbar_hint(True)
-        now = datetime.now()
-        self._datetime.set_label(now.strftime("%a %d %b, %X")[:-3])
         if self.__timeout2 is None:
-            second = datetime.now().second
-            if 60 - second > 0:
-                GLib.timeout_add((60-second)*1000, self.__update_datetime)
-            else:
-                self.__timeout2 = GLib.timeout_add(60000,
-                                                   self.__update_datetime)
+            try:
+                interface = Gio.Settings.new("org.gnome.desktop.interface")
+                show_seconds = interface.get_value("clock-show-seconds")
+            except:
+                show_seconds = False
+            self.__update_datetime(show_seconds)
+            self.__timeout2 = GLib.timeout_add(1000,
+                                               self.__update_datetime,
+                                               show_seconds)
         self._update_position(Lp().player.position/1000000)
         self.fullscreen()
         self._next_popover.set_relative_to(self._album_label)
@@ -170,12 +171,16 @@
 #######################
 # PRIVATE             #
 #######################
-    def __update_datetime(self):
+    def __update_datetime(self, show_seconds=False):
         """
             Update datetime in headerbar
+            @param show_seconds as bool
         """
         now = datetime.now()
-        self._datetime.set_label(now.strftime("%a %d %b, %X")[:-3])
+        if show_seconds:
+            self._datetime.set_label(now.strftime("%a %d %b, %X"))
+        else:
+            self._datetime.set_label(now.strftime("%a %d %b, %X")[:-3])
         if self.__timeout2 is None:
             self.__timeout2 = GLib.timeout_add(60000, self.__update_datetime)
             return False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/mpris.py 
new/lollypop-0.9.239/src/mpris.py
--- old/lollypop-0.9.233/src/mpris.py   2017-05-10 13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/mpris.py   2017-05-18 21:58:52.000000000 +0200
@@ -14,7 +14,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
 
-from gi.repository import Gio, Gst, GLib
+from gi.repository import Gio, Gst, GLib, Gtk
 
 from random import randint
 
@@ -177,7 +177,7 @@
 
     def Raise(self):
         self.__app.window.setup_window()
-        self.__app.window.present()
+        self.__app.window.present_with_time(Gtk.get_current_event_time())
 
     def Quit(self):
         self.__app.quit()
@@ -204,15 +204,15 @@
             Lp().player.play()
 
     def SetPosition(self, track_id, position):
-        Lp().player.seek(position / 1000000)
+        Lp().player.seek(position / Gst.SECOND)
 
     def OpenUri(self, uri):
         pass
 
     def Seek(self, offset):
         # Convert position in seconds
-        position = Lp().player.position / 1000000 / 60
-        Lp().player.seek(position + offset / 1000000)
+        position = Lp().player.position / Gst.SECOND
+        Lp().player.seek(position + offset / Gst.SECOND)
 
     def Seeked(self, position):
         self.__bus.emit_signal(
@@ -249,7 +249,7 @@
         elif property_name == "Volume":
             return GLib.Variant("d", Lp().player.volume)
         elif property_name == "Position":
-            return GLib.Variant("x", Lp().player.position / 60)
+            return GLib.Variant("x", Lp().player.position)
         elif property_name in ["CanGoNext", "CanGoPrevious",
                                "CanPlay", "CanPause"]:
             return GLib.Variant("b", Lp().player.current_track.id is not None)
@@ -345,8 +345,8 @@
                                        "as",
                                        Lp().player.current_track.album_artists)
             self.__metadata["mpris:length"] = GLib.Variant(
-                                  "x",
-                                  Lp().player.current_track.duration * 1000000)
+                               "x",
+                               Lp().player.current_track.duration * Gst.SECOND)
             self.__metadata["xesam:genre"] = GLib.Variant(
                                               "as",
                                               Lp().player.current_track.genres)
@@ -380,7 +380,7 @@
                 self.__metadata["mpris:artUrl"] = GLib.Variant("s", "")
 
     def __on_seeked(self, player, position):
-        self.Seeked(position * 1000000)
+        self.Seeked(position * Gst.SECOND)
 
     def __on_volume_changed(self, player, data=None):
         self.PropertiesChanged(self.__MPRIS_PLAYER_IFACE,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/mpris_legacy.py 
new/lollypop-0.9.239/src/mpris_legacy.py
--- old/lollypop-0.9.233/src/mpris_legacy.py    2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/mpris_legacy.py    2017-05-18 20:34:21.000000000 
+0200
@@ -83,7 +83,7 @@
     @dbus.service.method(dbus_interface=MPRIS_PLAYER_IFACE,
                          in_signature="ox")
     def SetPosition(self, track_id, position):
-        Lp().player.seek(position/1000000)
+        Lp().player.seek(position/Gst.SECOND)
 
     @dbus.service.method(dbus_interface=MPRIS_PLAYER_IFACE,
                          in_signature="s")
@@ -119,8 +119,7 @@
                 "Shuffle": True,
                 "Metadata": dbus.Dictionary(self._metadata, signature="sv"),
                 "Volume": dbus.Double(Lp().player.volume),
-                "Position": dbus.Int64(
-                                     Lp().player.position / 60),
+                "Position": dbus.Int64(Lp().player.position),
                 "MinimumRate": dbus.Double(1.0),
                 "MaximumRate": dbus.Double(1.0),
                 "CanGoNext": True,
@@ -184,7 +183,7 @@
             self._metadata["xesam:albumArtist"] = \
                 ", ".join(Lp().player.current_track.album_artists)
             self._metadata["mpris:length"] = dbus.Int64(
-                Lp().player.current_track.duration * 1000000)
+                Lp().player.current_track.duration * Gst.SECOND)
             self._metadata["xesam:genre"] = Lp().player.current_track.genres\
                 or "Web"
             self._metadata["xesam:url"] = Lp().player.current_track.uri
@@ -213,7 +212,7 @@
                 self._metadata["mpris:artUrl"] = ""
 
     def _on_seeked(self, player, position):
-        self.Seeked(position * 1000000)
+        self.Seeked(position * Gst.SECOND)
 
     def _on_volume_changed(self, player, data=None):
         self.PropertiesChanged(self.MPRIS_PLAYER_IFACE,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/objects.py 
new/lollypop-0.9.239/src/objects.py
--- old/lollypop-0.9.233/src/objects.py 2017-05-10 13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/objects.py 2017-05-18 15:48:35.000000000 +0200
@@ -49,13 +49,6 @@
             else:
                 return attr_value
 
-    def get_rate(self):
-        """
-            Get rate
-            @return int between -1 and 5
-        """
-        return self.db.get_rate(self.id)
-
     def get_popularity(self):
         """
             Get popularity
@@ -76,13 +69,6 @@
                 popularity = radios.get_popularity(self._album_artists[0])
         return popularity * 5 / avg_popularity + 0.5
 
-    def set_rate(self, rate):
-        """
-            Set rate
-            @param rate as int between -1 and 5
-        """
-        self.db.set_rate(self.id, rate)
-
     def set_popularity(self, popularity):
         """
             Set popularity
@@ -103,6 +89,33 @@
         except Exception as e:
             print("Base::set_popularity(): %s" % e)
 
+    def get_rate(self):
+        """
+            Get rate
+            @return int
+        """
+        if self.id is None or self.id == Type.EXTERNALS:
+            return 0
+
+        rate = 0
+        if self.id >= 0:
+            rate = self.db.get_rate(self.id)
+        elif self.id == Type.RADIOS:
+            radios = Radios()
+            rate = radios.get_rate(self._album_artists[0])
+        return rate
+
+    def set_rate(self, rate):
+        """
+            Set rate
+            @param rate as int between -1 and 5
+        """
+        if self.id == Type.RADIOS:
+            radios = Radios()
+            radios.set_rate(self._album_artists[0], rate)
+        else:
+            self.db.set_rate(self.id, rate)
+
 
 class Disc:
     """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/player.py 
new/lollypop-0.9.239/src/player.py
--- old/lollypop-0.9.233/src/player.py  2017-05-10 13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/player.py  2017-05-23 17:51:33.000000000 +0200
@@ -10,7 +10,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
 
-from gi.repository import Gio, GLib
+from gi.repository import Gio, GLib, Gst
 
 from pickle import load
 from random import choice
@@ -75,8 +75,12 @@
         """
         if self._locked:
             return
+        smart_prev = Lp().settings.get_value("smart-previous")
         if self._prev_track.id is not None:
-            self.load(self._prev_track)
+            if smart_prev and self.position / Gst.SECOND > 2:
+                self.seek(0)
+            else:
+                self.load(self._prev_track)
         else:
             self.stop()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/player_bin.py 
new/lollypop-0.9.239/src/player_bin.py
--- old/lollypop-0.9.233/src/player_bin.py      2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/player_bin.py      2017-05-23 14:16:56.000000000 
+0200
@@ -196,14 +196,14 @@
             Return bin playback position
             @HACK handle crossefade here, as we know we"re going to be
             called every seconds
-            @return position as int
+            @return position in Gst.SECOND
         """
-        position = self._playbin.query_position(Gst.Format.TIME)[1] / 1000
+        position = self._playbin.query_position(Gst.Format.TIME)[1]
         if self._crossfading and self._current_track.duration > 0:
-            duration = self._current_track.duration - position / 1000000
+            duration = self._current_track.duration - position / Gst.SECOND
             if duration < Lp().settings.get_value("mix-duration").get_int32():
                 self.__do_crossfade(duration)
-        return position * 60
+        return position
 
     @property
     def current_track(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/pop_info.py 
new/lollypop-0.9.239/src/pop_info.py
--- old/lollypop-0.9.233/src/pop_info.py        2017-05-10 14:32:03.000000000 
+0200
+++ new/lollypop-0.9.239/src/pop_info.py        2017-05-23 00:34:49.000000000 
+0200
@@ -90,13 +90,21 @@
         show_bio = view_type != Type.RADIOS
         if InfoPopover.Wikipedia is not None and show_bio:
             self.__stack.get_child_by_name("wikipedia").show()
+        else:
+            self.__stack.get_child_by_name("wikipedia").hide()
         if Lp().lastfm is not None and\
                 not Lp().settings.get_value("use-librefm") and show_bio:
             self.__stack.get_child_by_name("lastfm").show()
+        else:
+            self.__stack.get_child_by_name("lastfm").hide()
         if InfoPopover.WebView is not None and get_network_available():
             self.__stack.get_child_by_name("duck").show()
+        else:
+            self.__stack.get_child_by_name("duck").hide()
         if not self.__artist_ids:
             self.__stack.get_child_by_name("lyrics").show()
+        else:
+            self.__stack.get_child_by_name("lyrics").hide()
         self.__stack.set_visible_child_name(
             Lp().settings.get_value("infoswitch").get_string())
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/radios.py 
new/lollypop-0.9.239/src/radios.py
--- old/lollypop-0.9.233/src/radios.py  2017-05-10 13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/radios.py  2017-05-18 15:25:20.000000000 +0200
@@ -15,6 +15,7 @@
 import sqlite3
 
 from lollypop.sqlcursor import SqlCursor
+from lollypop.define import Type
 from lollypop.lio import Lio
 
 
@@ -28,7 +29,8 @@
     create_radios = """CREATE TABLE radios (
                             id INTEGER PRIMARY KEY,
                             name TEXT NOT NULL,
-                            url TEXY NOT NULL,
+                            url TEXT NOT NULL,
+                            rate INT NOT NULL DEFAULT -1,
                             popularity INT NOT NULL)"""
     __gsignals__ = {
         # Add, rename, delete
@@ -137,7 +139,8 @@
         with SqlCursor(self) as sql:
             result = sql.execute("SELECT name, url\
                                   FROM radios\
-                                  ORDER BY popularity DESC, name")
+                                  ORDER BY rate DESC,\
+                                  popularity DESC, name")
             return list(result)
 
     def get_url(self, name):
@@ -203,6 +206,21 @@
             except:  # Database is locked
                 pass
 
+    def set_rate(self, name, rate):
+        """
+            Set rate
+            @param name as str
+            @param rate as int
+        """
+        with SqlCursor(self) as sql:
+            try:
+                sql.execute("UPDATE radios SET\
+                            rate=? WHERE name=?",
+                            (rate, name))
+                sql.commit()
+            except:  # Database is locked
+                pass
+
     def get_id(self, name):
         """
             Get radio id by name
@@ -239,13 +257,28 @@
         """
         with SqlCursor(self) as sql:
             result = sql.execute("SELECT popularity\
-                                 FROM radios WHERE\
-                                 name=?", (name,))
+                                 FROM radios\
+                                 WHERE name=?", (name,))
             v = result.fetchone()
             if v is not None:
                 return v[0]
             return 0
 
+    def get_rate(self, name):
+        """
+            Get radio rate
+            @param name as str
+            @return rate as int
+        """
+        with SqlCursor(self) as sql:
+            result = sql.execute("SELECT rate\
+                                  FROM radios\
+                                  WHERE name=?", (name,))
+            v = result.fetchone()
+            if v and v[0]:
+                return v[0]
+            return Type.NONE
+
     def get_cursor(self):
         """
             Return a new sqlite cursor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/selectionlist.py 
new/lollypop-0.9.239/src/selectionlist.py
--- old/lollypop-0.9.233/src/selectionlist.py   2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/selectionlist.py   2017-05-30 11:31:50.000000000 
+0200
@@ -224,18 +224,24 @@
         if ids:
             try:
                 # Check if items are available for selection
-                iters = []
+                items = []
                 for i in list(ids):
                     for item in self.__model:
                         if item[0] == i:
-                            iters.append(item.iter)
+                            items.append(item)
                             ids.remove(i)
                 # Select later
                 if ids:
                     self.__to_select_ids = ids
                 else:
-                    for i in iters:
-                        self.__selection.select_iter(i)
+                    for item in items:
+                        self.__selection.select_iter(item.iter)
+                    # Scroll to first item
+                    if items:
+                        self.__view.scroll_to_cell(items[0].path,
+                                                   None,
+                                                   True,
+                                                   0, 0)
             except:
                 self.__last_motion_event = None
                 self.__to_select_ids = ids
@@ -280,7 +286,8 @@
         """
         items = []
         items.append((Type.POPULARS, _("Popular albums")))
-        items.append((Type.LOVED, _("Loved albums")))
+        if Lp().albums.has_loves():
+            items.append((Type.LOVED, _("Loved albums")))
         items.append((Type.RECENTS, _("Recently added albums")))
         items.append((Type.RANDOMS, _("Random albums")))
         items.append((Type.PLAYLISTS, _("Playlists")))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/tagreader.py 
new/lollypop-0.9.239/src/tagreader.py
--- old/lollypop-0.9.233/src/tagreader.py       2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/tagreader.py       2017-05-28 13:08:29.000000000 
+0200
@@ -350,7 +350,7 @@
                     string = decode_all(m.data)
                     if string.startswith("USLT"):
                         split = string.split("\x00")
-                        return split[-1:][0]
+                        return "".join(split[5:-1])
             except Exception as e:
                 print("TagReader::get_id3()", e)
             return ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/toolbar_end.py 
new/lollypop-0.9.239/src/toolbar_end.py
--- old/lollypop-0.9.233/src/toolbar_end.py     2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/toolbar_end.py     2017-05-16 10:54:58.000000000 
+0200
@@ -227,7 +227,8 @@
         """
         active = self.__party_button.get_active()
         self.__shuffle_button.set_sensitive(not active)
-        if not Lp().settings.get_value("dark-ui"):
+        if not Lp().gtk_application_prefer_dark_theme and\
+                not Lp().settings.get_value("dark-ui"):
             settings = Gtk.Settings.get_default()
             settings.set_property("gtk-application-prefer-dark-theme", active)
         Lp().player.set_party(active)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/toolbar_info.py 
new/lollypop-0.9.239/src/toolbar_info.py
--- old/lollypop-0.9.233/src/toolbar_info.py    2017-05-10 14:20:42.000000000 
+0200
+++ new/lollypop-0.9.239/src/toolbar_info.py    2017-05-16 17:15:23.000000000 
+0200
@@ -151,13 +151,13 @@
         elif Lp().player.current_track.id is not None:
             if self.__pop_info is None:
                 from lollypop.pop_info import InfoPopover
-                if Lp().player.current_track.id == Type.RADIOS:
-                    view_type = Type.RADIOS
-                else:
-                    view_type = Type.ALBUMS
                 self.__pop_info = InfoPopover([])
-                self.__pop_info.set_view_type(view_type)
                 self.__pop_info.set_relative_to(self._infobox)
+            if Lp().player.current_track.id == Type.RADIOS:
+                view_type = Type.RADIOS
+            else:
+                view_type = Type.ALBUMS
+            self.__pop_info.set_view_type(view_type)
             self.__pop_info.show()
 
     def __on_loading_changed(self, player, show):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/utils.py 
new/lollypop-0.9.239/src/utils.py
--- old/lollypop-0.9.233/src/utils.py   2017-05-10 13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/utils.py   2017-05-28 12:59:07.000000000 +0200
@@ -30,8 +30,8 @@
     for encoding in ENCODING:
         try:
             return bytes.decode(encoding)
-        except:
-            pass
+        except Exception as e:
+            print("decode_all():", e)
 
 
 def get_network_available():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/widgets_album_detailed.py 
new/lollypop-0.9.239/src/widgets_album_detailed.py
--- old/lollypop-0.9.233/src/widgets_album_detailed.py  2017-05-10 
13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/widgets_album_detailed.py  2017-05-16 
10:32:45.000000000 +0200
@@ -45,6 +45,7 @@
         """
         Gtk.Bin.__init__(self)
         AlbumWidget.__init__(self, album_id, genre_ids, artist_ids, art_size)
+        self._rounded_class = "rounded-icon-small"
         self._album.set_artists(artist_ids)
         self.__width = None
         self.__context = None
@@ -132,23 +133,14 @@
                 # Here we are working around default CoverBox ui
                 # Do we really need to have another ui file?
                 # So just hack values on the fly
-                self._cover.set_halign(Gtk.Align.CENTER)
                 self._cover.get_style_context().add_class("small-cover-frame")
-                self.__coverbox.set_margin_bottom(5)
-                # We want a smaller button, so reload image
-                self._rounded_class = "rounded-icon-small"
-                self._play_button.set_from_icon_name(
-                                               "media-playback-start-symbolic",
-                                               Gtk.IconSize.MENU)
                 overlay_grid = builder.get_object("overlay-grid")
                 overlay_grid.set_margin_bottom(2)
                 overlay_grid.set_margin_end(2)
                 overlay_grid.set_column_spacing(0)
-                self._play_button.set_margin_start(2)
-                self._play_button.set_margin_bottom(2)
                 play_event = builder.get_object("play-event")
-                play_event.set_property("halign", Gtk.Align.START)
-                play_event.set_property("valign", Gtk.Align.END)
+                play_event.set_margin_start(2)
+                play_event.set_margin_bottom(2)
                 album_info.attach(self.__coverbox, 0, 0, 1, 1)
                 artist_label.set_text(", ".join(self._album.artists))
                 artist_label.show()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/widgets_album_simple.py 
new/lollypop-0.9.239/src/widgets_album_simple.py
--- old/lollypop-0.9.233/src/widgets_album_simple.py    2017-05-10 
13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/widgets_album_simple.py    2017-05-30 
11:39:16.000000000 +0200
@@ -66,6 +66,12 @@
         self.__artist_label.set_property("halign", Gtk.Align.CENTER)
         self.__artist_label.set_text(", ".join(self._album.artists))
         self.__artist_label.get_style_context().add_class("dim-label")
+        artist_eventbox = Gtk.EventBox()
+        artist_eventbox.add(self.__artist_label)
+        artist_eventbox.connect("realize", self._on_eventbox_realize)
+        artist_eventbox.connect("button-press-event",
+                                self.__on_artist_button_press)
+        artist_eventbox.show()
         self._widget.set_property("has-tooltip", True)
         self._widget.connect("query-tooltip", self._on_query_tooltip)
         self._widget.add(grid)
@@ -88,7 +94,7 @@
         color.add(self.__overlay)
         grid.add(color)
         grid.add(self.__title_label)
-        grid.add(self.__artist_label)
+        grid.add(artist_eventbox)
         self.add(self._widget)
         self.set_cover()
         self.update_state()
@@ -279,7 +285,7 @@
     def __on_button_press(self, eventbox, event):
         """
             Store pressed button
-            @param flowbox as Gtk.EventBox
+            @param eventbox as Gtk.EventBox
             @param event as Gdk.EventButton
         """
         if event.button != 1:
@@ -304,6 +310,15 @@
             popover.connect("closed", self.__on_album_popover_closed)
             popover.show()
 
+    def __on_artist_button_press(self, eventbox, event):
+        """
+            Go to artist page
+            @param eventbox as Gtk.EventBox
+            @param event as Gdk.EventButton
+        """
+        Lp().window.show_artists_albums(self._album.artist_ids)
+        return True
+
     def __on_album_popover_closed(self, popover):
         """
             Remove overlay and restore opacity
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/widgets_playlist.py 
new/lollypop-0.9.239/src/widgets_playlist.py
--- old/lollypop-0.9.233/src/widgets_playlist.py        2017-05-10 
13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/widgets_playlist.py        2017-05-23 
17:24:51.000000000 +0200
@@ -593,7 +593,12 @@
             name = _("New playlist ") + str(count)
         Lp().playlists.add(name)
         playlist_id = Lp().playlists.get_id(name)
-        self.__model.append([True, name, "user-trash-symbolic", playlist_id])
+        iterator = self.__model.append([True,
+                                        name,
+                                        "user-trash-symbolic",
+                                        playlist_id])
+        self.__view.get_selection().select_iter(iterator)
+        self.__view.grab_focus()
         self.__set_current_object(playlist_id, True)
 
 #######################
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/widgets_rating.py 
new/lollypop-0.9.239/src/widgets_rating.py
--- old/lollypop-0.9.233/src/widgets_rating.py  2017-05-10 13:55:15.000000000 
+0200
+++ new/lollypop-0.9.239/src/widgets_rating.py  2017-05-18 15:29:10.000000000 
+0200
@@ -156,9 +156,11 @@
         if isinstance(self.__object, Track):
             Lp().player.emit("rate-changed")
         # Save to tags if needed
+        # FIXME We really need a radio object
         if Lp().settings.get_value("save-to-tags") and\
                 GLib.find_program_in_path("kid3-cli") is not None and\
                 isinstance(self.__object, Track) and\
+                self.__object.id >= 0 and\
                 not self.__object.is_web:
             if pop == 0:
                 value = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/widgets_web.py 
new/lollypop-0.9.239/src/widgets_web.py
--- old/lollypop-0.9.233/src/widgets_web.py     2017-05-10 14:25:19.000000000 
+0200
+++ new/lollypop-0.9.239/src/widgets_web.py     2017-05-23 17:36:58.000000000 
+0200
@@ -70,9 +70,6 @@
                                   " BlackBerry) AppleWebKit2/537.36 Chromium"
                                   "/35.0.1870.2 Mobile Safari/537.36")
         self.__view.set_settings(settings)
-        # FIXME TLS is broken in WebKit2, don"t know how to fix this
-        self.__view.get_context().set_tls_errors_policy(
-                                                WebKit2.TLSErrorsPolicy.IGNORE)
         self.__view.connect("decide-policy", self.__on_decide_policy)
         self.__view.connect("context-menu", self.__on_context_menu)
         self.__view.set_property("hexpand", True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lollypop-0.9.233/src/window.py 
new/lollypop-0.9.239/src/window.py
--- old/lollypop-0.9.233/src/window.py  2017-05-10 13:55:15.000000000 +0200
+++ new/lollypop-0.9.239/src/window.py  2017-06-01 18:53:51.000000000 +0200
@@ -34,7 +34,8 @@
         self.__was_maximized = False
         Gtk.ApplicationWindow.__init__(self,
                                        application=Lp(),
-                                       title="Lollypop")
+                                       title="Lollypop",
+                                       icon_name="org.gnome.Lollypop")
         self.connect("hide", self.__on_hide)
         Lp().player.connect("current-changed", self.__on_current_changed)
         self.__timeout_configure = None
@@ -326,7 +327,6 @@
         """
             Setup window content
         """
-        self.set_default_icon_name("lollypop")
         vgrid = Gtk.Grid()
         vgrid.set_orientation(Gtk.Orientation.VERTICAL)
         vgrid.show()
@@ -426,14 +426,14 @@
         """
         seconds = param.get_int32()
         position = Lp().player.position
-        seek = position/1000000/60+seconds
+        seek = position / Gst.SECOND + seconds
         if seek < 0:
             seek = 0
         if seek > Lp().player.current_track.duration:
             seek = Lp().player.current_track.duration - 2
         Lp().player.seek(seek)
         if Lp().player.current_track.id is not None:
-            self.__toolbar.update_position(seek*60)
+            self.__toolbar.update_position(seek)
 
     def __on_player_action(self, action, param):
         """


Reply via email to