# -*- coding: iso-8859-1 -*-
#########################################################################################
#Il programma podcast si occupa del download di file mp3 da siti con apposito servizio
#Esso si compone di tre parti:
#La prima parte e' composta da un dizionario che scrive su un file di testo "podcast.txt"
#l'indirizzo e un nome per te significativo che lo identifica. Questo file vine letto come
# un dizionario dal quale estrarre attraverso il nome l'indirizzo web
#La seconda parte si occupa del download del file xml, contenete i dati relativi ai file mp3
#a cui viene assegnato il nome della data attuale (GG-MM-aaa)
#La terza parte scarica il file mp3 assegnandogli il nome seguendo la regola:
#	titolo-MP3.mp3 
import ConfigParser, os, sys, getopt, time, curses, curses.wrapper, commands
from threading import Thread
import feedparser
import urlgrabber
import urllib2
import urllib
import string
import os.path
from urlgrabber import urlgrab
import time
import datetime
from string import replace
import sys
from collections import defaultdict 
from operator import itemgetter




################################################
#La funzione DOWNLOAD si occupa di scaricare il file xml ed i file mp3
def DOWNLOAD(nome,chiave):
	dt = datetime.datetime.now()#calcola la data attuale
	print "stiamo scaricando da",nome,chiave,"\n"
	
	file_path = chiave+str(dt.day)+"-"+str(dt.month)+"-"+str(dt.year)#assegna il nome al file xml
	print file_path
	if os.path.isfile(file_path)==True:#se il file xml č stato scaricato 
		print "Il file xml e' stato giā scaricato\n"
		#file_path = "radio24-2024"
		infile = open(file_path,"r")#apre il file xml
	
    
 		
 		mp3(file_path,dt) #scarica gli mp3
	else:#se il file xml non c'č
		print "File xml non trovato...deve essere scaricato\n"
		urlgrabber.urlgrab(nome, filename=file_path) #scarica il file xml che abbia l'indirizzo asssociato al nome:nome
		mp3(file_path,dt)#scarica gli mp3
	
#####################
#La funzione mp3 si occupa della ricerca dei file mp3 presenti su internet
def mp3(nome,dt):
	print "il nome in mp3 vale=",nome
	url1 = open(nome,"r") #apre il file xml 
	d = feedparser.parse(url1)#splitta il file xml per ottenere le informazioni relative al podcast
	 
	for j in range(len(d.entries)):
					
				link = str(d.entries[j].enclosures[0].url)#inrizzo del podcast
				#title = str(d.entries[j].title)#titolo del podcast
				#print "Il titolo vale",title
				
				guid = str(d.entries[j].guid)
				print link,guid
				
				file_name = link.split('/')[-1]#determina un nome comprensibile per il file mp3
	
				#print "la lista vale",link[0]
				u = urllib2.urlopen(link)#scarica il file mp3
				MP3 = str(dt.day)+"-"+str(dt.month)+"-"+str(dt.year)#assegna il nome al file mp3
				title=nome#elimina spazi  
				
				titolo=title+"_"+MP3+".mp3" #assegna nome al file mp3
				print "Il titolo che e' assegnato e':=",titolo
				#########################CONTROLLA SE HAI O NON HAI IL FILE MP3 NEL DISCO
				
				if os.path.isfile(str(titolo))==True: #controlla se il file mp3 esiste
					print "Il file mp3 esiste\n"
					pass #se gli mp3 del podcast sono stati tutti scaricati esce
	
    				
				else: #altrimenti scarica i rimanenti
					print "File mp3 non trovato...deve essere scaricato\n"
					f = open(titolo, 'w')#apre in scrittura il file mp3
					meta = u.info()#ottiene informazioni sul file mp3
					file_size = int(meta.getheaders("Content-Length")[0])#calcola la dimensione del file mp3
					print "Downloading: %s Bytes: %0.2f Mb" % (titolo, (file_size%1024))#stampa informazioni sulla attuale dimensione del file
					
					###################Contiuna a calcolare la dimensione del file mp3
					file_size_dl = 0
					block_sz = 8192
					while True:
						buffer = u.read(block_sz)
						if not buffer:
							break
						file_size_dl += block_sz
						f.write(buffer)
						status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
						status = status + chr(8)*(len(status)+1)
						print status,
					################################################ fine del calcolo dimensione


#########INIZIA SEZIONE RELATIVA AI NOMI E AGLI INDIRIZZI DEL PODCAST######################################

