Freemeteo from screenlets-dev ppa (bump version to 0.4.6)

Το FreemeteoWeatherScreenlet «πηδάει» στην έκδοση 0.4.6 και μπορείτε πλέον να το εγκαταστήσετε και από το screenlets ppa (οδηγίες) ως ξεχωριστό πακέτο όπως είναι πλέον η νέα πολιτική των screenlets. Κάποια θα υπάρχουν ως main screenlets στην έκδοση 0.1.3 (πολύ πιθανό σε αυτά να συμπεριλαμβάνεται και το freemeteo) και τα υπόλοιπα ως ξεχωριστά deb πακέτα. Η έκδοση 0.4.6 συμπεριλαμβάνει κώδικα από τον Guido Tabbernuk (κυρίως για background με rounded corners και threading) όπως επίσης και τα δικά μου fixes των τελευταίων ημερών.

Για όσους δε χρησιμοποιούν ubuntu μπορείτε να το κατεβάσετε και από το gnome-look .

Freemeteo update to 0.2.2

Τις τελευταίες μέρες το screenlet σταμάτησε να λειτουργεί μιας και «κοβόταν» από το freemeteo εξαιτίας του user-agent που έστελνε (User-Agent: Python-urllib/1.17). Στην έκδοση 0.2.2 αυτό διορθώθηκε και συνεπώς το screenlet λειτουργεί και πάλι, επίσης προστέθηκαν και κάποια ακόμη icon codes για συνθήκες νυχτερινής ομίχλης που λείπανε στις προηγούμενες εκδόσεις.

Ως συνήθως μπορείτε να κατεβάσετε τη νέα έκδοση από : http://gnome-look.org/content/download.php?content=119253&id=1&tan=28535605

Freemeteo Weather Screenlet [NEW Version] 0.2

Χτές εμφανίστηκε ένα «άγνωστο» εικονίδιο για τον καιρό της Ορεστιάδας στο screenlet που σημαίνει ότι δεν είχα συμπεριλάβει κάποιους κωδικούς εικονιδίων που χρησιμοποιεί το Freemeteo. Ψάχνοντάς το βρήκα ότι ήταν τα εικονίδια που αφορούν την ομίχλη, οπότε ήταν ευκαιρία να προσθέσω τους κατάλληλους κωδικούς και να κάνω και τις αλλαγές που είχα στη TODO list για τη 0.2 έκδοση του screenlet. Ποιές είναι αυτές μπορείτε να δείτε στη λίστα αλλαγών που παρατίθεται:

Changelog

Version 0.2

[-]Default language is ‘English’
[-]Time now defaults to PC’s time and has added an option to use City local time (needs python timezone module: pytz.
If not installed a message box will popup!)
[-]Added Units (metric – celsius or english – Fahrenheit) selection (Defaults to ‘Metric’)
[-]Added tooltips and messages regarding the zip code and how to get it from freemeteo.com
[-]Renamed ‘tray icon’ to ‘Toggle Forecast Icon’
[-]Added missing icon codes for foggy coditions

Version 0.1

[-] INITIAL VERSION
Changes from WideScape Screenlet:
[-]Uses Freemeteo.com instead of weather.com
[-]Shows detailed weather description via right click > Forecast Description
[-]Uses text for Daynames
[-]Show min temperature values
[-]Translated in 21 languages (Cityname / daynames / weather description)
[-]Use selected city’s local time (needs pytz module)

και μερικές εικόνες που αφορούν τη νέα έκδοση:

Όπως πάντα μπορείτε να κατεβάσετε τη νέα έκδοση από το http://www.gnome-look.org/content/show.php/Freemeteo+Weather+Screenlet?content=119253

ή απευθείας πατώντας εδώ.

Ελληνικοί Ραδιοφωνικοί σταθμοί στο RadioScreenlet

