20/07/07

AppleScript Météo-France pour GeekTool et Growl

AppleScript (météo pour GeekTool et Growl)

Dans ce précédent billet : AppleScript Météo-France pour GeekTool, je m'initiais doucement à curl, bon, il est vrai à la réflexion qu'il n'y a rien de sorcier ; le plus complexe, à mon sens, étant de parser la source HTML pour y récupérer les informations pertinentes.

J'ai aussi essayé de corriger les défauts que j'énonçais à la fin du précédent billet, aussi, maintenant, le script se base sur les pages Prévisions ville de Meteo France, ce qui rend la configuration et l'utilisation du script beaucoup plus aisée.

Capture d'écran

capture d'écran notifications Growl, AppleScript (météo pour GeekTool)

Fonctionnement et utilisation

Le parsage de la source HTML est exclusivement effectué avec des AppleScript's text item delimiters, c'est sûrement sommaire ; mais, comme l'illustre la capture d'écran, la quantité d'information récupérée est somme toute assez satisfaisante.

Le script pourra être exécuté à intervalle régulier grâce à GeekTool, un rafraîchissement de 600 secondes est un minimum acceptable. Pour mémoire, la commande nécessaire à GeekTool :

osascript "/path/to/weather.scpt"

Le script ne prévoit aucune sortie sous forme de texte si tout s'est bien passé, voir le précédent billet pour quelques explications à ce sujet ; debug à true permet l'affichage de quelques informations sous cette forme :

Créteil (94)
20/07/07 18:09:05 : begin of weather.scpt
20/07/07 18:09:06 : end of weather.scpt

Ville et, date de début et de fin de script.

Si debug est à false, seules d'éventuelles erreurs seraient retournées.

weather.scpt

(*    
     weather.scpt
     HP <http://blogosx.jupiterii.com>
  
     updated Jul. 20, 2007
 *)
 
property LIEUID : "FR94028"
property myfolder : "/Users/path/to/folder"
 
property scriptName : "weather.scpt"
property empty : ""
 
--debug
property debug : true
 
on run
	growlregister(scriptName, "GeekTool")
	
	if debug then set begin to timestamp("begin of " & scriptName) & return
	
	set page to "http://www.meteofrance.com/FR/mameteo/prevVille.jsp?LIEUID=" & LIEUID
	set html to curl4content(page)
	
	if first word of html is not "curlbug" then
		try
			(* parse the result of curl4content *)
			
			--get img
			set img to string2get("<img src=\"/img/picto/gd/mf/", html, 2)
			set img to string2get("\"", img, 1)
			set wURL to "http://" & (string2get("/", page, 3)) & "/img/picto/cte/grd/" & img
			
			--ex: 'vendredi à 20h:Belles éclaircies' 
			set prev to string2get("<a href=\"#\" onMouseOver=\"showAlt('", html, 2)
			set prev to string2get("'", prev, 1)
			set prev to replaceString(prev, ":", " : ")
			
			--temp
			set mini to first word of (string2get("mini ", html, 2)) & "°"
			set maxi to first word of (string2get("maxi ", html, 2)) & "°"
			
			--add mini & maxi to prev
			set prev to prev & return & "mini : " & mini & " / maxi : " & maxi
			
			--title
			set title to string2get("<title>", html, 2)
			set title to string2get("</title>", title, 1)
			set title to string2get(":", title, 2)
			set title to (title & space & "(" & (item 3 of LIEUID) & (item 4 of LIEUID) & ")")
			
			--remove old pic and curl the new one (no string returned if property debug is false)
			rm2curl(myfolder, wURL)
			
			--notif
			makenotif(title, prev, LIEUID)
			--debug
			if debug then title & return & (begin) & timestamp("end of " & scriptName)
		on error bug
			beep
			--error displayed with some useful information
			return timestamp(((POSIX path of (path to me)) as string) & space & bug)
		end try
	end if
end run
 
--functions
 
on curl4content(page)
	try
		return do shell script "curl" & space & page & space & "| iconv -f 'iso-8859-1' -t 'macroman'"
	on error bug
		beep
		return "curlbug:" & return & bug
	end try
end curl4content
 
on replaceString(theText, oldString, newString)
	set text item delimiters to oldString
	set tempList to every text item of theText
	set text item delimiters to newString
	set theText to the tempList as string
	set text item delimiters to empty
	return theText
end replaceString
 
on string2get(delim, istring, pos)
	set text item delimiters to delim
	set temp to every text item of istring
	set text item delimiters to empty
	return ((item pos) of temp)
end string2get
 
