X-Git-Url: http://git.euphorik.ch/index.cgi?a=blobdiff_plain;ds=inline;f=src%2Fyopyop.rb;h=d6a91b357a6ab052fbe1ff9c0b503c6c365e46f5;hb=9dfa911b2000f89093627cc8cc95e1762c4310d2;hp=d978de66a90e55ac0825307226c9ff15cec21dac;hpb=adff5c0ba4aede9362674073af1333de7a3d2fbf;p=pompage.git
diff --git a/src/yopyop.rb b/src/yopyop.rb
index d978de6..d6a91b3 100644
--- a/src/yopyop.rb
+++ b/src/yopyop.rb
@@ -1,394 +1,93 @@
-require 'rexml/document'
-require 'net/http'
-require 'thread'
-require 'thwait'
-require 'cgi'
-
-# G.Burri fait à l'arrache d'après : 'www.la-rache.com'
-
-#constantes
-FILMS_EXTENSIONS = ['avi', 'mkv', 'rmvb', 'ogm', 'divx']
-FICHIER_PATTERN = "
[] [] [] []" # la structure d'un fichier
-LOAD_DATA = true # charge les informations depuis le web ?
-
-#le nombre de connexions simultanés sur le site de films
-NB_CONN_MAX = 20
-
-class Objet
- @@compteur = 0
- def initialize
- @id = @@compteur + 1
- @@compteur += 1
- end
-
- def getXml
- #abstrait
- end
-end
-
-class Personne < Objet
- attr_reader :nom
-
- @@personnes = {}
-
- #ajoute une personne et la retourne
- def Personne::ajouter(nom)
- if nil == personne = @@personnes[nom]
- personne = Personne::new(nom)
- @@personnes[nom] = personne
- end
- personne
- end
-
- def initialize(nom)
- @nom = nom
- end
-
- def getXml
-
- end
+# coding: utf-8
+# YopYop est un super programme permettant de :
+# - Parcourir des dossiers recursivement à la recherche de fichiers videos
+# - Parser les fichiers afin d'en retirer les infos suivantes : (pas encore implémenté)
+# o le codec video
+# o le codec son
+# o les pistes audio
+# o les sous-titres disponible
+# - Les formats supportés :
+# o avi
+# o ogm
+# o mkv
+# o rmvb
+# - Rechercher chaque film sur le site 'allocine.com' et 'imdb.com' et en pomper un max d'infos
+# - Etablir une petit base de données des films au format xml
+
+require 'films.rb'
+require 'film.rb'
+
+require 'images.rb'
+
+# vérifie les arguments donnés
+$xmlFile = nil
+$repBase = Dir::getwd
+$repFilms = '.'
+$repAffichette = '../img/affichette/'
+$force = false
+mod = 'Allocine'
+purgeImages = false
+update = nil
+titre = ".*"
+
+aPrec = ''
+$*.each{|a|
+ case a
+ when '-p'
+ purgeImages = true
+ next
+ when '-f'
+ $force = true
+ next
+ end
+ case aPrec
+ when '-x'
+ $xmlFile = a
+ when '-d'
+ $repFilms = a
+ when '-m'
+ mod = a.capitalize
+ when '-a'
+ $repAffichette = a
+ when '-u'
+ update = a
+ when '-t'
+ titre = a
+ end
+ aPrec = a
+}
+
+if $xmlFile.nil?
+ puts USAGE
+ exit 0
end
-class Genre < Objet
- attr_reader :nom
-
- @@genres = {}
-
- #ajoute un genre et le retourne
- def Genre::ajouter(nom)
- if nil == genre = @@genres[nom]
- genre = Genre::new(nom)
- @@genres[nom] = genre
- end
- genre
- end
-
- def initialize(nom)
- @nom = nom
- end
-
- def getXml
-
- end
+unless File::directory?($repFilms)
+ puts "'#{$repFilms}' is not a valid directory"
+ exit 1
end
-class Pays < Objet
- attr_reader :nom
-
- @@pays = {}
-
- #ajoute un pays et le retourne
- def Pays::ajouter(nom)
- if nil == pays = @@pays[nom]
- pays = Pays::new(nom)
- @@pays[nom] = pays
- end
- pays
- end
-
- def initialize(nom)
- @nom = nom
- end
-
- def getXml
-
- end
+begin
+ require "modules/#{mod.downcase}"
+rescue
+ puts "Le module '#{mod.downcase}' n'existe pas. Les modules se trouvent dans le dossier 'src/modules'"
+ puts USAGE
+ exit 1
end
-class Film
- attr_accessor :titre, :fichier, :annee, :realisateurs, :acteurs, :pays, :duree, :critiquePresse, :critiqueSpectateur, :genres, :synopsis, :budget
-
- # les films indexés par leur titre
- @@films = {}
- #les films indexés par leur nom de fichier
- @@filmsFichier = {}
+# charge les films à partir du fichier xml
+films = Films::new($xmlFile, Module.class_eval(mod))
- @@mutex = Mutex::new
- @@threadsWait = ThreadsWait::new
- @@nbConn = 0
-
- def Film::litRepertoire(r)
- Film::litRepertoireR(r)
- #on attends que les threads se terminent
- @@threadsWait.all_waits
- end
-
- # Charge les films contenus dans un fichier XML.
- def Film::loadFilmsXml(xmlFile)
- racine = REXML::Document::new(File::new(xmlFile)).root
- racine.each_element{|e|
- fichier = e.get_elements('fichier')[0].get_text
- next if fichier == nil
- titre = e.get_elements('titre')[0].get_text
- annee = e.get_elements('annee')[0].get_text
- duree = e.get_elements('duree')[0].get_text
- critiquePresse = e.get_elements('critiquePresse')[0].get_text
- critiqueSpectateur = e.get_elements('critiqueSpectateur')[0].get_text
- synopsis = e.get_elements('synopsis')[0].get_text
- budget = e.get_elements('budget')[0].get_text
- realisateurs = e.get_elements('realisateur')
- acteurs = e.get_elements('acteur')
- pays = e.get_elements('pays')
- genres = e.get_elements('genres')
-
-
- film = Film::new(fichier.value)
- film.titre = titre.value unless titre.nil?
- film.annee = annee.value unless annee.nil?
- realisateurs.each{|e|
- film.realisateurs << Personne::ajouter(e.get_text.value)
- }
- acteurs.each{|e|
- film.acteurs << Personne::ajouter(e.get_text.value)
- }
- pays.each{|e|
- film.pays << Pays::ajouter(e.get_text.value)
- }
- film.duree = duree.value unless duree.nil?
- film.critiquePresse = critiquePresse.value unless critiquePresse.nil?
- film.critiqueSpectateur = critiqueSpectateur.value unless critiqueSpectateur.nil?
- genres.each{|e|
- film.genres << Genre::ajouter(e.get_text.value)
- }
- film.synopsis = synopsis.value unless synopsis.nil?
- film.budget = budget.value unless budget.nil?
- @@films[film.titre] = film
- @@filmsFichier[film.fichier] = film
- }
- end
-
- # Renvoie tous les films sous la forme d'un élement XML.
- def Film::getFilmsXml
- racine = REXML::Element::new('filmographie')
- @@films.each{|nom, f|
- racine.add(f.getXml)
- }
- return REXML::Document::new.add(racine)
- end
-
-private
- def Film::litRepertoireR(r)
- Dir::foreach(r){|f|
- next if f == '.' or f == '..'
- fichier = r + "/" + f
- if File::directory?(fichier)
- litRepertoireR(fichier)
- else
-
- #si le film n'existe pas déjà dans la liste
- if film = @@filmsFichier[fichier]
- puts "[i] Already exists in DB : #{film.titre} (#{film.fichier})"
- next
- end
-
- film = nil
- @@nbConn += 1
- @@threadsWait.join_nowait(
- Thread::new{
- begin
- @@mutex.lock if @@nbConn >= NB_CONN_MAX
- #p @@nbConn
- film = Film::filmsFactory(fichier)
- unless film.nil?
- if @@films.has_key?(film.titre)
- puts "[!] Duplicate movie : #{film.titre} (#{film.fichier})"
- else
- puts "[i] movie added : #{film.titre} (#{film.fichier})"
- @@films[film.titre] = film
- @@filmsFichier[film.fichier] = film
- end
- end
- @@nbConn -= 1
- #p @@nbConn
- @@mutex.unlock
- rescue Exception => e
- puts e.message
- puts e.backtrace
- end
- }
- )
- end
- }
- end
-
- def Film::filmsFactory(fichier)
- /^.*?\.(.{3,4})$/ =~ fichier
- if FILMS_EXTENSIONS.include?($1)
- Film::new(fichier).loadData
- end
- end
-
-public
-
- def initialize(fichier)
- @fichier = fichier
- @titre = ''
- @annee = nil
- @realisateurs = []
- @acteurs = []
- @pays = []
- @duree = nil
- @critiquePresse = nil
- @critiqueSpectateur = nil
- @genres = []
- @synopsis = nil
- @budget = nil
- @budgetUnite = 'euro'
- end
-
- #charge les informations du films à partir d'allocine
- def loadData
- unless LOAD_DATA
- @titre = @fichier
- return self
- end
-
- connexionHttp = Net::HTTP::new('www.allocine.fr');
-
- #extrait le nom à partire du nom du fichier
- /^.*?([^\/]*?)\.(.{3,4})$/ =~ @fichier
- #remplace undescores et points par des espaces
- titre = $1.gsub(/[_\.]/, ' ')
- #vire les espaces au début et à la fin
- titre.strip!
- #remplace les suites d'espaces par un seul
- titre.gsub!(/ {2,}/,' ')
- titre.gsub!(/\[.*?\]/,'')
- titre.gsub!(/\(.*?\)/,'')
- @titre = titre.dup
-
- donneesHtml = nil
- begin
- reponse, donneesHtml = connexionHttp.get("/recherche/?motcle=#{CGI::escape(titre)}")
- #si pas trouvé alors on enlève un mot à la fin
- if /.*?Pas de résultats.*?/ =~ donneesHtml
- /(.*?)[^ ]+?$/ =~ titre.strip
- titre = $1
- titre.strip!
- else
- break;
- end
- end while not titre.nil? and not titre.empty?
-
- unless titre.nil? or titre.empty?
- // =~ donneesHtml
- if $1
- r, ficheHtml = connexionHttp.get("/film/fichefilm_gen_cfilm=#{$1}.html")
-
- # Titre
- /(.*?)<\/title>/ =~ ficheHtml
- @titre = $1 unless $1.nil?
-
- #puts "Movie found : #{@titre} (#{@fichier})"
-
- # Année
- /