Ασχόλούμενος με το Freemeteo Weather Screenlet το τελευταίο καιρό, έπεσε το μάτι μου στο Radio Screenlet που υπάρχει στη default εγκατάσταση των screenlets! Είναι πολύ ωραίο και λειτουργικό αλλά μαντέψτε τι δεν έχει…! Ελληνικούς σταθμούς! Αν είναι δυνατόν.

Με μικρές λοιπόν τροποποιήσεις του eradio script πρόσθεσα τις διευθύνσεις για τους ελληνικούς σταθμούς και το αποτέλεσμα είναι το εξής:

Τι πρέπει να κάνετε;

1. Κατεβάστε το αρχείο menu.xml [1] από εδώ ΜΕ ΔΕΞΙ ΚΛΙΚ > Save As…

2. Στο κατάλογο που το κατεβάσατε ανοίξτε μια κονσόλα και πληκτρολογείστε:

sudo mv /usr/share/screenlets/Radio/menu.xml /usr/share/screenlets/Radio/menu.xml.bak
sudo mv menu-xml.jpg /usr/share/screenlets/Radio/menu.xml

3. Ξεκινίστε[2] το RadioScreenlet

*Αν ήδη χρησιμοποιείτε το RadioScreenlet κάντε πάνω σε αυτό δεξί κλικ > Delete screenlet και ξεκινήστε το ξανά!

[1]. To αρχείο menu-xml.jpg ΔΕΝ είναι εικόνα αλλά xml αρχείο με πραγματικό όνομα menu.xml απλά δε βρήκα άλλο τρόπο να το ανεβάσω στο wordpress. Αν κάποιος γνωρίζει κάποιο trick ας γράψει ένα σχόλιο…

Freemeteo Weather Screenlet 0.1

Οι περισσότεροι απο μας έχουμε κάπου στη επιφάνεια εργασίας κάποιο applet που δείχνει πληροφορίες για τον καιρό. Για μένα το applet αυτό δεν ήταν ποτέ όπως το ήθελα. Δεν έβρισκα τη περιοχή μου στο weather.com, δε παρείχε περιγραφή καιρού, δεν ήταν στα ελληνικά, δεν δεν δεν…

Μετά το script του eradio λοιπον και για να εξασκήσω όσα έμαθα για τις regular expression της Python είπα να δοκιμάσω να φτιάξω ένα καλύτερο (για μένα τουλάχιστον) screenlet χρησιμοποιώντας το Freemeteo.com το οποίο είναι ένα site που παρέχει πληροφορίες καιρού παγκοσμίως για οποιαδήποτε περιοχή!

Μερικές εικόνες από το Freemeteo Weather Screenlet είναι οι ακόλουθες:

Σε πλήρη μορφή:

Συμπαγής μορφή (με διπλό κλίκ):

Η αναλυτική περιγραφή του καιρού:

Οι βασικές ρυθμίσεις:

Ίσως να παρατηρήσατε το Select language… Μπορείτε να διαλέξετε 21 γλώσσες! Τι αλλάζει; Το πως εμφανίζεται η πρόγνωση του καιρού και οι μέρες τις εβδομάδας! Δείτε τις ακόλουθες εικόνες:

Και μια λεπτομέρεια: Άν επιλέξετε κάποια περιοχή άλλης χώρας τότε η ώρα που θα δείχνει το screenlet θα είναι η τοπική ώρα της περιοχής εκείνης και όχι του υπολογιστή σας!

Τέλος οσον αφορά το τι θα βρείτε στο δεξί κλικ:

Το ZIP Code είναι ο κωδικός της περιοχής σας που πρέπει να τον βρείτε πηγαίνοντας στο freemeteo.com:

Μπορείτε να κατεβάσετε το screenlet: από το gnome-look: http://www.gnome-look.org/content/show.php/Freemeteo+Weather+Screenlet?content=119253

ή απευθείας πατώντας εδώ.

Επιπλέον χρειάζεται* να έχετε εγκετεστημένο το python module pytz. Στο Ubuntu:

sudo apt-get install python-tz