on rm2curl(myfolder, wURL)
	global begin, scriptName, LIEUID
	try
		--remove old pic (try because no verification before)
		do shell script "rm " & quoted form of ((myfolder) & "/weather-" & LIEUID & ".gif")
	end try
	do shell script "curl " & quoted form of wURL & " >" & quoted form of ((myfolder) & "/weather-" & LIEUID & ".gif")
end rm2curl
 
on timestamp(output)
	return (do shell script "date '+%d/%m/%y'") & space & (time string of (current date)) & " : " & output
end timestamp
 
-- functions Growl related
 
on growlrunornot()
	tell application "System Events"
		set isRunning to ¬
			(count of (every process whose name is "GrowlHelperApp")) > 0
	end tell
end growlrunornot
 
on growlregister(myApp, appicon)
	if growlrunornot() then
		tell application "GrowlHelperApp"
			set the allNotificationsList to {"Notification"}
			set the enabledNotificationsList to {"Notification"}
			register as application myApp all notifications allNotificationsList ¬
				default notifications enabledNotificationsList ¬
				icon of application appicon
		end tell
	end if
end growlregister
 
on makenotif(mytitle, prev, LIEUID)
	global scriptName, myfolder
	
	if growlrunornot() then
		tell application "GrowlHelperApp"
			-- Send a Notification
			notify with name ¬
				"Notification" title ¬
				mytitle description ¬
				prev application name ¬
				scriptName image from location ¬
				"file://" & ((myfolder) & "/weather-" & LIEUID & ".gif")
		end tell
	end if
end makenotif

La propriété LIEUID s'obtient très facilement en visitant le site de Meteo France. Il faut renseigner myfolder pour choisir où (chemin) curl sauvegardera l'image… et c'est tout.

commenter (0)

20/07/07

À propos de multimédia en réseau...

réseau multimédias

J'ai d'abord monté un petit réseau domestique ; au début, essentiellement pour des raisons de praticité, bien avant d'envisager un côté ludique et récréatif à tout ceci.

Je me suis finalement dit que de pouvoir partager du contenu multimédia d'un poste à l'autre pouvait être une possibilité intéressante, encore faudrait-il éviter que les fichiers soient manipulés, déplacés, copiés, etc. En effet, ce sont des manipulations inutiles et génératrice de perte de temps, si l'on considère qu'ils sont déjà rangés et classés sur un ordinateur (le Poste 1, sur ce schéma), pour ensuite les manipuler afin de les déplacer vers le 2ème ordinateur.

quelques soucis…

Sur ce, j'ai eu un premier souci : la lecture avec VLC VideoLAN de fichiers hébergés sur un disque réseau AFP s'est avérée assez décevante en utilisant les réglages par défaut de cette application… la modification des préférences avancées relatives aux caches n'y changeant rien ou presque. Dans le même temps, QuickTime et NicePlayer lisaient parfaitement les mêmes fichiers, sans devoir se livrer à la moindre geekerie.

Les soucis rencontrés n'étaient, semble-t-il, donc pas inhérents à la qualité du réseau (matériel, débit, configuration, ou que sais je !?) ; d'autant plus que pour ce faire, c'est le réseau câble Ethernet qui est essentiellement utilisé. Le Wi-Fi, quant à lui utilisé sur une distance de 2 à 3 mètres, ne saurait non plus justifier les désagréments rencontrés lors de l'utilisation d'un seul logiciel (contre 3 autres qui lisent parfaitement les mêmes fichiers volumineux hébergés sur le même disque distant, au même moment et depuis le même ordinateur !)…

puis, ça ne marchait pas si mal, mais…

Équipé d'un lecteur multimédia comme NicePlayer c'était sympa ; sans plus… devoir chercher les fichiers récents dans un ou plusieurs dossiers, en navigant éventuellement au sein d'arborescences… ce n'est pas forcément ce qu'il de plus convivial et pratique, surtout quand, ce n'est pas vous qui en êtes l'auteur. Imaginons donc ce genre de questions : Grrrr ! mais où sont donc ces nouveaux épisodes de Dr House dont tu viens de me parler ?

enfin Miro est arrivé !

Il suffit alors, de s'équiper de Miro, puis de rapidement le configurer pour surveiller un dossier (ou plus). Ainsi, tout contenu nouveau ajouté à ce(s) dossier(s) sera signalé, classé et, surtout, facilement accessible. La gestion de contenu devenant alors très intuitive, similaire à ce que l'on peut connaître et apprécier dans iTunes ou un agrégateur.

Et finalement, les fichiers pourront être lus depuis le disque réseau ; Miro considère ces fichiers comme étant des fichiers locaux et ne les télécharge donc pas.

Pour ne rien gâcher, l'interface du logiciel est parfaitement intégrée dans un environnement Aqua ; seule ombre au tableau : il manque le support de l'Apple Remote.

commenter (0)