def MostraDiz(dizionario):#TI MOSTRA TUTTI I PODCAST
	print "Ecco la lista dei podcast:\n\n"
	 
	#for x in sorted(dizionario.keys()):
	for x in dizionario.keys():	
		
		print x+":"+dizionario[x]#STAMPA NOME E INDIRIZZO DEL PODCAST
		print
		
def AggiungiParola(dizionario,indirizzo,nome):#PUOI AGGIUNGERE ULTERIORI PODCAST
	if dizionario.has_key(nome):#CONTROLLA SE HAI GIĀ QUEL PODCAST
		print "Podcast gia' presente nel dizionario\n"
	else:	
		dizionario[nome] = indirizzo#ASSEGNA IL NOME SCELTO DA TE ALL'INDIRIZZO

def SalvaDiz(dizionario,NomeFile):#SALVA NEL FILE DI TESTO LE INFORMAZIONI CHE GLI HAI PASSATO DI NOME ED INDIRIZZO 
	out_file = open(NomeFile,"w")
	for x in dizionario.keys():
		out_file.write(x+";"+dizionario[x]+"\n")
	out_file.close()




def CercaParola(dizionario,nome):#PER SCARICARE UN DETERMINATO PODCAST GLI DEVI PASSARE IL NOME (L'INDIRIZZO SAREBBE COMPLICATO)
	if dizionario.has_key(nome):#CONTROLLA SE IL NOME C'Č
		print nome+":"+dizionario[nome]
		DOWNLOAD(dizionario[nome],nome)#SE C'Č SCARICA IL PODCAST
	else:
		return nome+" non trovato\n"




def CaricaDiz(dizionario,NomeFile):#PRIMA DI TUTTO DEVE CARICARE IL FILE DI TESTO CONTENTE I DATI
	in_file = open(NomeFile,"r")#APRE IL FILE CON I DATI
	while 1:#FINCHE Č VERO
		in_line = in_file.readline()#LEGGE IL FILE LINEA PER LINEA
		if in_line == "":
			break
		in_line = in_line[:-1]
		[nome,indirizzo] = string.split(in_line,";")#DIVIDE OGNI RIGA IN DUE PARTI.IL NOME E L'INDIRIZZO SONO SEPARATI DA UN ;
		dizionario[nome] = indirizzo
	in_file.close()



def menu():#DEFINISCO UN SEMPLICE MENU
	print "\t---------Il tuo PODCAST------\n"
	print "\t Inserisci la scelta da fare\n"
	print "\t 1 Mostra i tuoi indirizzi di podcasting\n"
	print "\t 2 Aggiungi indirizzo\n"
	print "\t 3 Scarica i file\n"
	print "\t 4 Per chiudere il programma\n"
	

SceltaMenu = 0#GLI ASSEGNO UN VALORE INIZIALE AL MENU
menu()#RICHIMA LA FUNZIONE MENU

DizionarioDiz = {}#CREA IN MEMORIA UN DIZIONARIO VUOTO CHE POI VERRĀ RIEMPITO DA QUELLO PRESENTE NEL FILE DI TESTO podcast.txt
NomeFile="podcast.txt"


#scelta=input("Cosa vuoi fare?:")
CaricaDiz(DizionarioDiz,NomeFile)#CARICA IL DIZIONARIO
while SceltaMenu != 4:#tI PERMETTE DI FAR RIMANERE ATTIVO IL PROGRAMMA
	SceltaMenu = input("Menu (1-4):\n")
	if SceltaMenu == 1:
		MostraDiz(DizionarioDiz)
		
	elif SceltaMenu == 2:###DEVI AGGIUNGERE NUOVE VOCI AL FILE
		indirizzo=raw_input("Indirizzo del podcast=")#DEVI METTERCI L'INDIRIZZO DEL PODCAST (L'INDIRIZZO DEL FILE XML)
		nome=raw_input("Nome che identifica l'indirizzo=")#IL NOME CHE VUOI ASSEGNARE
		AggiungiParola(DizionarioDiz,indirizzo,nome)#SCRIVE NEL FILE podcast.txt
		SalvaDiz(DizionarioDiz,NomeFile)#SALVA IL FILE podcast.txt
	elif SceltaMenu ==3:#CERCA IL NOME CHE GLI HAI ASSEGNATO
		nome=raw_input("Nome del podcast:")
		CercaParola(DizionarioDiz,nome)
		
	elif SceltaMenu ==4:#esce dal programma
		pass
	else:
		 menu()#STAMPA IL MENU