EDIT 30/1/10: Τη πρώτη φορά που θα ξεκινήσετε το screenlet φροντίστε να επιλέξετε γλώσσα από το δεξί κλικ Properties > Options > Weather

Για εγκατάσταση απλά αποσυμπιέστε το αρχείο στο ~/.screenlets/

*Σε επόμενη έκδοση (0.2) θα είναι προαιρετική επιλογή το να δείχνει local timezone οπότε αν κάποιος ενεργοποιήσει τη δυνατότητα αυτή θα εμφανίζεται μύνημα αν τυχόν χρειάζεται η εγκατάσταση του παραπάνω module. Επιπλέον θα υπάρχει προεπιλογή στη γλώσσα -τα Αγγλικά.

EDIT 19/2/10: Βγήκε η έκδοση 0.2 Διαβάστε για αυτήν στο https://emnik.wordpress.com/2010/02/19/freemeteo-weather-screenlet-new-version-0-2/

VOIP + TORRENTS + BANDWIDTH – How to solve with python!

Το παρακάτω δεν είναι προς γενική χρήση, μιας και αναφέρεται σε πολύ συγκεκριμένο configuration (το δικό μου! :-)) Παρόλα αυτά να τι μπορεί να κάνει κάποιος με λίγη python.

Το δίκτυο του σπιτιού μου περιλαμβάνει τα εξής: Ένα δικτυακό σκληρό δίσκο της Wedstern Digital (My Book World Edition II – Blue rings) ο οποίος τρέχει μια έκδοση linux και εκτός των άλλων τρέχει και το transmission για κατέβασμα torrents, και ένα voip ΑΤΑ adapter της linksys (Sipura SPA 1001) πάνω στο οποίο συνδέεται μια ασύρματη απλή τηλεφωνική συσκευή για voip κλήσεις μέσω της omnivoice.

Το πρόβλημα είναι το συνηθισμένο: Έχω ADSL Connx 2MBs με αποτέλεσμα όταν κατεβάζω torrents από το transmission του MyBook να έχω πολλές διακοπές κατά τη διάρκεια voip κλήσης.

Η λύση που ακολουθεί: Ένα σκιπτάκι με python που:

  • να ελέγχει αν το τηλέφωνο είναι σε κατάσταση ομιλίας ή κλειστό, ανά κάποια δευτερόλεπτα.
  • αν πράγματι είναι σε κατάσταση ομιλίας, να κάνει pause όλα τα torrents του transmission, αλλιώς να τα κάνει resume.
  • ΠΡΟΑΙΡΕΤΙΚΑ να τρέχει στο background ως δαίμονας
  • ΠΡΟΑΙΡΕΤΙΚΑ να χρησιμοποιεί το dbus για να επικοινωνει με ένα screenlet γραμμένο για να εμφανίζει πληροφορίες περι των διεργασιών που λαμβάνουν χώρα…
  • ΠΡΟΑΙΡΕΤΙΚΑ να χρησιμοποιεί το notification (python) api του gnome για να εμφανίζει το ξεκίνημα και σταμάτημα του δαίμονα!

Για το script χρησιμοποιήθηκαν οι ακόλουθες βιβλιοθήκες (python modules) ανοικτού κώδικα:

  1. Daemonize

Το script (transipd.py daemon) είναι το ακόλουθο:

#!/usr/bin/env python
'''
    This program 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 3 of the License, or
    (at your option) any later version.

    This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

    Copyright (C) 2010 Nikiforakis Manos (nikiforakis.m@gmail.com)
'''

import urllib
from subprocess import call
import pynotify
import re
import gobject
import dbus
import dbus.service
import dbus.mainloop.glib

#set sipura's ip address
SIPURA_IP = '192.168.x.y'

