Creiamo un client RSS vocale – prima parte


python logoVi siete stancati di leggere i feed RSS? Bene, allora mettetevi comodi e lasciate che sia il computer a leggerli per voi :). L’idea è quella di ottenere i feed e di mandare l’output al sintetizzatore vocale, tutto questo a intervalli regolari.

In questo modo:

0) Timer/agente che avvia il feed reader.
1) Avvio feed reader.
2) Il feed reader avvia feed gatherer, che è lo script in python
che acquisisce le notizie.
3) L'output del feed gatherer va mandato al sintetizzatore.

Per questo motivo abbiamo biogno di alcuni programmi. Perciò scarichiamo dal nostro gestore di pacchetti python3, pyhton-feedparser ed espeak. Se usate Arch:

$ sudo pacman -Sy python3 python-feedparser espeak

ma dovrebbero esserci anche per tutte le altre distro.
Con python3 abbiamo a disposizione un linguaggio di programmazione ad alto livello, ad oggetti, interattivo ed interpretato. python-feedparser è la libreria che ci permetterà di fare la “magia”. Infine espeak è un sintetizzatore vocale da terminale.

Creiamo il feed gatherer. Apriamo il nostro editor preferito e creiamo un file chiamato feed_gather.py (py è l’estensione python):

$ nano feed_gather.py

Ispirandomi a questo codice ho modificato lo script per aggiungere alcune caratteristiche e toglierne altre. Ricordo che python3 non fa utilizzo di parentesi per raggruppare porzioni di codice, bensì utlizza l’indentazione.

#!/usr/bin/env python3

# Depends on python-feedparser

# Originale da http://bbs.archlinux.org/viewtopic.php?pid=1318777

# Modificato da Franco Masotti

# ver. 0.0

import argparse
import datetime
import feedparser
import time

# Feed array
FEED_URL_ARRAY = ['indirizzo_feed_0','indirizzo_feed_1']
# Intervallo in ore per la visualizzazione di informazioni di ogni feed.
INTERVAL_HR_FOREACH_FEED = [1,1]
# Ogni indice dei due array è corrispondente

# --DO NOT EDIT BELOW THIS LINE -- #

# dichiarazione variabili
# dichiarata una nuova lista
cutoff = []

# Convert time struct objects to datetime objects.
def ts_to_dt(ts):
 return datetime.datetime.fromtimestamp(time.mktime(ts))


# Main function to print out titles.
# Ed anche un po' di contenuti.
def main(args=None):

 # counter for cutoff list
 n = 0 
 # iterate feed array
 for i in FEED_URL_ARRAY:

  # stampa URL feed corrente
  print('~~ '+i+' ~~')
  # Load the feed.
  feed = feedparser.parse(i)

  # Get the current time.
  now = datetime.datetime.now()
		
  # Delta(now,interval) cioè now - INTERVAL
  # Appending a new element to list
  for i in INTERVAL_HR_FOREACH_FEED:
   cutoff.append (datetime.timedelta(hours=i))

  # Find all entries not older than the cutoff.
  for entry in feed.entries:
   ts = entry.published_parsed
   dt = ts_to_dt(ts)
   # Se ora corrente - delta_t (che è INTERVAL ore indietro)
   # <= Intervallo di INTERVAL ore, allora:
   if (now - dt) <= cutoff[n]:
    print(entry.title)
    print(entry.description) # aggiunta in modo che stampi un po' di contenuti

  # counter for cutoff list
  # incremento variabile usata in lista cutoff
  n = n + 1


# Run the main function when invoked as a script.
# This will catch keyboard interrupts (ctrl+c) and broken pipe errors.
if __name__ == '__main__':
 try:
  main()
 except (KeyboardInterrupt, BrokenPipeError):
  pass

Lo script supporta uno o più feed grazie all’utilizzo delle liste, che assomigliano ad array dinamici. Per impostare i vostri feed è sufficiente scrivere l’URL completo di ogni feed nella lista FEED_URL_ARRAY. Ad ogni feed deve essere associato un intervallo in ore in modo che vengano considerate solo le notizie NON pubblicate prima di tale intervallo. Qusto viene fatto con la lista INTERVAL_HR_FOREACH_FEED.

Notate che gli URL dei feed solo delimitati dal carattere “'” e che ogni campo della lista è separato da “,“. Altra cosa importante riguarda l’ordine degli URL rispetto a quello degli intervalli: deve essere il medesimo.

Arrivati a questo punto inseriamo i nostri valori nelle due liste e testiamo lo script. Per farlo non dimentichiamoci anche di aggiungere i permessi di lettura,scrittura ed esecuzione al file:

$ chmod 700 feed_gather.py
$ ./feed_gather.py

Se l’interprete non ci restituisce errori dopo qualche secondo avremo le nostre notizie stampate sul terminale. Se ciò non accade provate ad aumentare l’intervallo.

Qui c’è la seconda parte di questo articolo vedremo la parte “vocale” e la parte “timer”. Ciao.

Annunci

Un pensiero su “Creiamo un client RSS vocale – prima parte

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...