summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO33
-rw-r--r--02_compatibility_glib-2.41.patch31
-rw-r--r--03_upstream_repo.patch1880
-rw-r--r--04_gtk3_issues.patch137
-rw-r--r--PKGBUILD47
-rw-r--r--encoding.patch17
-rw-r--r--reduce-logging.patch13
7 files changed, 24 insertions, 2134 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 882ddf4cdbb7..6ac4cff60257 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,37 +1,26 @@
pkgbase = radiotray
pkgdesc = An online radio streaming player that runs on a Linux system tray.
pkgver = 0.7.3
- pkgrel = 13
+ pkgrel = 16
url = https://radiotray.wordpress.com/
arch = any
license = GPL
+ makedepends = git
+ depends = dbus-python
depends = gstreamer
depends = gst-plugins-base
depends = gst-plugins-good
- depends = python2-dbus
- depends = python2-gobject
- depends = python2-lxml
- depends = python2-notify
- depends = python2-xdg
+ depends = python-gobject
+ depends = python-lxml
+ depends = python-notify2
+ depends = python-pyxdg
optdepends = gst-plugins-bad: extra codec support
optdepends = gst-plugins-ugly: extra codec support
optdepends = gst-libav: nonfree media decoding
optdepends = libappindicator-gtk3: indicator applet support
- provides = radiotray
- conflicts = radiotray-hg
- conflicts = radiotray-python3-git
- source = radiotray-0.7.3.tar.gz::https://bitbucket.org/carlmig/radio-tray/get/radiotray-0.7.3.tar.gz
- source = encoding.patch
- source = 02_compatibility_glib-2.41.patch
- source = 03_upstream_repo.patch
- source = 04_gtk3_issues.patch
- source = reduce-logging.patch
- sha256sums = 464c555b8d9278e918d3718f81a1c0cfa7d9a54018d1a2f6b04b33dc40ea825c
- sha256sums = a73badc0ddbf726d3f554e328b8836883bf816751cd0dc2034795a03466cd2df
- sha256sums = b6d1d7fe74be1ec2ecad653262111f509d6fd60b8e666eb5e15d7bcb21e7a58b
- sha256sums = 04748958923e3c2cac8944700a0786d066ab17d8284155adf316adab78dd0c55
- sha256sums = c67845683a6d7d63eb26bbefe3c06921e0e6cbc2a5cb32c58b47377fdeb83644
- sha256sums = 231ec3fb848069cf909f704e0e129fd649a9f8955178fe5407c7457d94ab0663
+ source = git+https://github.com/lubosz/radiotray.git#commit=0303ad6017a9a81caa71d046ef270ba6ebefed39
+ source = radiotray-gi.patch::https://github.com/lubosz/radiotray/pull/16.patch
+ b2sums = SKIP
+ b2sums = e1944018119584495d480b74e745fb1ddd8d2e6c33d72b8f185bda406b680331e71549259ae7c2f3dd5c93631c2f3156df75d95376d00c07c4f40cfe6d48b81e
pkgname = radiotray
-
diff --git a/02_compatibility_glib-2.41.patch b/02_compatibility_glib-2.41.patch
deleted file mode 100644
index 90464cd5d3eb..000000000000
--- a/02_compatibility_glib-2.41.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-Description: Avoid crash during startup
- This patch allow compatibility with the new versions of
- glib2.0 removing gtk.gdk.threads_init() because this is now deprecated.
-Forwarded: no
-Author: Elías Alejandro Año Mendoza <ealmdz@gmail.com>
-Last-Update: 2014-09-25
-
-Index: radiotray/src/SysTray.py
-===================================================================
---- radiotray.orig/src/SysTray.py 2014-09-25 18:15:12.000000000 -0500
-+++ radiotray/src/SysTray.py 2014-09-25 18:21:49.000000000 -0500
-@@ -46,6 +46,7 @@
- from AppIndicatorGui import AppIndicatorGui
- from TooltipManager import TooltipManager
- from Context import Context
-+from glib import glib_version
-
- import dbus
- import textwrap
-@@ -182,8 +183,9 @@
-
-
- def run(self):
-- gtk.gdk.threads_init()
-- gtk.main()
-+ if glib_version < (2, 41, 0):
-+ gtk.gdk.threads_init()
-+ gtk.main()
-
-
-
diff --git a/03_upstream_repo.patch b/03_upstream_repo.patch
deleted file mode 100644
index 9e822e99d9cb..000000000000
--- a/03_upstream_repo.patch
+++ /dev/null
@@ -1,1880 +0,0 @@
-Description: port radiotray to GTK-3 and GStreamer 1.0
- This patch switch radiotray to GTK-3 and Gstreamer 1.0
- from upstream repository.
-Forwarded: no
-Author: Carlos Ribeyro <carlosmribeiro1@gmail.com>
-Last-Update: 2015-10-18
-
---- radiotray.orig/data/bookmarks.xml
-+++ radiotray/data/bookmarks.xml
-@@ -9,14 +9,14 @@
- <bookmark name="The Breeze" url="mmsh://wms-rly.181.fm/181-breeze?MSWMExt=.asf"/>
- </group>
- <group name="Latin">
-- <bookmark name="Onda Tropical" url="http://yp.shoutcast.com/sbin/tunein-station.pls?id=506392"/>
-+ <bookmark name="Onda Tropical" url="http://monkey.wavestreamer.com:2958/listen.m3u?sid=1"/>
- <bookmark name="Top Latino Radio" url="http://online.radiodifusion.net:8020/listen.pls"/>
- <bookmark name="Salsa Stream" url="http://listen.sky.fm/public3/salsa.pls"/>
- <bookmark name="Reggaeton 24/7" url="http://cc.net2streams.com/tunein.php/reggaeton/playlist.pls"/>
-- <bookmark name="Suave 107" url="http://grupomedrano.com.do/suave107/suave107.m3u"/>
-+ <bookmark name="Suave" url="http://yp.shoutcast.com/sbin/tunein-station.pls?id=1572149"/>
- </group>
- <group name="Classic Rock">
-- <bookmark name="181.FM Classic Hits" url="http://sc-rly.181.fm:80/stream/1094"/>
-+ <bookmark name="181.FM Classic Hits" url="http://yp.shoutcast.com/sbin/tunein-station.pls?id=153501"/>
- <bookmark name=".977 Classic Rock" url="http://www.977music.com/tunein/web/classicrock.asx"/>
- <bookmark name="80s Sky.FM" url="http://listen.sky.fm/public3/the80s.pls"/>
- <bookmark name="Covers" url="http://somafm.com/covers.pls"/>
-@@ -30,21 +30,22 @@
- <bookmark name="SKY.fm Mostly Classical" url="http://listen.sky.fm/public1/classical.pls"/>
- </group>
- <group name="Pop / Rock">
-- <bookmark name="Radio Paradise" url="http://www.radioparadise.com/musiclinks/rp_128aac.m3u"/>
-- <bookmark name=".977 The Hitz Channel" url="http://yp.shoutcast.com/sbin/tunein-station.pls?id=1280356"/>
-- <bookmark name="Enjoy Station" url="http://yp.shoutcast.com/sbin/tunein-station.pls?id=1377285"/>
-+ <bookmark name="Radio Paradise" url="http://www.radioparadise.com/musiclinks/rp_128.m3u"/>
-+ <bookmark name=".977 The Hitz Channel" url="http://www.977music.com/tunein/web/hitz.asx"/>
-+ <bookmark name="Enjoy Station" url="http://yp.shoutcast.com/sbin/tunein-station.pls?id=1463895"/>
- <bookmark name="SKY.fm Top Hits" url="http://listen.sky.fm/public1/tophits.pls"/>
- <bookmark name="Indie Pop Rocks!" url="http://somafm.com/indiepop.pls"/>
- <bookmark name="PopTron" url="http://somafm.com/poptron.pls"/>
- </group>
- <group name="Oldies">
- <bookmark name="AM 1710" url="http://lin2.ash.fast-serv.com:9022/listen.pls"/>
-+ <bookmark name="AM 600" url="http://redmanstreams.com:8740/listen.pls"/>
- <bookmark name="WNAR" url="http://live.wnar-am.com:8500/listen.pls"/>
- <bookmark name="SKY.fm Oldies" url="http://listen.sky.fm/public1/oldies.pls"/>
- </group>
- <group name="Chill">
-- <bookmark name="181.FM" url="http://yp.shoutcast.com/sbin/tunein-station.pls?id=1275050"/>
-- <bookmark name="Lounge Radio" url="http://yp.shoutcast.com/sbin/tunein-station.pls?id=1288934"/>
-+ <bookmark name="181.FM" url="http://yp.shoutcast.com/sbin/tunein-station.pls?id=35402"/>
-+ <bookmark name="Lounge Radio" url="http://www.lounge-radio.com/listen128.m3u"/>
- <bookmark name="Beat Blender" url="http://somafm.com/beatblender.pls"/>
- <bookmark name="Secret Agent" url="http://somafm.com/secretagent.pls"/>
- <bookmark name="Groove Salad" url="http://somafm.com/groovesalad.pls"/>
-@@ -64,6 +65,7 @@
- <bookmark name="cliqhop idm" url="http://somafm.com/cliqhop.pls"/>
- <bookmark name="Black Rock FM" url="http://somafm.com/brfm.pls"/>
- <bookmark name="New Dance Radio" url="http://jbstream.net/tunein.php/blackoutworm/playlist.asx"/>
-+ <bookmark name="DubStep Beyond" url="http://somafm.com/play/dubstep32"/>
- </group>
- <group name="Community">
- <bookmark name="Jupiter Broadcast" url="http://jblive.fm/"/>
-Index: radiotray/data/plugins/HelloWorldPlugin.py
-===================================================================
---- radiotray.orig/data/plugins/HelloWorldPlugin.py
-+++ radiotray/data/plugins/HelloWorldPlugin.py
-@@ -20,7 +20,7 @@
- from events.EventSubscriber import EventSubscriber
- from events.EventManager import EventManager
- from Plugin import Plugin
--import gtk
-+from gi.repository import Gtk
- import time
-
- # Basic example of a plugin
-Index: radiotray/data/plugins/HistoryPlugin.py
-===================================================================
---- radiotray.orig/data/plugins/HistoryPlugin.py
-+++ radiotray/data/plugins/HistoryPlugin.py
-@@ -20,7 +20,7 @@
- from events.EventSubscriber import EventSubscriber
- from events.EventManager import EventManager
- from Plugin import Plugin
--import gtk
-+from gi.repository import Gtk
- from lib import utils
- from lib.common import SYSTEM_PLUGIN_PATH, USER_PLUGIN_PATH
- import os
-@@ -72,5 +72,9 @@ class HistoryPlugin(Plugin):
- self.window.hide()
- return True
-
-+ def on_delete_event(self, widget, event, data=None):
-+ self.window.hide()
-+ return True
-+
- def hasMenuItem(self):
- return True
-Index: radiotray/data/plugins/NotificationPlugin.py
-===================================================================
---- radiotray.orig/data/plugins/NotificationPlugin.py
-+++ radiotray/data/plugins/NotificationPlugin.py
-@@ -20,9 +20,10 @@
-
-
- from Plugin import Plugin
--import gtk
--import gobject
--import pynotify
-+from gi.repository import Gtk
-+from gi.repository import GObject
-+from gi.repository import Notify
-+from gi.repository import GdkPixbuf
- from lib.common import APP_ICON, APPNAME
- from events.EventManager import EventManager
-
-@@ -61,18 +62,18 @@ class NotificationPlugin(Plugin):
-
- if self.notif == None:
-
-- if pynotify.init(APPNAME):
-- self.notif = pynotify.Notification(title, message)
-- self.notif.set_urgency(pynotify.URGENCY_LOW)
-+ if Notify.init(APPNAME):
-+ self.notif = Notify.Notification.new(title, message, None)
-+ self.notif.set_urgency(Notify.Urgency.LOW)
- self.set_icon(data)
-- self.notif.set_timeout(pynotify.EXPIRES_DEFAULT)
-+ self.notif.set_timeout(Notify.EXPIRES_DEFAULT)
- self.notif.show()
- else:
- self.log.error('Error: there was a problem initializing the pynotify module')
-
- else:
- self.set_icon(data)
-- self.notif.update(title, message)
-+ self.notif.update(title, message, None)
- self.notif.show()
-
-
-@@ -81,12 +82,12 @@ class NotificationPlugin(Plugin):
- if('icon' in data.keys()):
-
- try:
-- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(data['icon'], 48, 48)
-+ pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(data['icon'], 48, 48)
- self.notif.set_icon_from_pixbuf(pixbuf)
- except Exception, e:
-- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(APP_ICON, 48, 48)
-+ pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(APP_ICON, 48, 48)
- self.notif.set_icon_from_pixbuf(pixbuf)
- print e
- else:
-- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(APP_ICON, 48, 48)
-+ pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(APP_ICON, 48, 48)
- self.notif.set_icon_from_pixbuf(pixbuf)
-Index: radiotray/data/plugins/SleepTimerPlugin.py
-===================================================================
---- radiotray.orig/data/plugins/SleepTimerPlugin.py
-+++ radiotray/data/plugins/SleepTimerPlugin.py
-@@ -19,8 +19,8 @@
- ##########################################################################
-
- from Plugin import Plugin
--import gtk
--import gobject
-+from gi.repository import Gtk
-+from gi.repository import GObject
- from lib.common import APPNAME, APPVERSION, APP_ICON_ON, APP_ICON_OFF, APP_ICON_CONNECT, APP_INDICATOR_ICON_ON, APP_INDICATOR_ICON_OFF
-
- class SleepTimerPlugin(Plugin):
-@@ -38,7 +38,7 @@ class SleepTimerPlugin(Plugin):
- self.cfgProvider = cfgProvider
- self.mediator = mediator
- self.tooltip = tooltip
-- self.menuItem = gtk.CheckMenuItem(self.getName(), False)
-+ self.menuItem = Gtk.CheckMenuItem(self.getName(), False)
- self.menuItem.connect('activate', self.on_menu)
- self.menuItem.show()
-
-@@ -108,19 +108,19 @@ class SleepTimerPlugin(Plugin):
-
- def populate_tooltip(self):
- if self.sleep_timer_id != None:
-- return _("Sleep: %smin") % str(self.min_to_sleep)
-+ return _("Sleep: %s min") % str(self.min_to_sleep)
- else:
- return None
-
- def start_sleep_timer(self, interval, display_msg):
-- self.sleep_timer_id = gobject.timeout_add(interval*60000, self.on_sleep_timer)
-+ self.sleep_timer_id = GObject.timeout_add(60000, self.on_sleep_timer)
- self.min_to_sleep = interval
- self.min_to_sleep_selected = interval
- if display_msg:
- self.eventManagerWrapper.notify(_("Sleep Timer"), _("%s minute sleep timer started") % str(interval))
-
- def stop_sleep_timer(self, display_msg):
-- gobject.source_remove(self.sleep_timer_id)
-+ GObject.source_remove(self.sleep_timer_id)
- self.sleep_timer_id = None
- if display_msg:
- self.eventManagerWrapper.notify(_("Sleep Timer"), _("Sleep timer stopped"))
-@@ -128,15 +128,15 @@ class SleepTimerPlugin(Plugin):
-
- def get_sleep_timer_value(self, default_value):
-
-- #gtk.gdk.threads_enter()
-+ #Gdk.threads_enter()
-
-- dialog = gtk.Dialog(_("Edit Sleep Timer"), None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-- (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
-+ dialog = Gtk.Dialog(_("Edit Sleep Timer"), None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
-+ (Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
-
-- entry = gtk.Entry(4)
-+ entry = Gtk.Entry(4)
- entry.set_text(str(default_value))
-- hbox = gtk.HBox()
-- hbox.pack_start(gtk.Label(_("Minutes:")), False, 5, 5)
-+ hbox = Gtk.HBox()
-+ hbox.pack_start(Gtk.Label(_("Minutes:", True, True, 0)), False, 5, 5)
- hbox.pack_end(entry, True, True, 5)
- dialog.vbox.pack_end(hbox, True, True, 20)
- dialog.set_icon_from_file(APP_ICON_ON)
-@@ -146,13 +146,13 @@ class SleepTimerPlugin(Plugin):
-
- sleep_timer_value = 0
-
-- if ret == gtk.RESPONSE_ACCEPT:
-+ if ret == Gtk.ResponseType.ACCEPT:
- if entry.get_text().isdigit():
- sleep_timer_value = int(entry.get_text())
-
- dialog.destroy()
-
-- #gtk.gdk.threads_leave()
-+ #Gdk.threads_leave()
- return sleep_timer_value
-
- def on_menu(self, data):
-Index: radiotray/data/plugins/StationSwitcher.plugin
-===================================================================
---- /dev/null
-+++ radiotray/data/plugins/StationSwitcher.plugin
-@@ -0,0 +1,6 @@
-+[RadioTrayPlugin]
-+name=StationSwitcher
-+desc=Allows cycling through stations
-+script=StationSwitcherPlugin.py
-+class=StationSwitcherPlugin
-+author=Mark F
-Index: radiotray/data/plugins/StationSwitcherPlugin.py
-===================================================================
---- /dev/null
-+++ radiotray/data/plugins/StationSwitcherPlugin.py
-@@ -0,0 +1,115 @@
-+##########################################################################
-+# Copyright 2009 Carlos Ribeiro
-+#
-+# This file is part of Radio Tray
-+#
-+# Radio Tray is free software: you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation, either version 1 of the License, or
-+# (at your option) any later version.
-+#
-+# Radio Tray is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with Radio Tray. If not, see <http://www.gnu.org/licenses/>.
-+#
-+##########################################################################
-+
-+# author Mark F Jan 2013
-+from Plugin import Plugin
-+from gi.repository import Gtk
-+import random
-+
-+class StationSwitcherPlugin(Plugin):
-+
-+ # Set by parent Plugin.py
-+ # self.name = name
-+ # self.eventManagerWrapper = eventManagerWrapper
-+ # self.eventSubscriber = eventSubscriber
-+ # self.provider = provider
-+ # self.cfgProvider = cfgProvider
-+ # self.mediator = mediator
-+ # self.tooltip = tooltip
-+
-+ def __init__(self):
-+ super(StationSwitcherPlugin, self).__init__()
-+ self.shuffle = False # way to set this property from RadioTray not implemented yet
-+
-+ def getName(self):
-+ return self.name
-+
-+ def activate(self):
-+ # only Next >> button added to avoid cluttering menu. Play previous can be triggered using other means
-+ nextMenuItem = Gtk.MenuItem("Next >>")
-+
-+ # locate the turn on/off menu item and add next button after
-+ i = 0
-+ insertIndex = 0
-+ for child in self.tooltip.gui.radioMenu.get_children():
-+ if not isinstance(child, Gtk.SeparatorMenuItem):
-+ if child.get_label().startswith("Turn"):
-+ insertIndex = i+1
-+ break
-+ # break statement is required due to bug/feature in Gtk. Examining MenuItem labels on 'separators' causes
-+ # them not to be displayed correctly. If gui classes are modified to use SeparatorMenuItem break can be removed
-+ i+=1
-+
-+ self.tooltip.gui.radioMenu.insert(nextMenuItem,insertIndex)
-+ nextMenuItem.connect('activate', self.on_next)
-+ nextMenuItem.show()
-+
-+ def on_next(self,data):
-+ self.playNextRadio()
-+
-+ def playPreviousRadio(self):
-+ self.mediator.play(self.getPreviousRadio())
-+
-+ def playNextRadio(self):
-+ self.mediator.play(self.getNextRadio())
-+
-+ def getNextRadio(self):
-+ if self.shuffle: return self.getRandomRadio()
-+
-+ allRadios = self.provider.listRadioNames()
-+ lastStation = self.mediator.cfg_provider.getConfigValue("last_station")
-+ lastStationIndex = allRadios.index(lastStation)
-+
-+ if lastStationIndex==len(allRadios)-1: nextStationIndex=0
-+ else: nextStationIndex=lastStationIndex+1
-+
-+ return allRadios[nextStationIndex]
-+
-+ def getPreviousRadio(self):
-+ if self.shuffle: return self.getRandomRadio()
-+
-+ allRadios = self.provider.listRadioNames()
-+ lastStation = self.mediator.cfg_provider.getConfigValue("last_station")
-+ lastStationIndex = allRadios.index(lastStation)
-+
-+ if lastStationIndex==0: previousStationIndex=len(allRadios)-1
-+ else: previousStationIndex=lastStationIndex-1
-+
-+ return allRadios[previousStationIndex]
-+
-+ def getRandomRadio(self):
-+
-+ allRadios = self.provider.listRadioNames()
-+ lastStation = self.mediator.cfg_provider.getConfigValue("last_station")
-+ lastStationIndex = allRadios.index(lastStation)
-+
-+ randomStationIndex = lastStationIndex
-+ while (randomStationIndex==lastStationIndex):
-+ randomStationIndex = random.randint(0, len(allRadios)-1)
-+
-+ return allRadios[randomStationIndex]
-+
-+ def hasMenuItem(self):
-+ return False
-+
-+ def on_menu(self, data):
-+ #plugin config gui goes here. Need to add option for random station select
-+ print ""
-+
-Index: radiotray/data/plugins/history.glade
-===================================================================
---- radiotray.orig/data/plugins/history.glade
-+++ radiotray/data/plugins/history.glade
-@@ -3,37 +3,23 @@
- <requires lib="gtk+" version="2.16"/>
- <!-- interface-naming-policy project-wide -->
- <object class="GtkDialog" id="dialog1">
-+ <property name="can_focus">False</property>
- <property name="border_width">5</property>
- <property name="title" translatable="yes">Song History</property>
- <property name="default_width">320</property>
- <property name="default_height">260</property>
- <property name="destroy_with_parent">True</property>
- <property name="type_hint">normal</property>
-+ <signal name="delete-event" handler="on_delete_event" swapped="no"/>
- <child internal-child="vbox">
- <object class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
-+ <property name="can_focus">False</property>
- <property name="spacing">2</property>
-- <child>
-- <object class="GtkScrolledWindow" id="scrolledwindow1">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="hscrollbar_policy">automatic</property>
-- <property name="vscrollbar_policy">automatic</property>
-- <child>
-- <object class="GtkTextView" id="textview1">
-- <property name="visible">True</property>
-- <property name="can_focus">True</property>
-- <property name="editable">False</property>
-- </object>
-- </child>
-- </object>
-- <packing>
-- <property name="position">1</property>
-- </packing>
-- </child>
- <child internal-child="action_area">
- <object class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
-+ <property name="can_focus">False</property>
- <property name="layout_style">end</property>
- <child>
- <placeholder/>
-@@ -44,8 +30,9 @@
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
-+ <property name="use_action_appearance">False</property>
- <property name="use_stock">True</property>
-- <signal name="clicked" handler="on_close_clicked"/>
-+ <signal name="clicked" handler="on_close_clicked" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
-@@ -56,10 +43,31 @@
- </object>
- <packing>
- <property name="expand">False</property>
-+ <property name="fill">True</property>
- <property name="pack_type">end</property>
- <property name="position">0</property>
- </packing>
- </child>
-+ <child>
-+ <object class="GtkScrolledWindow" id="scrolledwindow1">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="hscrollbar_policy">automatic</property>
-+ <property name="vscrollbar_policy">automatic</property>
-+ <child>
-+ <object class="GtkTextView" id="textview1">
-+ <property name="visible">True</property>
-+ <property name="can_focus">True</property>
-+ <property name="editable">False</property>
-+ </object>
-+ </child>
-+ </object>
-+ <packing>
-+ <property name="expand">True</property>
-+ <property name="fill">True</property>
-+ <property name="position">1</property>
-+ </packing>
-+ </child>
- </object>
- </child>
- <action-widgets>
-Index: radiotray/radiotray
-===================================================================
---- radiotray.orig/radiotray
-+++ radiotray/radiotray
-@@ -4,12 +4,12 @@ import sys,os
- from os.path import dirname, join, pardir
-
- try:
-- from radiotray import radiotray
-+ from radiotray import radiotray_runner
- except ImportError:
- basedir = os.path.dirname(os.path.realpath(__file__))
- workdir = join(basedir,'src')
- sys.path.insert(0, workdir)
- os.chdir(workdir)
-- import radiotray
-+ import radiotray_runner
-
--radiotray.main(sys.argv[1:])
-+radiotray_runner.main(sys.argv[1:])
-Index: radiotray/src/AppIndicatorGui.py
-===================================================================
---- radiotray.orig/src/AppIndicatorGui.py
-+++ radiotray/src/AppIndicatorGui.py
-@@ -20,10 +20,10 @@
- import sys
- from lib.common import APPNAME, APPVERSION, APP_ICON_ON, APP_ICON_OFF, APP_ICON_CONNECT, APP_INDICATOR_ICON_ON, APP_INDICATOR_ICON_OFF, APP_INDICATOR_ICON_CONNECT, IMAGE_PATH
- try:
-- import gtk
-- import gtk.glade
-- import gobject
--except:
-+ from gi.repository import Gtk
-+ #import Gtk.glade
-+except Exception as e:
-+ print e
- sys.exit(1)
- import textwrap
- import logging
-@@ -36,110 +36,113 @@ class AppIndicatorGui:
- self.mediator = mediator
- self.cfg_provider = cfg_provider
- self.provider = provider
-+ self.menu_plugins_item = None
- self.log = logging.getLogger('radiotray')
-
-
- def buildMenu(self):
-
-- try:
-- import appindicator
-- self.app_indicator = appindicator.Indicator(APPNAME, APP_INDICATOR_ICON_OFF , appindicator.CATEGORY_APPLICATION_STATUS)
-- self.app_indicator.set_status(appindicator.STATUS_ACTIVE)
-+ try:
-+ from gi.repository import AppIndicator3
-+ self.app_indicator = AppIndicator3.Indicator.new(APPNAME, APP_INDICATOR_ICON_OFF , AppIndicator3.IndicatorCategory.APPLICATION_STATUS)
-+ self.app_indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
- except Exception as e:
- self.log.debug(e)
- self.log.warn("Failed to create an Application Indicator!")
- self.app_indicator = None
-+ return
-
- self.app_indicator.set_icon_theme_path(IMAGE_PATH)
- self.turnOnOff = None
- self.metadata_menu_item = None
- self.perferences_submenu = None
-- self.preferences_menu = None
-- self.radioMenu = gtk.Menu()
-+ self.preferences_menu = None
-+ self.radioMenu = Gtk.Menu()
- self.build_app_indicator_menu(self.radioMenu)
- self.app_indicator.set_menu(self.radioMenu)
- self.handler.updateTooltip()
-
-+ try:
-+ self.app_indicator.connect("scroll-event", self.app_indicator_scroll)
-+ except:
-+ # not available in this version of app indicator
-+ self.log.info("App indicator scroll events are not available.")
-+
-
- def build_app_indicator_menu(self, menu):
-
-- # config menu
-- if self.turnOnOff == None:
-+ # config menu
-+ if self.turnOnOff == None:
- if not self.mediator.context.station:
-- self.turnOnOff = gtk.MenuItem(_("Turned Off"), False)
-+ self.turnOnOff = Gtk.MenuItem(_("Turned Off"))
- self.turnOnOff.set_sensitive(False)
- else:
-- self.turnOnOff = gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station, False)
-+ self.turnOnOff = Gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station)
- self.turnOnOff.set_sensitive(True)
--
-+
- self.turnOnOff.connect('activate', self.handler.on_turn_on_off)
--
--
-+
- # stream metadata info
- if self.metadata_menu_item == None:
-- self.metadata_menu_item = gtk.MenuItem("Idle", False)
-+ self.metadata_menu_item = Gtk.MenuItem("Idle")
- self.metadata_menu_item.set_sensitive(False)
--
-- # if self.sleep_timer_menu_item == None:
-- # self.sleep_timer_menu_item = gtk.CheckMenuItem(_("Sleep Timer"))
--
-+
-+ # if self.sleep_timer_menu_item == None:
-+ # self.sleep_timer_menu_item = Gtk.CheckMenuItem(_("Sleep Timer"))
-+
- if self.preferences_menu == None:
-- self.preferences_menu = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES)
--
-- menu_config_radios = gtk.MenuItem(_("Configure Radios..."))
-- menu_reload_bookmarks = gtk.MenuItem(_("Reload Bookmarks"))
-- menu_config_plugin = gtk.MenuItem(_("Configure Plugins..."))
-+ self.preferences_menu = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_PREFERENCES, None)
-+ self.preferences_menu.set_always_show_image(True)
-+
-+ menu_config_radios = Gtk.MenuItem(_("Configure Radios..."))
-+ menu_reload_bookmarks = Gtk.MenuItem(_("Reload Bookmarks"))
-+ menu_config_plugin = Gtk.MenuItem(_("Configure Plugins..."))
- #Check bookmarks file status
- menu_config_radios.set_sensitive(self.provider.isBookmarkWritable())
-
-- # build
-- menu.append(self.turnOnOff)
-- menu.append(gtk.MenuItem())
-+ # build
-+ menu.append(self.turnOnOff)
-+ menu.append(Gtk.MenuItem())
- menu.append(self.metadata_menu_item)
-- menu.append(gtk.MenuItem())
--
-+ menu.append(Gtk.MenuItem())
-+
- self.provider.walk_bookmarks(self.group_callback, self.bookmark_callback, menu)
--
-+
- menu_config_radios.connect('activate', self.handler.on_preferences)
- menu_reload_bookmarks.connect('activate', self.handler.reload_bookmarks)
- menu_config_plugin.connect('activate', self.handler.on_plugin_preferences)
--
--
-- menu.append(gtk.MenuItem())
--
-+
-+
-+ menu.append(Gtk.MenuItem())
-+
- # build preferences
- menu.append(self.preferences_menu)
--
-- if self.perferences_submenu == None:
-- self.perferences_submenu = gtk.Menu()
-- self.preferences_menu.set_submenu(self.perferences_submenu)
-- #self.perferences_submenu.append(gtk.MenuItem())
-+
-+ if self.perferences_submenu == None:
-+ self.perferences_submenu = Gtk.Menu()
-+ self.preferences_menu.set_submenu(self.perferences_submenu)
-+ #self.perferences_submenu.append(Gtk.MenuItem())
- self.perferences_submenu.append(menu_config_radios)
- self.perferences_submenu.append(menu_reload_bookmarks)
-
- # plugins submenu
-- menu_plugins_item = gtk.MenuItem("Plugins", False)
-- self.menu_plugins = gtk.Menu()
-- self.menu_plugins.append(menu_config_plugin)
-- self.menu_plugins.append(gtk.MenuItem()) #add separator
-- menu_plugins_item.set_submenu(self.menu_plugins)
-+ if self.menu_plugins_item == None:
-+ self.menu_plugins_item = Gtk.MenuItem("Plugins")
-+ self.menu_plugins = Gtk.Menu()
-+ self.menu_plugins.append(menu_config_plugin)
-+ self.menu_plugins.append(Gtk.MenuItem()) #add separator
-+ self.menu_plugins_item.set_submenu(self.menu_plugins)
-
-- menu.append(menu_plugins_item)
-+ menu.append(self.menu_plugins_item)
-
-- menu_about = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
-- menu_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT)
-+ menu_about = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_ABOUT, None)
-+ menu_quit = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_QUIT, None)
- menu_quit.connect('activate', self.handler.on_quit)
- menu_about.connect('activate', self.handler.on_about)
- menu.append(menu_about)
- menu.append(menu_quit)
-
- menu.show_all()
--
-- try:
-- self.app_indicator.connect("scroll-event", self.app_indicator_scroll)
-- except:
-- # not available in this version of app indicator
-- self.log.info("App indicator scroll events are not available.")
-
-
- def app_indicator_scroll(self, indicator, delta, direction):
-@@ -159,26 +162,26 @@ class AppIndicatorGui:
- def group_callback(self, group_name, user_data):
-
- new_user_data = None
--
-+
- if group_name != 'root':
-- group = gtk.MenuItem(group_name, False)
-- user_data.append(group)
-- new_user_data = gtk.Menu()
-+ group = Gtk.MenuItem(group_name)
-+ user_data.append(group)
-+ new_user_data = Gtk.Menu()
- group.set_submenu(new_user_data)
- else:
- new_user_data = self.radioMenu
--
-+
- return new_user_data
-
-
- def bookmark_callback(self, radio_name, user_data):
-
- if radio_name.startswith("[separator-"):
-- separator = gtk.MenuItem()
-+ separator = Gtk.MenuItem()
- user_data.append(separator)
- separator.show()
-- else:
-- radio = gtk.MenuItem(radio_name, False)
-+ else:
-+ radio = Gtk.MenuItem(radio_name)
- radio.show()
- radio.connect('activate', self.handler.on_start, radio_name)
- user_data.append(radio)
-@@ -193,9 +196,9 @@ class AppIndicatorGui:
- station = data['station']
- self.turnOnOff.set_label(C_('Turns off the current radio.', 'Turn Off "%s"') % station)
- self.turnOnOff.set_sensitive(True)
--
-+
- self.app_indicator.set_icon(APP_INDICATOR_ICON_ON)
--
-+
- elif(state == 'paused'):
- if not self.mediator.context.station:
- self.turnOnOff.set_label(_('Turned Off'))
-@@ -203,9 +206,9 @@ class AppIndicatorGui:
- else:
- self.turnOnOff.set_label(_('Turn On "%s"' % self.mediator.context.station))
- self.turnOnOff.set_sensitive(True)
--
-+
- self.app_indicator.set_icon(APP_INDICATOR_ICON_OFF)
--
-+
- elif(state == 'connecting'):
- station = data['station']
- self.turnOnOff.set_sensitive(True)
-@@ -223,15 +226,15 @@ class AppIndicatorGui:
-
- if (self.mediator.getContext().state == 'playing'):
- if(songInfo):
-- otherInfo = "(vol: %s%%)" % (volume)
--
-+ otherInfo = "(vol: %s%%)" % (volume)
-+
- # don't break volume info...
- text = textwrap.wrap(songInfo, 30)
- if (30 - len(text[-1])) >= (len(otherInfo)+1):
- text[-1] += " " + otherInfo
- else:
- text.append(otherInfo)
--
-+
- return "\n".join(text)
- else:
- return C_("Playing status tooltip information", "Playing (vol: %s%%)") % (volume)
-Index: radiotray/src/AudioPlayerGStreamer.py
-===================================================================
---- radiotray.orig/src/AudioPlayerGStreamer.py
-+++ radiotray/src/AudioPlayerGStreamer.py
-@@ -18,10 +18,21 @@
- #
- ##########################################################################
- import sys, os
--import pygtk, gtk, gobject
--import pygst
--pygst.require("0.10")
--import gst
-+try:
-+ import gi
-+ gi.require_version("Gtk", "3.0")
-+ gi.require_version('Gst', '1.0')
-+except:
-+ pass
-+try:
-+ from gi.repository import Gtk
-+ from gi.repository import GObject
-+ GObject.threads_init()
-+ from gi.repository import Gst
-+ Gst.init(None)
-+except Exception as e:
-+ print e
-+
- from StreamDecoder import StreamDecoder
- from lib.common import USER_AGENT
- from events.EventManager import EventManager
-@@ -40,11 +51,13 @@ class AudioPlayerGStreamer:
- self.log = logging.getLogger('radiotray')
-
- # init player
-- self.souphttpsrc = gst.element_factory_make("souphttpsrc", "source")
-+ self.log.debug("Initializing gstreamer...")
-+ self.souphttpsrc = Gst.ElementFactory.make("souphttpsrc", "source")
- self.souphttpsrc.set_property("user-agent", USER_AGENT)
-
-- self.player = gst.element_factory_make("playbin2", "player")
-- fakesink = gst.element_factory_make("fakesink", "fakesink")
-+ self.log.debug("Loading playbin...");
-+ self.player = Gst.ElementFactory.make("playbin", "player")
-+ fakesink = Gst.ElementFactory.make("fakesink", "fakesink")
- self.player.set_property("video-sink", fakesink)
-
- #buffer size
-@@ -60,6 +73,8 @@ class AudioPlayerGStreamer:
- bus.add_signal_watch()
- bus.connect("message", self.on_message)
-
-+ self.log.debug("GStreamer initialized.")
-+
- def start(self, uri):
-
- urlInfo = self.decoder.getMediaStreamInfo(uri)
-@@ -103,10 +118,10 @@ class AudioPlayerGStreamer:
-
- def playStream(self, uri):
- self.player.set_property("uri", uri)
-- self.player.set_state(gst.STATE_PAUSED) # buffer before starting playback
-+ self.player.set_state(Gst.State.PAUSED) # buffer before starting playback
-
- def stop(self):
-- self.player.set_state(gst.STATE_NULL)
-+ self.player.set_state(Gst.State.NULL)
- self.eventManager.notify(EventManager.STATE_CHANGED, {'state':'paused'})
-
- def volume_up(self, volume_increment):
-@@ -120,30 +135,30 @@ class AudioPlayerGStreamer:
- def on_message(self, bus, message):
- t = message.type
-
-- stru = message.structure
-+ stru = message.get_structure()
- if(stru != None):
- name = stru.get_name()
- if(name == 'redirect'):
-- slef.log.info("redirect received")
-- self.player.set_state(gst.STATE_NULL)
-+ self.log.info("redirect received")
-+ self.player.set_state(Gst.State.NULL)
- stru.foreach(self.redirect, None)
-
-
-
-- if t == gst.MESSAGE_EOS:
-+ if t == Gst.MessageType.EOS:
- self.log.debug("Received MESSAGE_EOS")
-- self.player.set_state(gst.STATE_NULL)
-+ self.player.set_state(Gst.State.NULL)
- self.playNextStream()
-- elif t == gst.MESSAGE_BUFFERING:
-- percent = message.structure['buffer-percent']
-+ elif t == Gst.MessageType.BUFFERING:
-+ percent = message.parse_buffering()
- if percent < 100:
- self.log.debug("Buffering %s" % percent)
-- self.player.set_state(gst.STATE_PAUSED)
-+ self.player.set_state(Gst.State.PAUSED)
- else:
-- self.player.set_state(gst.STATE_PLAYING)
-- elif t == gst.MESSAGE_ERROR:
-+ self.player.set_state(Gst.State.PLAYING)
-+ elif t == Gst.MessageType.ERROR:
- self.log.debug("Received MESSAGE_ERROR")
-- self.player.set_state(gst.STATE_NULL)
-+ self.player.set_state(Gst.State.NULL)
- err, debug = message.parse_error()
- self.log.warn(err)
- self.log.warn(debug)
-@@ -153,15 +168,15 @@ class AudioPlayerGStreamer:
- else:
- self.eventManager.notify(EventManager.STATION_ERROR, {'error':debug})
-
-- elif t == gst.MESSAGE_STATE_CHANGED:
-+ elif t == Gst.MessageType.STATE_CHANGED:
- oldstate, newstate, pending = message.parse_state_changed()
- self.log.debug(("Received MESSAGE_STATE_CHANGED (%s -> %s)") % (oldstate, newstate))
-
-- if newstate == gst.STATE_PLAYING:
-+ if newstate == Gst.State.PLAYING:
- self.retrying = False
- station = self.mediator.getContext().station
- self.eventManager.notify(EventManager.STATE_CHANGED, {'state':'playing', 'station':station})
-- elif oldstate == gst.STATE_PLAYING and newstate == gst.STATE_PAUSED:
-+ elif oldstate == Gst.State.PLAYING and newstate == Gst.State.PAUSED:
- self.log.info("Received PAUSE state.")
-
- if self.retrying == False:
-@@ -172,22 +187,35 @@ class AudioPlayerGStreamer:
-
-
-
-- elif t == gst.MESSAGE_TAG:
-+ elif t == Gst.MessageType.TAG:
-
- taglist = message.parse_tag()
-
-- #if there is no song information, there's no point in triggering song change event
-- if('artist' in taglist.keys() or 'title' in taglist.keys()):
-- station = self.mediator.getContext().station
-- metadata = {}
-+ #for (tag, value) in taglist.items():
-+ # print "TT: " + tag + " - " + value
-
-- for key in taglist.keys():
-- metadata[key] = taglist[key]
-+ (present, value) = taglist.get_string('title')
-
-+ if present:
-+ metadata = {}
-+ station = self.mediator.getContext().station
-+ metadata['title'] = value
- metadata['station'] = station
--
-+
- self.eventManager.notify(EventManager.SONG_CHANGED, metadata)
-
-+ #if there is no song information, there's no point in triggering song change event
-+ #if('artist' in taglist.keys() or 'title' in taglist.keys()):
-+ # station = self.mediator.getContext().station
-+ # metadata = {}
-+
-+ # for key in taglist.keys():
-+ # metadata[key] = taglist[key]
-+
-+ # metadata['station'] = station
-+
-+ # self.eventManager.notify(EventManager.SONG_CHANGED, metadata)
-+
- return True
-
- def redirect(self, name, value, data):
-Index: radiotray/src/BookmarkConfiguration.py
-===================================================================
---- radiotray.orig/src/BookmarkConfiguration.py
-+++ radiotray/src/BookmarkConfiguration.py
-@@ -18,18 +18,19 @@
- #
- ##########################################################################
- import sys
-+import pdb
-
- try:
-- import pygtk
-- pygtk.require("2.0")
-+ import gi
-+ gi.require_version("Gtk", "3.0")
- except:
- pass
- try:
-- import gtk
-- import gtk.glade
-- import gobject
-+ from gi.repository import Gtk, Gdk
-+ #import Gtk.glade
- import os
--except:
-+except Exception as e:
-+ print e
- sys.exit(1)
-
- from XmlDataProvider import XmlDataProvider
-@@ -39,8 +40,9 @@ from lib import i18n
- import uuid
- import logging
-
--drop_yes = ("drop_yes", gtk.TARGET_SAME_WIDGET, 0)
--drop_no = ("drop_no", gtk.TARGET_SAME_WIDGET, 0)
-+drop_yes = [Gtk.TargetEntry.new(target = "drop_yes", flags = Gtk.TargetFlags.SAME_WIDGET, info = 0)]
-+drop_no = [Gtk.TargetEntry.new(target = "drop_no", flags = Gtk.TargetFlags.SAME_WIDGET, info = 0)]
-+targets = [('data',Gtk.TargetFlags.SAME_APP,0)]
-
-
- class BookmarkConfiguration(object):
-@@ -92,23 +94,23 @@ class BookmarkConfiguration(object):
- self.load_data()
-
- # config tree ui
-- cell = gtk.CellRendererText()
-- tvcolumn = gtk.TreeViewColumn(_('Radio Name'), cell)
-+ cell = Gtk.CellRendererText()
-+ tvcolumn = Gtk.TreeViewColumn(_('Radio Name'), cell)
- self.list.append_column(tvcolumn)
- tvcolumn.add_attribute(cell, 'text', 0)
-
- # config combo ui
-- cell2 = gtk.CellRendererText()
-+ cell2 = Gtk.CellRendererText()
- self.parentGroup.pack_start(cell2, True)
- self.parentGroup.add_attribute(cell2, 'text', 0)
-
- # config add radio group combo ui
-- cell4 = gtk.CellRendererText()
-+ cell4 = Gtk.CellRendererText()
- self.radioGroup.pack_start(cell4, True)
- self.radioGroup.add_attribute(cell4, 'text', 0)
-
- # separator new group combo ui
-- cell3 = gtk.CellRendererText()
-+ cell3 = Gtk.CellRendererText()
- self.sepGroup.pack_start(cell3, True)
- self.sepGroup.add_attribute(cell3, 'text', 0)
-
-@@ -128,12 +130,14 @@ class BookmarkConfiguration(object):
- self.wTree.connect_signals(self)
-
- # enable drag and drop support
-- self.list.enable_model_drag_source(
-- gtk.gdk.BUTTON1_MASK, [drop_yes], gtk.gdk.ACTION_MOVE)
-- self.list.enable_model_drag_dest(
-- [drop_yes], gtk.gdk.ACTION_MOVE)
-- self.list.connect("drag-data-received", self.onDragDataReceived)
-- self.list.connect("drag-motion", self.onDragMotion)
-+ self.list.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.MOVE)
-+ self.list.enable_model_drag_dest([], Gdk.DragAction.MOVE)
-+ print "config"
-+ self.list.drag_dest_add_text_targets()
-+ self.list.drag_source_add_text_targets()
-+
-+ self.list.connect("drag_data_received", self.onDragDataReceived)
-+ self.list.connect("drag_data_get", self.onDataGet)
-
- # Connect row activation with bookmarks conf
- self.list.connect("row-activated", self.on_row_activated)
-@@ -141,7 +145,7 @@ class BookmarkConfiguration(object):
- def load_data(self):
-
- # the meaning of the three columns is: description, id, type
-- treestore = gtk.TreeStore(str, str, str)
-+ treestore = Gtk.TreeStore(str, str, str)
- root = self.dataProvider.getRootGroup()
- self.add_group_data(root, None, treestore)
- self.list.set_model(treestore)
-@@ -152,17 +156,19 @@ class BookmarkConfiguration(object):
- def checkSanity(self, model, source, target):
- source_path = model.get_path(source)
- target_path = model.get_path(target)
-- if target_path[0:len(source_path)] == source_path:
-+ if target_path[0:len(source_path)] == list(source_path):
- return False
- else:
- return True
-
- #drag and drop support
- def checkParentability(self, model, target, drop_position):
-- if (drop_position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE
-- or drop_position == gtk.TREE_VIEW_DROP_INTO_OR_AFTER) \
-- and (model.get_value(target, 2) == self.RADIO_TYPE or model.get_value(target, 2) == self.SEPARATOR_TYPE):
-- return False
-+
-+ if (drop_position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE or drop_position == Gtk.TreeViewDropPosition.INTO_OR_AFTER):
-+ if(model.get_value(target, 2) == self.RADIO_TYPE or model.get_value(target, 2) == self.SEPARATOR_TYPE):
-+ return False
-+ else:
-+ return True
- else:
- return True
-
-@@ -174,27 +180,45 @@ class BookmarkConfiguration(object):
-
- #drag and drop support
- def copyRow(self, treeview, model, source, target, drop_position):
--
-- source_row = model[source]
-- if drop_position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE:
-- new = model.prepend(target, source_row)
-- elif drop_position == gtk.TREE_VIEW_DROP_INTO_OR_AFTER:
-- new = model.append(target, source_row)
-- elif drop_position == gtk.TREE_VIEW_DROP_BEFORE:
-- new = model.insert_before(None, target, source_row)
-- elif drop_position == gtk.TREE_VIEW_DROP_AFTER:
-- new = model.insert_after(None, target, source_row)
-+
-+ #source_is_expanded = treeview.row_expanded(model.get_path(source))
-+ new = None
-+
-+ if (drop_position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE) or (drop_position == Gtk.TreeViewDropPosition.INTO_OR_AFTER):
-+ new = model.append(target, model[source][:])
-+
-+ elif drop_position == Gtk.TreeViewDropPosition.BEFORE:
-+ parent = model.iter_parent(target)
-+ new = model.insert_before(parent, target, model[source][:])
-+
-+ elif drop_position == Gtk.TreeViewDropPosition.AFTER:
-+ parent = model.iter_parent(target)
-+ new = model.insert_after(parent, target, model[source][:])
-+
-+ else:
-+ print "No data copied!"
-+ return
-
-- for n in range(model.iter_n_children(source)):
-- child = model.iter_nth_child(source, n)
-- self.copyRow(treeview, model, child, new,
-- gtk.TREE_VIEW_DROP_INTO_OR_BEFORE)
-+ nrChild = range(model.iter_n_children(source))
-+ while(model.iter_n_children(source) > 0):
-+ child = model.iter_nth_child(source, 0)
-+ self.copyRow(treeview, model, child, new, Gtk.TreeViewDropPosition.INTO_OR_BEFORE)
-+
-+ model.remove(source)
-+
-
-- source_is_expanded = treeview.row_expanded(model.get_path(source))
-- if source_is_expanded:
-- self.expandToPath(treeview, model.get_path(new))
-+
-+ #if source_is_expanded:
-+ # self.expandToPath(treeview, model.get_path(new))
-
-
-+ def onDataGet(self, widget, context, selection, info, time):
-+ treeselection = widget.get_selection()
-+ model, iter = treeselection.get_selected()
-+ data = model.get_value(iter, 0)
-+ selection.set(selection.get_target(), 8, data)
-+ return
-+
- #drag and drop support
- def onDragDataReceived(self, treeview, drag_context, x, y, selection_data, info, eventtime):
-
-@@ -208,13 +232,17 @@ class BookmarkConfiguration(object):
- target = model.get_iter(target_path)
- sourceName = model.get_value(source,1)
- targetName = model.get_value(target,1)
-+
-+ print "source: " + sourceName + " , target: " + targetName;
-
- is_sane = self.checkSanity(model, source, target)
- is_parentable = self.checkParentability(model, target, drop_position)
-+
- if is_sane and is_parentable:
-+
- self.copyRow(treeview, model, source, target, drop_position)
-- if (drop_position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE
-- or drop_position == gtk.TREE_VIEW_DROP_INTO_OR_AFTER):
-+ if (drop_position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE
-+ or drop_position == Gtk.TreeViewDropPosition.INTO_OR_AFTER):
- treeview.expand_row(target_path, False)
- drag_context.finish(True, True, eventtime)
-
-@@ -223,21 +251,6 @@ class BookmarkConfiguration(object):
- drag_context.finish(False, False, eventtime)
-
-
-- #drag and drop support
-- def onDragMotion(self, treeview, drag_context, x, y, eventtime):
-- try:
-- target_path, drop_position = treeview.get_dest_row_at_pos(x, y)
-- model, source = treeview.get_selection().get_selected()
-- target = model.get_iter(target_path)
-- except:
-- return
-- is_sane = self.checkSanity(model, source, target)
-- is_parentable = self.checkParentability(model, target, drop_position)
-- if is_sane and is_parentable:
-- treeview.enable_model_drag_dest([drop_yes], gtk.gdk.ACTION_MOVE)
-- else:
-- treeview.enable_model_drag_dest([drop_no], gtk.gdk.ACTION_MOVE)
--
-
-
-
-@@ -278,7 +291,7 @@ class BookmarkConfiguration(object):
- self.radioGroupLabel.show()
-
- # populate groups
-- liststore = gtk.ListStore(str)
-+ liststore = Gtk.ListStore(str)
-
- for group in self.dataProvider.listGroupNames():
- liststore.append([group])
-@@ -327,7 +340,7 @@ class BookmarkConfiguration(object):
- selectedName = model.get_value(iter,1)
- selectedType = model.get_value(iter, 2)
-
-- liststore = gtk.ListStore(str)
-+ liststore = Gtk.ListStore(str)
-
- for group in self.dataProvider.listGroupNames():
- liststore.append([group])
-@@ -456,11 +469,11 @@ class BookmarkConfiguration(object):
- # if separator then just remove it
- if not separatorFlag.startswith("[separator-"):
-
-- confirmation = gtk.MessageDialog(
-+ confirmation = Gtk.MessageDialog(
- self.window,
-- gtk.DIALOG_MODAL,
-- gtk.MESSAGE_QUESTION,
-- gtk.BUTTONS_YES_NO,
-+ Gtk.DialogFlags.MODAL,
-+ Gtk.MessageType.QUESTION,
-+ Gtk.ButtonsType.YES_NO,
- _("Are you sure you want to delete \"%s\"?") % selectedRadioName
- )
-
-@@ -490,7 +503,7 @@ class BookmarkConfiguration(object):
- # close the window and quit
- def on_delete_event(self, widget, event, data=None):
- if self.standalone:
-- gtk.main_quit()
-+ Gtk.main_quit()
- return False
-
- def on_nameEntry_activated(self, widget):
-@@ -509,7 +522,7 @@ class BookmarkConfiguration(object):
- self.groupNameEntry.grab_focus()
-
- # populate parent groups
-- liststore = gtk.ListStore(str)
-+ liststore = Gtk.ListStore(str)
-
- for group in self.dataProvider.listGroupNames():
- liststore.append([group])
-Index: radiotray/src/GuiChooserConfiguration.py
-===================================================================
---- radiotray.orig/src/GuiChooserConfiguration.py
-+++ radiotray/src/GuiChooserConfiguration.py
-@@ -20,16 +20,16 @@
- import sys
-
- try:
-- import pygtk
-- pygtk.require("2.0")
-+ import gi
-+ gi.require_version("Gtk", "3.0")
- except:
- pass
- try:
-- import gtk
-- import gtk.glade
-- import gobject
-+ from gi.repository import Gtk
-+ #import Gtk.glade
- import os
--except:
-+except Exception as e:
-+ print e
- sys.exit(1)
-
- from lib.common import APP_ICON_ON
-Index: radiotray/src/NotificationManager.py
-===================================================================
---- radiotray.orig/src/NotificationManager.py
-+++ radiotray/src/NotificationManager.py
-@@ -30,22 +30,23 @@ class NotificationManager(object):
- self.eventManagerWrapper = eventManagerWrapper
- self.log = logging.getLogger('radiotray')
- self.lastState = None
--
-+
- def on_state_changed(self, data):
--
-+
- state = data['state']
--
-+
- if(state == 'playing' and state != self.lastState):
- station = data['station']
-- self.lastState = state
- self.eventManagerWrapper.notify(_('Radio Tray Playing'), station)
-
--
-+ self.lastState = state
-+
-+
-
- def on_song_changed(self, data):
--
-+
- self.log.debug(data)
--
-+
- station = data['station']
- msgTitle = "%s - %s" % (APPNAME , station)
- msg = None
-@@ -53,7 +54,7 @@ class NotificationManager(object):
- if('artist' in data.keys() and 'title' in data.keys()):
- artist = data['artist']
- title = data['title']
-- msg = "%s - %s" % (artist, title)
-+ msg = "%s - %s" % (artist, title)
- elif('artist' in data.keys()):
- msg = data['artist']
- elif('title' in data.keys()):
-@@ -70,24 +71,24 @@ class NotificationManager(object):
- try:
- f.write(pix)
- except Exception, e:
-- log.warn('Error saving icon')
-+ self.log.warn('Error saving icon')
- finally:
- f.close()
-
- self.eventManagerWrapper.notify_icon(msgTitle, msg, ICON_FILE)
--
-+
- except Exception, e:
- traceback.print_exc()
- self.eventManagerWrapper.notify(msgTitle, msg)
- else:
- self.eventManagerWrapper.notify(msgTitle, msg)
--
-+
- def on_station_error(self, data):
--
-+
- self.eventManagerWrapper.notify(_('Radio Error'), str(data['error']))
-
- def on_bookmarks_reloaded(self, data):
-
- self.eventManagerWrapper.notify(_("Bookmarks Reloaded"), _("Bookmarks Reloaded"))
--
--
-+
-+
-Index: radiotray/src/Plugin.py
-===================================================================
---- radiotray.orig/src/Plugin.py
-+++ radiotray/src/Plugin.py
-@@ -19,7 +19,7 @@
- ##########################################################################
-
- import threading
--import gtk
-+from gi.repository import Gtk
- import logging
-
- # This class should be extended by plugins implementations
-@@ -38,7 +38,7 @@ class Plugin(threading.Thread):
- self.cfgProvider = cfgProvider
- self.mediator = mediator
- self.tooltip = tooltip
-- self.menuItem = gtk.MenuItem(self.getName(), False)
-+ self.menuItem = Gtk.MenuItem(self.getName())
- self.menuItem.connect('activate', self.on_menu)
- self.menuItem.show()
-
-Index: radiotray/src/PluginConfiguration.py
-===================================================================
---- radiotray.orig/src/PluginConfiguration.py
-+++ radiotray/src/PluginConfiguration.py
-@@ -20,19 +20,20 @@
- import sys
-
- try:
-- import pygtk
-- pygtk.require("2.0")
-+ import gi
-+ gi.require_version("Gtk", "3.0")
- except:
- pass
- try:
-- import gtk
-- import gtk.glade
-- import gobject
-+ from gi.repository import Gtk
-+ #import Gtk.glade
-+ from gi.repository import GObject
-+ GObject.threads_init()
- import os
- from lib import utils
- from lib.common import APP_ICON_ON
--except:
-- sys.exit(1)
-+except Exception as e:
-+ print e
- import logging
-
- class PluginConfiguration(object):
-@@ -58,17 +59,17 @@ class PluginConfiguration(object):
-
-
- # config plugins view
-- cell1 = gtk.CellRendererToggle()
-+ cell1 = Gtk.CellRendererToggle()
- cell1.set_property('activatable', True)
- cell1.set_activatable(True)
-- cell1.set_property('mode', gtk.CELL_RENDERER_MODE_ACTIVATABLE)
-+ cell1.set_property('mode', Gtk.CellRendererMode.ACTIVATABLE)
- cell1.connect( 'toggled', self.on_toggle, liststore )
-- tvcolumn1 = gtk.TreeViewColumn(_('Active'), cell1)
-+ tvcolumn1 = Gtk.TreeViewColumn(_('Active'), cell1)
-
- tvcolumn1.add_attribute( cell1, "active", 0)
-
-- cell2 = gtk.CellRendererText()
-- tvcolumn2 = gtk.TreeViewColumn(_('Name'), cell2, text=1)
-+ cell2 = Gtk.CellRendererText()
-+ tvcolumn2 = Gtk.TreeViewColumn(_('Name'), cell2, text=1)
-
- self.list.append_column(tvcolumn1)
- self.list.append_column(tvcolumn2)
-@@ -88,7 +89,7 @@ class PluginConfiguration(object):
- # self.cfgProvider.setConfigValue('active_plugins'
-
-
-- liststore = gtk.ListStore(gobject.TYPE_BOOLEAN, gobject.TYPE_STRING)
-+ liststore = Gtk.ListStore(GObject.TYPE_BOOLEAN, GObject.TYPE_STRING)
- plugins = self.pluginManager.getPlugins()
-
- for p in plugins:
-Index: radiotray/src/RadioTray.py
-===================================================================
---- radiotray.orig/src/RadioTray.py
-+++ radiotray/src/RadioTray.py
-@@ -73,6 +73,7 @@ class RadioTray(object):
-
- # tooltip manager
- tooltipManager = TooltipManager()
-+ self.logger.debug("Tooltip manager initialized.")
-
- # chooser
- if(url == '--config'):
-@@ -82,7 +83,7 @@ class RadioTray(object):
- url = None
- # load gui
- self.systray = SysTray(self.mediator, self.provider, self.cfg_provider, self.default_cfg_provider, eventManager, tooltipManager)
--
-+ self.logger.debug("GUI initialized")
-
-
- # notification manager
-Index: radiotray/src/SysTray.py
-===================================================================
---- radiotray.orig/src/SysTray.py
-+++ radiotray/src/SysTray.py
-@@ -20,17 +20,19 @@
- import sys,os
- import time
- try:
-- import pygtk
-- pygtk.require("2.1")
-- import gtk
--except:
-+ import gi
-+ gi.require_version("Gtk", "3.0")
-+ from gi.repository import Gtk
-+ from gi.repository import Gdk
-+except Exception as e:
-+ print e
- pass
--try:
-- import gtk
-- import gtk.glade
-- import gobject
--except:
-- sys.exit(1)
-+#try:
-+ #from gi.repository import Gtk
-+ #import Gtk.glade
-+#except Exception as e:
-+# print e
-+# sys.exit(1)
-
- from AudioPlayerGStreamer import AudioPlayerGStreamer
- from XmlDataProvider import XmlDataProvider
-@@ -46,7 +48,6 @@ from SysTrayGui import SysTrayGui
- from AppIndicatorGui import AppIndicatorGui
- from TooltipManager import TooltipManager
- from Context import Context
--from glib import glib_version
-
- import dbus
- import textwrap
-@@ -96,7 +97,7 @@ class SysTray(object):
-
- # execute gui chooser
- try:
-- import appindicator
-+ from gi.repository import AppIndicator3
- self.gui_engine = self.cfg_provider.getConfigValue("gui_engine")
- if(self.gui_engine == None):
- self.gui_engine = default_cfg_provider.getConfigValue("gui_engine")
-@@ -114,7 +115,6 @@ class SysTray(object):
-
-
-
--
- if self.gui_engine == "appindicator":
- self.app_indicator_enabled = True
- else:
-@@ -138,10 +138,10 @@ class SysTray(object):
- ###### Action Events #######
-
- def scroll(self,widget, event):
-- if event.direction == gtk.gdk.SCROLL_UP:
-+ if event.direction == Gdk.ScrollDirection.UP:
- self.mediator.volume_up()
-
-- if event.direction == gtk.gdk.SCROLL_DOWN:
-+ if event.direction == Gdk.ScrollDirection.DOWN:
- self.mediator.volume_down()
- def volume_up(self, menu_item):
- self.mediator.volume_up()
-@@ -155,7 +155,7 @@ class SysTray(object):
-
- def on_quit(self, data):
- self.log.info('Exiting...')
-- gtk.main_quit()
-+ Gtk.main_quit()
-
- def on_about(self, data):
- about_dialog(parent=None)
-@@ -183,13 +183,10 @@ class SysTray(object):
-
-
- def run(self):
-- if glib_version < (2, 41, 0):
-- gtk.gdk.threads_init()
-- gtk.main()
-+ Gdk.threads_init()
-+ Gtk.main()
-
-
--
--
-
- def reload_bookmarks(self, data):
- self.provider.loadFromFile()
-Index: radiotray/src/SysTrayGui.py
-===================================================================
---- radiotray.orig/src/SysTrayGui.py
-+++ radiotray/src/SysTrayGui.py
-@@ -18,16 +18,16 @@
- #
- ##########################################################################
- try:
-- import pygtk
-- pygtk.require("2.1")
-- import gtk
-+ import gi
-+ pyGtk.require("2.1")
-+ from gi.repository import Gtk
- except:
- pass
- try:
-- import gtk
-- import gtk.glade
-- import gobject
--except:
-+ from gi.repository import Gtk
-+ #import Gtk.glade
-+except Exception as e:
-+ print e
- sys.exit(1)
-
- from lib.common import APPNAME, APPVERSION, APP_ICON_ON, APP_ICON_OFF, APP_ICON_CONNECT, APP_INDICATOR_ICON_ON, APP_INDICATOR_ICON_OFF
-@@ -46,17 +46,17 @@ class SysTrayGui:
- def buildMenu(self):
-
- # radios menu
-- self.radioMenu = gtk.Menu()
-+ self.radioMenu = Gtk.Menu()
-
- if not self.mediator.context.station:
-- self.turnOnOff = gtk.MenuItem(_("Turned Off"), False)
-- self.turnOnOff2 = gtk.MenuItem(_("Turned Off"), False)
-+ self.turnOnOff = Gtk.MenuItem(_("Turned Off"), False)
-+ self.turnOnOff2 = Gtk.MenuItem(_("Turned Off"), False)
- self.turnOnOff.set_sensitive(False)
- self.turnOnOff2.set_sensitive(False)
- else:
-- self.turnOnOff = gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station, False)
-+ self.turnOnOff = Gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station, False)
- self.turnOnOff.set_sensitive(True)
-- self.turnOnOff2 = gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station, False)
-+ self.turnOnOff2 = Gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station, False)
- self.turnOnOff2.set_sensitive(True)
-
- self.turnOnOff.connect('activate', self.handler.on_turn_on_off)
-@@ -64,34 +64,34 @@ class SysTrayGui:
- self.update_radios()
-
- # config menu
-- self.menu = gtk.Menu()
-- self.turnOnOff2 = gtk.MenuItem(_("Turned Off"))
-+ self.menu = Gtk.Menu()
-+ self.turnOnOff2 = Gtk.MenuItem(_("Turned Off"))
- self.turnOnOff2.connect('activate', self.handler.on_turn_on_off)
- self.turnOnOff2.set_sensitive(False)
-- separator = gtk.MenuItem()
-- menu_item1 = gtk.MenuItem(_("Configure Radios..."))
-+ separator = Gtk.MenuItem()
-+ menu_item1 = Gtk.MenuItem(_("Configure Radios..."))
-
- #Check bookmarks file status
- menu_item1.set_sensitive(self.provider.isBookmarkWritable())
-
-- menu_item4 = gtk.MenuItem(_("Reload Bookmarks"))
-- menu_item3 = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
-- menu_item2 = gtk.ImageMenuItem(gtk.STOCK_QUIT)
-+ menu_item4 = Gtk.MenuItem(_("Reload Bookmarks"))
-+ menu_item3 = Gtk.ImageMenuItem(Gtk.STOCK_ABOUT)
-+ menu_item2 = Gtk.ImageMenuItem(Gtk.STOCK_QUIT)
- self.menu.append(self.turnOnOff2)
- self.menu.append(separator)
- self.menu.append(menu_item1)
-
- # plugins sub-menu
-- menu_plugins_item = gtk.MenuItem("Plugins", False)
-- self.menu_plugins = gtk.Menu()
-+ menu_plugins_item = Gtk.MenuItem("Plugins", False)
-+ self.menu_plugins = Gtk.Menu()
- menu_plugins_item.set_submenu(self.menu_plugins)
-- menu_item5 = gtk.MenuItem(_("Configure Plugins..."))
-+ menu_item5 = Gtk.MenuItem(_("Configure Plugins..."))
- self.menu_plugins.append(menu_item5)
-- self.menu_plugins.append(gtk.MenuItem()) #add separator
-+ self.menu_plugins.append(Gtk.MenuItem()) #add separator
- self.menu.append(menu_plugins_item)
-
- self.menu.append(menu_item4)
-- self.menu.append(gtk.MenuItem())
-+ self.menu.append(Gtk.MenuItem())
- self.menu.append(menu_item3)
- self.menu.append(menu_item2)
- menu_item1.show()
-@@ -112,7 +112,7 @@ class SysTrayGui:
-
- self.menu.show_all()
-
-- self.icon = gtk.status_icon_new_from_file(APP_ICON_OFF)
-+ self.icon = Gtk.status_icon_new_from_file(APP_ICON_OFF)
- self.icon.set_tooltip_markup(_("Idle (vol: %s%%)") % (self.mediator.getVolume()))
- self.icon.connect('button_press_event', self.button_press)
- self.icon.connect('scroll_event', self.handler.scroll)
-@@ -121,7 +121,7 @@ class SysTrayGui:
- def button_press(self,widget,event):
-
- if(event.button == 1):
-- self.radioMenu.popup(None, None, gtk.status_icon_position_menu, 0, event.get_time(), widget)
-+ self.radioMenu.popup(None, None, Gtk.status_icon_position_menu, 0, event.get_time(), widget)
- elif (event.button == 2):
- if (self.mediator.getContext().state == 'playing'):
- self.mediator.stop()
-@@ -129,7 +129,7 @@ class SysTrayGui:
- if self.mediator.getContext().station:
- self.mediator.play(self.mediator.getContext().station)
- else:
-- self.menu.popup(None, None, gtk.status_icon_position_menu, 2, event.get_time(), widget)
-+ self.menu.popup(None, None, Gtk.status_icon_position_menu, 2, event.get_time(), widget)
-
-
- def update_radios(self):
-@@ -141,7 +141,7 @@ class SysTrayGui:
- self.radioMenu.append(self.turnOnOff)
- self.turnOnOff.show()
-
-- separator = gtk.MenuItem()
-+ separator = Gtk.MenuItem()
- self.radioMenu.append(separator)
- separator.show()
-
-@@ -155,9 +155,9 @@ class SysTrayGui:
- new_user_data = None
-
- if group_name != 'root':
-- group = gtk.MenuItem(group_name, False)
-+ group = Gtk.MenuItem(group_name, False)
- user_data.append(group)
-- new_user_data = gtk.Menu()
-+ new_user_data = Gtk.Menu()
- group.set_submenu(new_user_data)
- else:
- new_user_data = self.radioMenu
-@@ -168,11 +168,11 @@ class SysTrayGui:
- def bookmark_callback(self, radio_name, user_data):
-
- if radio_name.startswith("[separator-"):
-- separator = gtk.MenuItem()
-+ separator = Gtk.MenuItem()
- user_data.append(separator)
- separator.show()
- else:
-- radio = gtk.MenuItem(radio_name, False)
-+ radio = Gtk.MenuItem(radio_name, False)
- radio.show()
- radio.connect('activate', self.handler.on_start, radio_name)
- user_data.append(radio)
-Index: radiotray/src/XmlDataProvider.py
-===================================================================
---- radiotray.orig/src/XmlDataProvider.py
-+++ radiotray/src/XmlDataProvider.py
-@@ -20,7 +20,7 @@
- ##########################################################################
- import os
- from lxml import etree
--import gtk
-+from gi.repository import Gtk
- import logging
-
- class XmlDataProvider:
-@@ -317,13 +317,13 @@ class XmlDataProvider:
-
- index = itemTarget.getparent().index(itemTarget)
-
-- if (position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE or position == gtk.TREE_VIEW_DROP_INTO_OR_AFTER):
-+ if (position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE or position == Gtk.TreeViewDropPosition.INTO_OR_AFTER):
- itemTarget.append(itemToMove)
-
-- elif position == gtk.TREE_VIEW_DROP_BEFORE:
-+ elif position == Gtk.TreeViewDropPosition.BEFORE:
- itemTarget.getparent().insert(index, itemToMove)
-
-- elif position == gtk.TREE_VIEW_DROP_AFTER:
-+ elif position == Gtk.TreeViewDropPosition.AFTER:
- itemTarget.getparent().insert(index+1, itemToMove)
-
- self.log.debug('%s moved with success', str(source))
-Index: radiotray/src/about.py
-===================================================================
---- radiotray.orig/src/about.py
-+++ radiotray/src/about.py
-@@ -1,29 +1,29 @@
- # -*- coding: utf-8 -*-
--import gtk
-+from gi.repository import Gtk, GObject, Gdk, GdkPixbuf
- from lib import i18n
- import lib.common as common
-
-
- def on_email(about, mail):
-- gtk.show_uri(gtk.gdk.Screen(), "mailto:%s" % mail, 0L)
-+ Gtk.show_uri(Gdk.Screen(), "mailto:%s" % mail, 0L)
-
- def on_url(about, link):
-- gtk.show_uri(gtk.gdk.Screen(), link, 0L)
-+ Gtk.show_uri(Gdk.Screen(), link, 0L)
-
--gtk.about_dialog_set_email_hook(on_email)
--gtk.about_dialog_set_url_hook(on_url)
-+#Gtk.about_dialog_set_email_hook(on_email)
-+#Gtk.about_dialog_set_url_hook(on_url)
-
- TRANSLATORS = _("translator-credits")
-
--class AboutDialog(gtk.AboutDialog):
-+class AboutDialog(Gtk.AboutDialog):
- def __init__(self, parent = None):
-- gtk.AboutDialog.__init__(self)
-+ GObject.GObject.__init__(self)
- self.set_icon_from_file(common.APP_ICON)
-
- self.set_name(common.APPNAME)
- self.set_version(common.APPVERSION)
- self.set_copyright(common.COPYRIGHTS)
-- self.set_logo(gtk.gdk.pixbuf_new_from_file(common.APP_ICON))
-+ self.set_logo(GdkPixbuf.Pixbuf.new_from_file(common.APP_ICON))
- self.set_translator_credits(TRANSLATORS)
- self.set_license(common.LICENSE)
- self.set_website(common.WEBSITE)
-Index: radiotray/src/lib/i18n.py
-===================================================================
---- radiotray.orig/src/lib/i18n.py
-+++ radiotray/src/lib/i18n.py
-@@ -12,7 +12,8 @@ try:
- from gettext import gettext as _, ngettext
- gettext.install(program, unicode=True)
- gettext.textdomain(program)
-- locale.textdomain(program)
-+ if hasattr(locale, 'textdomain'):
-+ locale.textdomain(program)
-
- def C_(ctx, s):
- """Provide qualified translatable strings via context.
-Index: radiotray/src/lib/utils.py
-===================================================================
---- radiotray.orig/src/lib/utils.py
-+++ radiotray/src/lib/utils.py
-@@ -20,15 +20,15 @@
- from os.path import exists, join
-
- try:
-- import pygtk
-- pygtk.require("2.0")
-+ import gi
-+ gi.require_version("Gtk", "3.0")
- import dbus
- import dbus.service
- except:
- pass
-
- try:
-- import gtk
-+ from gi.repository import Gtk
- except ImportError, e:
- print str(e)
- raise SystemExit
-@@ -36,7 +36,7 @@ except ImportError, e:
-
- def load_ui_file(name):
- import common
-- ui = gtk.Builder()
-+ ui = Gtk.Builder()
- ui.add_from_file(join(common.DEFAULT_CFG_PATH, name))
- return ui
-
-Index: radiotray/src/radiotray.py
-===================================================================
---- radiotray.orig/src/radiotray.py
-+++ /dev/null
-@@ -1,42 +0,0 @@
--#!/usr/bin/env python
--# -*- coding: utf-8 -*-
--
--import dbus
--import sys, os, string
--from RadioTray import RadioTray
--from dbus import DBusException
--from dbus.mainloop.glib import threads_init
--
--threads_init()
--current_path = os.path.realpath(__file__)
--basedir = os.path.dirname(os.path.realpath(__file__))
--if not os.path.exists(os.path.join(basedir, "radiotray.py")):
-- if os.path.exists(os.path.join(os.getcwd(), "radiotray.py")):
-- basedir = os.getcwd()
--sys.path.insert(0, basedir)
--os.chdir(basedir)
--
--def main(argv):
-- if(len(argv) == 1):
-- print "Trying to load URL: " + argv[0]
--
-- try:
-- bus = dbus.SessionBus()
-- radiotray = bus.get_object('net.sourceforge.radiotray', '/net/sourceforge/radiotray')
--
--
-- if argv[0] == '--config':
-- print "Radio Tray already running."
-- else:
-- print "Setting current radio through DBus..."
--
-- playUrl = radiotray.get_dbus_method('playUrl', 'net.sourceforge.radiotray')
-- playUrl(argv[0])
--
-- except DBusException:
-- RadioTray(argv[0])
-- else:
-- RadioTray()
--
--if __name__ == "__main__":
-- main(sys.argv[1:])
-Index: radiotray/src/radiotray_runner.py
-===================================================================
---- /dev/null
-+++ radiotray/src/radiotray_runner.py
-@@ -0,0 +1,42 @@
-+#!/usr/bin/env python2
-+# -*- coding: utf-8 -*-
-+
-+import dbus
-+import sys, os, string
-+from RadioTray import RadioTray
-+from dbus import DBusException
-+from dbus.mainloop.glib import threads_init
-+
-+threads_init()
-+current_path = os.path.realpath(__file__)
-+basedir = os.path.dirname(os.path.realpath(__file__))
-+if not os.path.exists(os.path.join(basedir, "radiotray.py")):
-+ if os.path.exists(os.path.join(os.getcwd(), "radiotray.py")):
-+ basedir = os.getcwd()
-+sys.path.insert(0, basedir)
-+os.chdir(basedir)
-+
-+def main(argv):
-+ if(len(argv) == 1):
-+ print "Trying to load URL: " + argv[0]
-+
-+ try:
-+ bus = dbus.SessionBus()
-+ radiotray = bus.get_object('net.sourceforge.radiotray', '/net/sourceforge/radiotray')
-+
-+
-+ if argv[0] == '--config':
-+ print "Radio Tray already running."
-+ else:
-+ print "Setting current radio through DBus..."
-+
-+ playUrl = radiotray.get_dbus_method('playUrl', 'net.sourceforge.radiotray')
-+ playUrl(argv[0])
-+
-+ except DBusException:
-+ RadioTray(argv[0])
-+ else:
-+ RadioTray()
-+
-+if __name__ == "__main__":
-+ main(sys.argv[1:])
diff --git a/04_gtk3_issues.patch b/04_gtk3_issues.patch
deleted file mode 100644
index d83120e5bd5d..000000000000
--- a/04_gtk3_issues.patch
+++ /dev/null
@@ -1,137 +0,0 @@
-Description: Fixing some GTK-3 troubles
- This patch fix some GTK-3 troubles founds
- under upstream repository.
-Forwarded: no
-Author: Arnaud Rébillout <elboulangero@gmail.com>
-Last-Update: 2015-10-18
-
---- radiotray.orig/data/plugins/HistoryPlugin.py
-+++ radiotray/data/plugins/HistoryPlugin.py
-@@ -20,6 +20,7 @@
- from events.EventSubscriber import EventSubscriber
- from events.EventManager import EventManager
- from Plugin import Plugin
-+from gi.repository import GLib
- from gi.repository import Gtk
- from lib import utils
- from lib.common import SYSTEM_PLUGIN_PATH, USER_PLUGIN_PATH
-@@ -36,9 +37,7 @@ class HistoryPlugin(Plugin):
-
-
-
-- def activate(self):
-- self.eventSubscriber.bind(EventManager.SONG_CHANGED, self.on_song_changed)
--
-+ def activate_gtk(self, data):
- if os.path.exists(os.path.join(USER_PLUGIN_PATH, "history.glade")):
- self.gladefile = utils.load_ui_file(os.path.join(USER_PLUGIN_PATH, "history.glade"))
- elif os.path.exists(os.path.join(SYSTEM_PLUGIN_PATH, "history.glade")):
-@@ -54,6 +53,9 @@ class HistoryPlugin(Plugin):
- #dic = { "on_close_clicked" : self.on_close_clicked}
- self.gladefile.connect_signals(self)
-
-+ def activate(self):
-+ self.eventSubscriber.bind(EventManager.SONG_CHANGED, self.on_song_changed)
-+ GLib.idle_add(self.activate_gtk, None)
-
- def on_song_changed(self, data):
-
-Index: radiotray/data/plugins/SleepTimerPlugin.py
-===================================================================
---- radiotray.orig/data/plugins/SleepTimerPlugin.py
-+++ radiotray/data/plugins/SleepTimerPlugin.py
-@@ -38,7 +38,7 @@ class SleepTimerPlugin(Plugin):
- self.cfgProvider = cfgProvider
- self.mediator = mediator
- self.tooltip = tooltip
-- self.menuItem = Gtk.CheckMenuItem(self.getName(), False)
-+ self.menuItem = Gtk.CheckMenuItem(self.getName())
- self.menuItem.connect('activate', self.on_menu)
- self.menuItem.show()
-
-Index: radiotray/src/SysTrayGui.py
-===================================================================
---- radiotray.orig/src/SysTrayGui.py
-+++ radiotray/src/SysTrayGui.py
-@@ -49,14 +49,14 @@ class SysTrayGui:
- self.radioMenu = Gtk.Menu()
-
- if not self.mediator.context.station:
-- self.turnOnOff = Gtk.MenuItem(_("Turned Off"), False)
-- self.turnOnOff2 = Gtk.MenuItem(_("Turned Off"), False)
-+ self.turnOnOff = Gtk.MenuItem(_("Turned Off"))
-+ self.turnOnOff2 = Gtk.MenuItem(_("Turned Off"))
- self.turnOnOff.set_sensitive(False)
- self.turnOnOff2.set_sensitive(False)
- else:
-- self.turnOnOff = Gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station, False)
-+ self.turnOnOff = Gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station)
- self.turnOnOff.set_sensitive(True)
-- self.turnOnOff2 = Gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station, False)
-+ self.turnOnOff2 = Gtk.MenuItem(_('Turn On "%s"') % self.mediator.context.station)
- self.turnOnOff2.set_sensitive(True)
-
- self.turnOnOff.connect('activate', self.handler.on_turn_on_off)
-@@ -75,14 +75,14 @@ class SysTrayGui:
- menu_item1.set_sensitive(self.provider.isBookmarkWritable())
-
- menu_item4 = Gtk.MenuItem(_("Reload Bookmarks"))
-- menu_item3 = Gtk.ImageMenuItem(Gtk.STOCK_ABOUT)
-- menu_item2 = Gtk.ImageMenuItem(Gtk.STOCK_QUIT)
-+ menu_item3 = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_ABOUT, None)
-+ menu_item2 = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_QUIT, None)
- self.menu.append(self.turnOnOff2)
- self.menu.append(separator)
- self.menu.append(menu_item1)
-
- # plugins sub-menu
-- menu_plugins_item = Gtk.MenuItem("Plugins", False)
-+ menu_plugins_item = Gtk.MenuItem("Plugins")
- self.menu_plugins = Gtk.Menu()
- menu_plugins_item.set_submenu(self.menu_plugins)
- menu_item5 = Gtk.MenuItem(_("Configure Plugins..."))
-@@ -112,7 +112,7 @@ class SysTrayGui:
-
- self.menu.show_all()
-
-- self.icon = Gtk.status_icon_new_from_file(APP_ICON_OFF)
-+ self.icon = Gtk.StatusIcon.new_from_file(APP_ICON_OFF)
- self.icon.set_tooltip_markup(_("Idle (vol: %s%%)") % (self.mediator.getVolume()))
- self.icon.connect('button_press_event', self.button_press)
- self.icon.connect('scroll_event', self.handler.scroll)
-@@ -121,7 +121,7 @@ class SysTrayGui:
- def button_press(self,widget,event):
-
- if(event.button == 1):
-- self.radioMenu.popup(None, None, Gtk.status_icon_position_menu, 0, event.get_time(), widget)
-+ self.radioMenu.popup(None, None, Gtk.StatusIcon.position_menu, widget, 0, event.get_time())
- elif (event.button == 2):
- if (self.mediator.getContext().state == 'playing'):
- self.mediator.stop()
-@@ -129,7 +129,7 @@ class SysTrayGui:
- if self.mediator.getContext().station:
- self.mediator.play(self.mediator.getContext().station)
- else:
-- self.menu.popup(None, None, Gtk.status_icon_position_menu, 2, event.get_time(), widget)
-+ self.menu.popup(None, None, Gtk.StatusIcon.position_menu, widget, 2, event.get_time())
-
-
- def update_radios(self):
-@@ -155,7 +155,7 @@ class SysTrayGui:
- new_user_data = None
-
- if group_name != 'root':
-- group = Gtk.MenuItem(group_name, False)
-+ group = Gtk.MenuItem(group_name)
- user_data.append(group)
- new_user_data = Gtk.Menu()
- group.set_submenu(new_user_data)
-@@ -172,7 +172,7 @@ class SysTrayGui:
- user_data.append(separator)
- separator.show()
- else:
-- radio = Gtk.MenuItem(radio_name, False)
-+ radio = Gtk.MenuItem(radio_name)
- radio.show()
- radio.connect('activate', self.handler.on_start, radio_name)
- user_data.append(radio)
diff --git a/PKGBUILD b/PKGBUILD
index 6e236ba7ec41..888cb12f3690 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,54 +1,33 @@
-# Maintainer: Jonathon Fernyhough <jonathon_at_manjaro_dot_org>
+# Maintainer: Jonathon Fernyhough <jonathon+at m2x.dev>
# Contributor: Yarema aka Knedlyk <yupadmin@gmail.com>
# Contributor: zoe <chp321 [at] gmail [dot] com>
pkgname=radiotray
pkgver=0.7.3
-pkgrel=13
-_commit=1717a0e8c143
+pkgrel=16
pkgdesc="An online radio streaming player that runs on a Linux system tray."
arch=(any)
url="https://radiotray.wordpress.com/"
license=(GPL)
-depends=('gstreamer' 'gst-plugins-base' 'gst-plugins-good' \
- 'python2-dbus' 'python2-gobject' 'python2-lxml' 'python2-notify' 'python2-xdg')
+depends=('dbus-python' 'gstreamer' 'gst-plugins-base' 'gst-plugins-good'
+ 'python-gobject' 'python-lxml' 'python-notify2' 'python-pyxdg')
+makedepends=('git')
optdepends=('gst-plugins-bad: extra codec support'
'gst-plugins-ugly: extra codec support'
'gst-libav: nonfree media decoding'
'libappindicator-gtk3: indicator applet support')
-provides=("${pkgname}")
-source=("${pkgname}-${pkgver}.tar.gz::https://bitbucket.org/carlmig/radio-tray/get/${pkgname}-${pkgver}.tar.gz"
- "encoding.patch"
- "02_compatibility_glib-2.41.patch"
- "03_upstream_repo.patch"
- "04_gtk3_issues.patch"
- "reduce-logging.patch")
-conflicts=(radiotray-hg radiotray-python3-git)
+source=(git+https://github.com/lubosz/radiotray.git#commit=0303ad6017a9a81caa71d046ef270ba6ebefed39
+ radiotray-gi.patch::https://github.com/lubosz/radiotray/pull/16.patch)
-sha256sums=('464c555b8d9278e918d3718f81a1c0cfa7d9a54018d1a2f6b04b33dc40ea825c'
- 'a73badc0ddbf726d3f554e328b8836883bf816751cd0dc2034795a03466cd2df'
- 'b6d1d7fe74be1ec2ecad653262111f509d6fd60b8e666eb5e15d7bcb21e7a58b'
- '04748958923e3c2cac8944700a0786d066ab17d8284155adf316adab78dd0c55'
- 'c67845683a6d7d63eb26bbefe3c06921e0e6cbc2a5cb32c58b47377fdeb83644'
- '231ec3fb848069cf909f704e0e129fd649a9f8955178fe5407c7457d94ab0663')
+b2sums=('SKIP'
+ 'e1944018119584495d480b74e745fb1ddd8d2e6c33d72b8f185bda406b680331e71549259ae7c2f3dd5c93631c2f3156df75d95376d00c07c4f40cfe6d48b81e')
prepare() {
- cd "${srcdir}/carlmig-radio-tray-${_commit}"
- patch -p1 < "${srcdir}/encoding.patch"
- patch -p1 < "${srcdir}/02_compatibility_glib-2.41.patch"
- patch -p1 < "${srcdir}/03_upstream_repo.patch"
- patch -p1 < "${srcdir}/04_gtk3_issues.patch"
- patch -p1 < "${srcdir}/reduce-logging.patch"
-}
-
-build() {
- cd "${srcdir}/carlmig-radio-tray-${_commit}"
- python2 setup.py bdist
+ cd $pkgname
+ patch -Np1 -i ../radiotray-gi.patch
}
package() {
- cd "${srcdir}/carlmig-radio-tray-${_commit}"
- tar xf "dist/${pkgname}-${pkgver}.linux-${CARCH}.tar.gz" -C "${pkgdir}"
- chown -R root: ${pkgdir}
+ cd $pkgname
+ python setup.py install --root="$pkgdir" --optimize=1
}
-
diff --git a/encoding.patch b/encoding.patch
deleted file mode 100644
index 0e2510187a93..000000000000
--- a/encoding.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -Naur radiotray-0.7.3/src/Context.py radiotray-0.7.3-new/src/Context.py
---- radiotray-0.7.3/src/Context.py 2012-04-02 23:54:38.000000000 +0200
-+++ radiotray-0.7.3-new/src/Context.py 2013-09-07 12:14:32.000000000 +0200
-@@ -40,9 +40,9 @@
- if(self.title and len(self.title) > 0 and self.artist and len(self.artist) > 0):
- return self.artist + " - " + self.title
- elif(self.title and len(self.title) > 0):
-- return self.title
-+ return self.title.encode('latin-1').decode('cp1251').encode('utf8')
- elif(self.artist and len(self.artist) > 0):
-- return self.artist
-+ return self.artist.encode('latin-1').decode('cp1251').encode('utf8')
- else:
- return 'Playing'
--
-\ No newline at end of file
-+
diff --git a/reduce-logging.patch b/reduce-logging.patch
deleted file mode 100644
index f2b9ee2c383d..000000000000
--- a/reduce-logging.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/RadioTray.py b/src/RadioTray.py
-index cc6eec2..77f738a 100644
---- a/src/RadioTray.py
-+++ b/src/RadioTray.py
-@@ -167,7 +167,7 @@ class RadioTray(object):
- def configLogging(self):
- # config logging
- self.logger = logging.getLogger('radiotray')
-- self.logger.setLevel(logging.DEBUG)
-+ self.logger.setLevel(logging.WARN)
- handler = logging.handlers.RotatingFileHandler(LOGFILE, maxBytes=2000000, backupCount=1)
- formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
- handler.setFormatter(formatter)