#set transmission's options
TRANSMISSION_IP='192.168.x.z'
TRANSMISSION_PORT='9091'
TRANSMISSION_USER='transmission-username'
TRANSMISSION_PWD='transmission-password'
class transmission():
	def __init__(self, ip=TRANSMISSION_IP, port=TRANSMISSION_PORT, user=TRANSMISSION_USER, passwd=TRANSMISSION_PWD):
		self.ip=ip
		self.port=port
		self.user=user
		self.passwd=passwd

	def transcmd(self, state):
		cmd=[]
		cmd.append('transmission-remote')
		cmd.append(self.ip)
		cmd.append('-p')
		cmd.append(self.port)
		cmd.append('-n')
		cmd.append(self.user + ':' + self.passwd)
		cmd.append('-t all')
		cmd.append('-' + state)
		return cmd

def notify(message=""):
    n = pynotify.Notification("transipd daemon says:", message, "dialog-info") #other options are 'dialog-warning'
    n.set_urgency(pynotify.URGENCY_CRITICAL) #other options are URGENCY_LOW, URGENCY_NORMAL
    n.show()

class DBUS_Object(dbus.service.Object):

	@dbus.service.method("com.daemon.transipInterface",
                         in_signature='s', out_signature='as')
	def SipuraStatus(self, message):
		pass
	        return prevmode

	@dbus.service.method("com.daemon.transipInterface",
        	                 in_signature='', out_signature='')
	def Exit(self):
		notify("daemon stopped")
        	mainloop.quit()

def check():
	global prevmode
	if sipura_hook_state()=='On': #phone idle
		if prevmode=='dial':
			print 'The phone changed from dial mode to idle'
			print 'Resuming all torrents...'
			call(d.transcmd('s'))
			prevmode='idle'
		else:
			print 'The phone is idle - Nothing to do!'
	else:
		if prevmode=='idle':
			print 'The phone is currently in dial mode'
			print 'Pausing all torrents...'
			call(d.transcmd('S'))
			prevmode='dial'
		else:
			print 'The phone is still in dialing mode - Nothing to do!'
	return True

def sipura_hook_state():

	#build sipura's url
	sipura_url=[]
	sipura_url.append('http://')
	sipura_url.append(SIPURA_IP)

	#open sipura's url and read the html code
	f = urllib.urlopen(''.join(sipura_url))
	s = f.read()
	f.close()

	get_hookstate=re.compile('On|Off')
	state = get_hookstate.findall(s)

	return state[0]

def main():
	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
	session_bus = dbus.SessionBus()
	name = dbus.service.BusName("com.daemon.transipService", session_bus)
	object = DBUS_Object(session_bus, '/TransipScreenlet')

	global d
	d = transmission()
	global prevmode
	prevmode='idle' #Initialisation of the previous dial mode 

	gobject.timeout_add(4000, check)

	notify("daemon initialized")
	global mainloop
	mainloop = gobject.MainLoop()
	mainloop.run()

pynotify.init("transip daemon")
import daemonize
daemonize.start(main, debug=True)
#main()

και ο κώδικας του screenlet:

#!/usr/bin/env python

# This application is released under the GNU General Public License
# v3 (or, at your option, any later version). You can find the full
# text of the license under http://www.gnu.org/licenses/gpl.txt.
# By using, editing and/or distributing this software you agree to
# the terms and conditions of this license.
# Thank you for using free software!

#TransipScreenlet (c) Nikiforakis Manos nikiforakis.m@gmail.com 

import screenlets
from screenlets.options import FloatOption, BoolOption, StringOption, FontOption, ColorOption, IntOption
from screenlets import Plugins
import cairo
import pango
import gobject
import urllib
import dbus
from subprocess import call
import os

HOME_DIR = os.path.expanduser("~")

