2018-08-18 17:57:43 +00:00
from tkinter import Label , Button , Frame , Tk , Entry , StringVar , LEFT , RIGHT
2018-08-17 18:31:23 +00:00
import json
import sys
import os
import unicodedata
2018-08-18 13:31:37 +00:00
from bs4 import BeautifulSoup
import webbrowser
2018-08-18 17:03:27 +00:00
import urllib . request
2018-08-18 17:57:43 +00:00
import re
2018-08-18 13:31:37 +00:00
class Labbelink ( Label ) :
def __init__ ( self , parent , text , link ) :
Label . __init__ ( self , parent , text = text , fg = " blue " , cursor = " hand2 " )
self . link = link
self . bind ( " <Button-1> " , self . _openlink )
2018-08-18 17:57:43 +00:00
def _openlink ( self , evt ) :
webbrowser . open ( self . link )
2018-08-17 18:31:23 +00:00
class Interface :
def __init__ ( self ) :
self . datafilepath = os . path . dirname ( os . path . realpath ( __file__ ) ) + " /chaine.json "
self . data = load_jsonfile ( self . datafilepath )
self . fenetre = Tk ( )
self . fenetre . title ( " recherche de chaine " )
self . value = StringVar ( )
self . label = Label ( self . fenetre , text = " entrer numero de chaine " )
self . entree = Entry ( self . fenetre , textvariable = self . value , width = 30 )
self . frame = Frame ( self . fenetre )
2018-08-18 13:31:37 +00:00
self . resultframe = Frame ( self . fenetre )
2018-08-17 18:31:23 +00:00
self . bouton_update_base = Button (
self . fenetre , text = " update la base de chaine " , command = self . click_update )
self . bouton = Button ( self . frame , text = " OK " , command = self . click )
self . reset = Button ( self . frame , text = " reset " , command = self . click_reset )
self . label . pack ( )
self . entree . pack ( )
self . entree . focus_set ( )
2018-08-18 18:43:41 +00:00
self . resultframe . pack ( expand = 1 , fill = ' both ' )
2018-08-17 18:31:23 +00:00
self . frame . pack ( )
self . bouton . pack ( side = LEFT )
self . reset . pack ( side = RIGHT )
self . bouton_update_base . pack ( )
self . fenetre . bind ( " <Key-Return> " , self . enter )
self . fenetre . bind ( " <Key-Escape> " , self . eventreset )
def enter ( self , evt ) :
self . click ( )
def eventreset ( self , evt ) :
self . click_reset ( )
def mainloop ( self ) :
self . fenetre . mainloop ( )
def click ( self ) :
print ( self . value . get ( ) )
2018-08-18 13:31:37 +00:00
2018-08-17 18:31:23 +00:00
try :
2018-08-18 18:43:41 +00:00
strlink = geturlprogrammetv ( self . data [ self . value . get ( ) ] )
link = Labbelink ( self . resultframe , self . data [ self . value . get ( ) ] , strlink )
2018-08-18 13:31:37 +00:00
link . pack ( )
2018-08-17 18:31:23 +00:00
print ( self . data [ self . value . get ( ) ] )
2018-08-18 18:43:41 +00:00
emision = parse_emmission ( strlink )
if emision :
if emision == " can ' t find show " :
Label ( self . resultframe , text = " impssible de parser cette chaine " ) . pack ( )
else :
Label ( self . resultframe , text = " emmision ce soir: " + emision [ " title " ] ) . pack ( )
if len ( emision [ ' casting ' ] ) > 0 :
Label ( self . resultframe , text = " réalisateur: " + emision [ ' casting ' ] [ 0 ] ) . pack ( )
Label ( self . resultframe , text = " acteur: " + str ( emision [ ' casting ' ] [ 1 : ] ) ) . pack ( )
2018-08-20 16:59:47 +00:00
Label ( self . resultframe , text = " synopsys: " + emision [ ' synopsis ' ] , wraplength = 250 ) . pack ( )
Label ( self . resultframe , text = " lien: " + emision [ ' href ' ] ) . pack ( )
2018-08-18 18:43:41 +00:00
self . resultframe . update ( )
else :
Label ( self . resultframe , text = " pas de connection internet impossible de determiner l ' émission du soir " ) . pack ( )
2018-08-17 18:31:23 +00:00
except KeyError :
print ( " numero de chaine inconnue " )
2018-08-18 13:31:37 +00:00
unknow = Label ( self . resultframe , text = " numero de chaine inconnue " )
unknow . pack ( )
#self.label2["text"] += geturlprogrammetv(self.data[self.value.get()])
2018-08-17 18:31:23 +00:00
self . value . set ( " " )
def click_reset ( self ) :
print ( " reset " )
2018-08-18 13:31:37 +00:00
for child in self . resultframe . winfo_children ( ) :
child . destroy ( )
2018-08-17 18:31:23 +00:00
def click_update ( self ) :
parsechaine ( self . datafilepath )
self . data = load_jsonfile ( self . datafilepath )
2018-08-18 13:31:37 +00:00
labelupdate = Label ( self . resultframe , text = " update chaine done " + " \r " )
labelupdate . pack ( )
def _openlink ( self , link ) :
webbrowser . open_new ( link )
2018-08-17 18:31:23 +00:00
def load_jsonfile ( file ) :
try :
with open ( file , ' r ' , encoding = ' utf-8 ' ) as f :
return json . load ( f )
except FileNotFoundError :
parsechaine ( file )
with open ( file , ' r ' , encoding = ' utf-8 ' ) as f :
return json . load ( f )
def RepresentsInt ( s ) :
try :
int ( s )
return True
except ValueError :
return False
except TypeError :
return False
def parsechaine ( file ) :
2018-08-18 17:03:27 +00:00
2018-08-17 18:31:23 +00:00
URL = ' https://fr.wikipedia.org/wiki/Liste_des_cha % C3 % AEnes_de_Canal '
liste_chaine = { }
response = urllib . request . urlopen ( URL )
html = response . read ( )
parse = BeautifulSoup ( html , " html.parser " )
for item in parse . find_all ( ' table ' ) :
if ( item . get ( " class " ) == [ ' wikitable ' ] or item . get ( " class " ) == [ ' wikitable ' , ' sortable ' ] ) :
for tr in item . find_all ( ' tr ' ) :
firstTD = tr . find ( )
num = firstTD . text
#print(num)
if RepresentsInt ( num ) :
if RepresentsInt ( firstTD . find_next ( ) . string ) :
2018-08-18 17:57:43 +00:00
#print(firstTD.find_next().find_next().text)
liste_chaine [ int ( num ) ] = firstTD . find_next ( ) . find_next ( ) . text
2018-08-17 18:31:23 +00:00
else :
#print(firstTD.find_next().string)
liste_chaine [ int ( num ) ] = firstTD . find_next ( ) . text
print ( json . dumps ( liste_chaine , indent = 4 ) )
with open ( file , ' w ' , encoding = ' utf-8 ' ) as f :
json . dump ( liste_chaine , f , indent = 4 )
def geturlprogrammetv ( strsearch ) :
strsearch = unicodedata . normalize ( ' NFD ' , strsearch ) . encode ( ' ascii ' , ' ignore ' )
strsearch = strsearch . decode ( " utf-8 " )
strsearch = strsearch . replace ( " " , " + " )
return " https://www.programme-tv.net/rechercher?q= " + strsearch
2018-08-18 17:03:27 +00:00
def parse_emmission ( URL ) :
try :
response = urllib . request . urlopen ( URL )
except urllib . error . URLError :
return False
2018-08-18 17:34:55 +00:00
2018-08-18 17:03:27 +00:00
html = response . read ( )
parse = BeautifulSoup ( html , " html.parser " )
link = parse . select_one ( " .prog_name " )
2018-08-18 17:34:55 +00:00
if link == None :
return " can ' t find show "
2018-08-18 17:09:10 +00:00
href = " https://www.programme-tv.net " + link [ ' href ' ]
response = urllib . request . urlopen ( href )
2018-08-18 17:03:27 +00:00
html = response . read ( )
parse = BeautifulSoup ( html , " html.parser " )
divcasting = parse . select_one ( " .descriptif " )
casting = divcasting . find_all ( href = re . compile ( " biographie " ) )
i = 0
for actor in casting :
casting [ i ] = actor . text
i + = 1
divsynopsis = parse . select_one ( " .episode-synopsis " )
img = divsynopsis . find_next ( ' img ' ) [ ' data-src ' ]
synopsis = divsynopsis . select_one ( " .d-b " ) . text
2018-08-20 16:59:47 +00:00
print ( type ( synopsis ) )
2018-08-20 17:06:50 +00:00
print ( remove_first_space ( synopsis ) )
return { ' title ' : link [ ' title ' ] , ' href ' : href , ' casting ' : casting , ' synopsis ' : remove_first_space ( synopsis ) , ' img ' : img }
2018-08-18 17:03:27 +00:00
2018-08-17 18:31:23 +00:00
2018-08-20 16:59:47 +00:00
def remove_first_space ( string ) :
space_number = 0
for char in string :
2018-08-20 17:06:50 +00:00
if char . isspace ( ) :
2018-08-20 16:59:47 +00:00
space_number + = 1
else :
break
return string [ space_number : ]
print ( remove_first_space ( " Joséphine apparaît dans un parc zoologique. Elle se fait embaucher comme soigneuse après avoir eu quelques frayeurs face à un lion échappé de son enclos. L ' ange gardien rencontre Clara Lorenz, la nouvelle directrice des lieux. Joséphine ne tarde pas à comprendre que la jeune femme ne semble guère se plaire ici : elle succède à son père décédé il y a deux mois et avec qui elle n ' était pas en bons termes. " ) )
2018-08-17 18:31:23 +00:00
def cli ( num ) :
datafilepath = os . path . dirname ( os . path . realpath ( __file__ ) ) + " /chaine.json "
data = load_jsonfile ( datafilepath )
print ( num )
try :
2018-08-18 17:57:43 +00:00
print ( data [ num ] )
2018-08-17 18:31:23 +00:00
except KeyError :
print ( " numero de chaine inconnue " )
return
2018-08-18 17:03:27 +00:00
emision = parse_emmission ( geturlprogrammetv ( data [ num ] ) )
if emision :
2018-08-18 17:34:55 +00:00
if emision == " can ' t find show " :
print ( " impssible de parser cette chaine " )
else :
print ( " emmision ce soir: " + emision [ " title " ] )
if len ( emision [ ' casting ' ] ) > 0 :
print ( " réalisateur: " + emision [ ' casting ' ] [ 0 ] )
print ( " acteur: " + str ( emision [ ' casting ' ] [ 1 : ] ) )
print ( " synopsys: " + emision [ ' synopsis ' ] )
print ( " lien: " + emision [ ' href ' ] )
2018-08-18 17:03:27 +00:00
else :
print ( " pas de connection internet impossible de determiner l ' émission du soir " )
2018-08-18 17:34:55 +00:00
print ( " " )
2018-08-17 18:31:23 +00:00
if len ( sys . argv ) > 1 :
for i in sys . argv [ 1 : ] :
if i == " update " :
parsechaine ( os . path . dirname ( os . path . realpath ( __file__ ) ) + " /chaine.json " )
else :
cli ( i )
else :
2018-08-18 17:57:43 +00:00
Interface ( ) . mainloop ( )
2018-08-20 16:59:47 +00:00