#!/usr/bin/python

# Arte+7 Downloader
# Usage: > python arte7.py
# Double Click an Item in the list to show details
# You can play the item in your favourite video player (By default vlc is used)
# to change the player change line 252, replace vlc by gnome-open (to use the default gnome player for video streams)
#
# http://www.williambrownstreet.net
#
# Streaming and recording Arte+7 Videos


import gtk
import urllib
import xml.dom.minidom
import urllib2
import string
import StringIO
import Image
import html2text
import os

class PyApp(gtk.Window): 
    def __init__(self):
        super(PyApp, self).__init__()
        
        self.set_size_request(550, 250)
        self.set_position(gtk.WIN_POS_CENTER)
        self.set_border_width(8)
        self.connect("destroy", gtk.main_quit)
        self.set_title("Arte+7")

	
        vbox = gtk.VBox(False, 8)
        
        sw = gtk.ScrolledWindow()
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        
        vbox.pack_start(sw, True, True, 0)

        store = self.create_model()

        treeView = gtk.TreeView(store)
        treeView.connect("row-activated", self.on_activated)
        treeView.set_rules_hint(True)
        sw.add(treeView)

        self.create_columns(treeView)
        self.statusbar = gtk.Statusbar()
        
	
        vbox.pack_start(self.statusbar, False, False, 0)

        self.add(vbox)
        self.show_all()


    def create_model(self):
        store = gtk.ListStore(str, str, str, str, str)
	pre = "http://plus7.arte.tv"
	arte = urllib.urlopen(pre)
	site = arte.read()
	split = site.rpartition("xmlURL")[2]
	almost = split.split(");")[0]
	linkxml = almost[4:-1]

	xmldoc = xml.dom.minidom.parse(urllib.urlopen(pre+linkxml))
	videolist = xmldoc.firstChild
	videolist = videolist.getElementsByTagName('video')
	targetlist = []
	for vid in videolist:
		title = vid.getElementsByTagName('title')
		start = vid.getElementsByTagName('startDate')
		offline = vid.getElementsByTagName('offlineDate')
		url = vid.getElementsByTagName('targetURL')
		picurl = vid.getElementsByTagName('previewPictureURL')
		store.append([title[0].firstChild.data, start[0].firstChild.data.split('T')[0],offline[0].firstChild.data, url[0].firstChild.data, picurl[0].firstChild.data])

	return store


    def create_columns(self, treeView):
    
        rendererText = gtk.CellRendererText()
        column = gtk.TreeViewColumn("Title", rendererText, text=0)
        column.set_sort_column_id(0)    
        treeView.append_column(column)
        
        rendererText = gtk.CellRendererText()
        column = gtk.TreeViewColumn("Online Since", rendererText, text=1)
        column.set_sort_column_id(1)
        treeView.append_column(column)

        rendererText = gtk.CellRendererText()
        column = gtk.TreeViewColumn(" Online Until", rendererText, text=2)
        column.set_sort_column_id(2)
        treeView.append_column(column)

        rendererText = gtk.CellRendererText()
        column = gtk.TreeViewColumn("URL", rendererText, text=3)
        column.set_sort_column_id(3)
	column.set_property('visible', False)
        treeView.append_column(column)

	rendererText = gtk.CellRendererText()
        column = gtk.TreeViewColumn("pic", rendererText, text=4)
        column.set_sort_column_id(4)
	column.set_property('visible', False)
        treeView.append_column(column)

    def on_activated(self, widget, row, col):
        
        model = widget.get_model()
        text = model[row][0] + ", " + model[row][1] + ", " + model[row][2]
        self.statusbar.push(0, text)
	print model[row][3]
	tmp = urllib.urlopen(model[row][3])
	vidpage = tmp.read()
	descriptiontmp = vidpage.rpartition('<p class="text">')[2]
	description = descriptiontmp.rpartition('<p class="info">')[0]
	
	info_window = gtk.Window()
	info_window.set_size_request(400, 450)
	info_window.set_position(gtk.WIN_POS_CENTER)
        info_window.set_border_width(8)
        info_window.connect("destroy", info_window.destroy)
        info_window.set_title(model[row][0])
	box1 = gtk.VBox(False, 0)

	tit = gtk.Label(model[row][0])
	tit.set_markup('<b>'+model[row][0]+'</b>'+' du '+model[row][1])
	tit.set_alignment(0, 0)
	tit.show()
	box1.pack_start(tit, False, False,0)
	
	box2 = gtk.HBox(False, 0)
	image = gtk.Image()
	opener1 = urllib2.build_opener()
	im = opener1.open(model[row][4]).read()
	pic = Image.open(StringIO.StringIO(im))
	pixbuf = image_to_pixbuf(pic)
	image.set_from_pixbuf(pixbuf)
	image.show()
	box2.pack_start(image)

	frame = gtk.Frame("Description") 
	description.replace('\n', '')
	description.replace('<br/>', '\n')
	description.replace('<br />', '\n')
	desc = gtk.Label(strip_ml_tags(description))
	
	desc.set_justify(gtk.JUSTIFY_FILL)
	desc.set_line_wrap(True)
	desc.set_size_request(340, 350)
	desc.set_alignment(0,0)
	frame.show()
	sw = gtk.ScrolledWindow()
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        
        sw.add_with_viewport(desc)
	sw.show()
	frame.add(sw)
	box1.pack_start(box2, False, False, 0)
	box1.pack_start(frame, True, False, 0)
	info_window.add(box1)
	
	#buttons
	boxBtn = gtk.HBox(True, 0)
	btn1 = gtk.Button(stock=gtk.STOCK_MEDIA_PLAY)
	btn1.connect("clicked", self.btn1_on_clicked, model[row][3])
	btn1.show()
	boxBtn.pack_start(btn1, True, False, 0)	
	btninfo = gtk.Button('Save Info')
	btninfo.show()
	btninfo.connect("clicked", self.btninfo_on_clicked, model[row][0], model[row][1], strip_ml_tags(description), im)
	boxBtn.pack_start(btninfo, True, False, 0)
	btn3 = gtk.Button(stock=gtk.STOCK_SAVE)
	btn3.connect("clicked", self.btn3_on_clicked, model[row][3], model[row][0], model[row][1])
	btn3.show()
	boxBtn.pack_start(btn3, True, False, 0)	
	btn2 = gtk.Button(stock=gtk.STOCK_CLOSE)
	btn2.show()
	btn2.connect("clicked", self.btn2_on_clicked, info_window)
	boxBtn.pack_start(btn2, True, False, 0)	
	boxBtn.show()
	
	box1.pack_start(boxBtn, True, False, 0)
	desc.show()
	box1.show()
	box2.show()
	info_window.show()

    def btn2_on_clicked(self, widget, window):
	window.destroy()
	
    def btninfo_on_clicked(self, widget, title, date, desc, image):
	home = os.getenv("HOME")
	mainfolder = home+'/Videos/Arte+7/'
    	if not os.path.isdir(mainfolder):
		os.makedirs(mainfolder)
	#create filename
	valid_chars = "-_.()%s%s" % (string.ascii_letters, string.digits)
	filename = ''.join(c for c in title if c in valid_chars)
	filename = filename+"_"+date
	#change to containing folder
	os.chdir(mainfolder)
	text_file = open(filename+".txt","w")
	text_file.write(desc)
	text_file.close()
	imagefile = open(filename+".jpg", "w")
	imagefile.write(image)
	imagefile.close()
		


    def btn3_on_clicked(self, widget, linky, title, date):
	#save
	home = os.getenv("HOME")
	mainfolder = home+'/Videos/Arte+7/'
	if not os.path.isdir(mainfolder):
		os.makedirs(mainfolder)
		
	tmp = urllib.urlopen(linky)
	vidpage = tmp.read()
	print linky
	almostlink = vidpage.rpartition('availableFormats[3]["url"]')[2]
	
	link = almostlink.split('";\n')[0]
	print link
	link = link.split('http')
	print link[1]
	now = urllib.urlopen('http'+link[1])
	mainvidlink = now.read()
	finallink = mainvidlink.split('HREF="')[1].split('"/>')[0]
	#create filename
	valid_chars = "-_.()%s%s" % (string.ascii_letters, string.digits)
	filename = ''.join(c for c in title if c in valid_chars)
	#create containing folder
	os.chdir(mainfolder)
	os.system("mimms -r '"+finallink+"' "+filename+"_"+date+" &")

    def btn1_on_clicked(self, widget, linky):
	#play
	tmp = urllib.urlopen(linky)
	vidpage = tmp.read()
	print linky
	almostlink = vidpage.rpartition('availableFormats[3]["url"]')[2]
	link = almostlink.split('";\n')[0]
	link = link.split('http')
	print link[1]
	now = urllib.urlopen('http'+link[1])
	mainvidlink = now.read()
	finallink = mainvidlink.split('HREF="')[1].split('"/>')[0]	
	os.system("vlc '"+finallink+"' &")

def image_to_pixbuf(image):
	fd = StringIO.StringIO()
     	image.save(fd, "ppm")
    	contents = fd.getvalue()
    	fd.close()
     	loader = gtk.gdk.PixbufLoader("pnm")
     	loader.write(contents, len(contents))
     	pixbuf = loader.get_pixbuf()
    	loader.close()
	return pixbuf

def strip_ml_tags(in_text):
	
	s_list = list(in_text)
	i,j = 0,0
	
	while i < len(s_list):
		
		if s_list[i] == '<':
			while s_list[i] != '>':
				
				s_list.pop(i)
				
			
			s_list.pop(i)
		else:
			i=i+1
			

	join_char=''
	return join_char.join(s_list)


PyApp()
gtk.main()