class TransipScreenlet(screenlets.Screenlet):
	"""A Screenlet that communicates with transip daemon through dbus calls"""

	# default meta-info for Screenlets
	__name__ = 'TransipScreenlet'
	__version__ = '0.1'
	__author__ = 'Nikiforakis Manos (c) 2009'
	__desc__ = 'A Screenlet that communicates with transip daemon through dbus calls'

	font_color = (1,1,1, 0.8)
	background_color = (0,0,0, 0.8)
	hstate = "Please right click to start transip daemon..."
	prevstate = ''
	stopd = True
	def __init__(self, **keyword_args):
		screenlets.Screenlet.__init__(self, width=200, height=50,uses_theme=True, **keyword_args) 

		self.theme_name = "default"

                self.add_options_group('Options',
                        'The Options widget settings')
		self.add_option(ColorOption('Options','font_color',
			self.font_color, 'Text color', 'font_color'))
		self.add_option(ColorOption('Options','background_color',
			self.background_color, 'Back color(only with default theme)', 'only works with default theme'))

		#self.__timeout = gobject.timeout_add(3000, self.update)

	def __setattr__(self, name, value):
		# call Screenlet.__setattr__ in baseclass (ESSENTIAL!!!!)
		screenlets.Screenlet.__setattr__(self, name, value)

	def on_init (self):
		print "Screenlet has been initialized."
		# add custom menuitems
		self.add_menuitem("stopdaemon","Stop the daemon")
		self.add_menuitem("startdaemon","Start the daemon")
		# add default menuitems
		self.add_default_menuitems()
		#start transip daemon via subprocess
		#call(HOME_DIR + '/.screenlets/Transip/transipd.py')
		#set the dbus interface
		#self.set_dbus()

	def set_dbus(self):
		bus = dbus.SessionBus()
		remote_object = bus.get_object("com.daemon.transipService",
                                     "/TransipScreenlet")
		global iface
		iface = dbus.Interface(remote_object, "com.daemon.transipInterface")

	def update (self):
		if self.stopd==True:
			return False
		else:
			self.hstate = self.check_dbus()
			if self.prevstate == self.hstate:
				pass
			else:
				self.prevstate = self.hstate
				self.redraw_canvas()
			return True # keep running this event	

	def check_dbus(self):
		a=iface.SipuraStatus('')
		return ''.join(a)

	def on_draw(self, ctx):
		ctx.scale(self.scale, self.scale)
		ctx.set_operator(cairo.OPERATOR_OVER)
		if self.theme:
			self.theme.render(ctx,'background')
			ctx.set_source_rgba(*self.background_color)
			if self.theme_name == 'default':self.draw_rounded_rectangle(ctx,0,0,6,200,40)
			ctx.set_source_rgba(1, 1, 1, 1)
			ctx.set_source_rgba(*self.font_color)
			if self.hstate=='idle':
				self.draw_text(ctx,'Voip Status : '+self.hstate+'\nAll Torrents Resumed',4,10, 'FreeSans',10, self.width,allignment = pango.ALIGN_LEFT)
			elif self.hstate=='dial':
				self.draw_text(ctx,'Voip Status : '+self.hstate+'\nAll Torrents Paused',4,10, 'FreeSans',10, self.width,allignment = pango.ALIGN_LEFT)
			else:
				self.draw_text(ctx,'Voip Status : '+self.hstate,4,10, 'FreeSans',10, self.width,allignment = pango.ALIGN_LEFT)
			try:self.theme.render(ctx,'glass')
			except:pass

	def on_draw_shape(self,ctx):
		ctx.rectangle(0,0,self.width,self.height)
		ctx.fill()
		self.on_draw(ctx)

	def menuitem_callback(self, widget, id):
		screenlets.Screenlet.menuitem_callback(self, widget, id)
		if id == "stopdaemon":
			iface.Exit()
			self.stopd=True
			self.hstate='transip daemon not running...'
			self.redraw_canvas()
		elif id == 'startdaemon':
			call(HOME_DIR + '/.screenlets/Transip/transipd.py')
			self.set_dbus()
			self.stopd = False
			self.prevstate = ''
			self.__timeout = gobject.timeout_add(3000, self.update)

	def on_quit(self):
		if self.stopd == False:
			iface.Exit()
		return True

if __name__ == "__main__":

	import screenlets.session
	screenlets.session.create_session(TransipScreenlet)