Author: duncan
Date: Sun Dec  2 06:17:32 2007
New Revision: 10171

Log:
[ 1841775 ] DVD/Trailers french grabber
New plug-in from Sylvain Fabre added


Added:
   branches/rel-1-7/freevo/src/video/plugins/cinemovies_trailers.py   
(contents, props changed)
   branches/rel-1/freevo/src/video/plugins/cinemovies_trailers.py   (contents, 
props changed)
Modified:
   branches/rel-1-7/freevo/ChangeLog
   branches/rel-1-7/freevo/Docs/CREDITS
   branches/rel-1/freevo/ChangeLog
   branches/rel-1/freevo/Docs/CREDITS

Modified: branches/rel-1-7/freevo/ChangeLog
==============================================================================
--- branches/rel-1-7/freevo/ChangeLog   (original)
+++ branches/rel-1-7/freevo/ChangeLog   Sun Dec  2 06:17:32 2007
@@ -17,6 +17,7 @@
 --------------------------------
 
  * New Alsa mixer 2 plug-in (F#1832948)
+ * New French DVD trailer grabber (F#1841775)
  * New French movie cover grabber (F#1841768)
  * New gphoto plug-in, in contrib/runtime (F#1838260)
  * New six channel mixer and idlebar plug-in (F#1833749)

Modified: branches/rel-1-7/freevo/Docs/CREDITS
==============================================================================
--- branches/rel-1-7/freevo/Docs/CREDITS        (original)
+++ branches/rel-1-7/freevo/Docs/CREDITS        Sun Dec  2 06:17:32 2007
@@ -67,6 +67,7 @@
 ------------------------
 
 Sylvain FABRE <centraladmin at lahiette.com>
+o French DVD trailer grabber
 o French movie cover grabber
 
 Thorsten Pferdekaemper <thorsten.pferdekaemper at t-online.de>

Added: branches/rel-1-7/freevo/src/video/plugins/cinemovies_trailers.py
==============================================================================
--- (empty file)
+++ branches/rel-1-7/freevo/src/video/plugins/cinemovies_trailers.py    Sun Dec 
 2 06:17:32 2007
@@ -0,0 +1,266 @@
+#if 0 /*
+# -----------------------------------------------------------------------
+# cinemovies_trailers.py - Plugin for streaming trailers from cinemovies.fr
+# -----------------------------------------------------------------------
+#
+# Revision 0.3  -  Author Sylvain Fabre
+#
+# Notes: This code is still beta 
+#
+#        Add "plugin.activate('video.ccinemovies_trailers')" in local_conf.py
+#        to activate it
+#        No other config needed
+#
+
+import os
+
+import config
+import plugin
+import menu
+import stat
+import time, datetime
+import re
+import urllib
+import string
+import util.fileops
+import util.misc
+import sys
+import codecs
+import os
+import traceback
+import urllib, urllib2, urlparse, commands
+
+from util import htmlenties2txt
+from util import fxdparser
+from gui.PopupBox import PopupBox
+
+from item import Item
+from video.videoitem import VideoItem
+from gui.ProgressBox import ProgressBox
+from BeautifulSoup import BeautifulSoup, SoupStrainer
+
+INTERNAL_VERSION = '040708_02'
+CAC_URL = 'http://www.cinemovies.fr/'
+
+class TrailerVideoItem(VideoItem):
+    def __init__(self, name, url, parent):
+        VideoItem.__init__(self, url, parent)
+        self.name = name
+        self.type = 'trailers'
+
+class PluginInterface(plugin.MainMenuPlugin):
+    """
+    A freevo interface to http://www.cinemovies.fr
+
+    plugin.activate('video.cinemovies')
+    """
+    def __init__(self):
+        plugin.MainMenuPlugin.__init__(self)
+
+    def items(self, parent):
+        return [ MovieTrailers(parent), DVDTrailers(parent) ]
+
+class MovieTrailers(Item):
+    def __init__(self, parent):
+        Item.__init__(self, parent)
+        self.name = _('Voir les bandes annonces de film')
+        self.type = 'trailers'
+
+    def actions(self):
+        return [ (self.make_menu_week, 'Titres de films') ]
+
+    def make_menu_week(self, arg=None, menuw=None):
+      items = generate_common_menu(self, "Recuperation des bandes annonces", 
"calendrier_fr-1-")
+      menuw.pushmenu(menu.Menu(_('Bandes annonces disponibles'), items))
+
+    def play_video(self, arg=None, menuw=None):
+      items = generate_common_stream_list(self, arg[1] )
+      menuw.pushmenu(menu.Menu(arg[0], items))
+
+class DVDTrailers(Item):
+    def __init__(self, parent):
+        Item.__init__(self, parent)
+        self.name = _('Voir les sorties DVD')
+        self.type = 'trailers'
+
+    def actions(self):
+        return [ (self.make_menu_week, 'Titres DVD') ]
+
+    def make_menu_week(self, arg=None, menuw=None):
+      items = generate_common_menu(self, "Recuperation des bandes annonces 
DVD", "calendrier_dvd-8-")
+      menuw.pushmenu(menu.Menu(_('Bandes annonces DVD disponibles'), items))
+
+    def play_video(self, arg=None, menuw=None):
+      items = generate_common_stream_list(self, arg[1] )
+      menuw.pushmenu(menu.Menu(arg[0], items))
+      
+# headers for urllib2
+txdata = None
+txheaders = {
+    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) 
Opera 8.51',
+    'Accept-Language': 'fr-fr',
+}
+
+#Generate a menu, whatever we are searching for DVD or movies
+def generate_common_menu(parent, title_box, page_prefix):
+  items = []
+
+  #Start grabbing from DVD/Movies of last week
+  current = datetime.date.today() - datetime.timedelta(days=7)
+  for week in [0, 1, 2, 3, 4, 5, 6]:
+    # Compute a new date for the week
+    newdate = current + datetime.timedelta(days=(week*7))
+    # Show some progress
+    box = PopupBox(text=_(title_box+'\nSemaine du 
'+newdate.strftime("%d/%m/%Y")))
+    box.show()
+
+    filehtml = page_prefix + newdate.strftime("%Y") + \
+              newdate.strftime("%m") + newdate.strftime("%d") + ".html"
+    #print "URL to fetch : %s" % filehtml
+    trailers = get_movie_list_week(CAC_URL + filehtml)
+    for title, idfilm in trailers:
+      items.append(menu.MenuItem('%s' % (title + " (" + 
newdate.strftime("%d/%m/%Y") + ")"),
+                                       parent.play_video, (title, idfilm) ) )
+    box.destroy()
+
+  return items
+
+# Generate the list of streams of a specific movie
+def generate_common_stream_list( object, idfilm ):
+  items = []
+      
+  box = PopupBox(text=_('Recuperation des types de bande annonces 
disponibles'))
+  box.show()
+      
+  streamlist = get_movie_sheet( idfilm )
+  if streamlist:
+    for title, streamurl in streamlist:
+      items.append(TrailerVideoItem(title, streamurl, object))
+  else:
+    items.append( menu.MenuItem('Pas de bande annonce dispo', None, None) )
+        
+  box.destroy()
+  return items
+    
+# Parse the 'player.php' file to get the stream URL
+def get_stream_url(idfilm, idba):  
+  # Get the URL
+  url = CAC_URL + "players/video.php?IDfilm=" + idfilm + "&IDBA=" + idba
+  req = urllib2.Request(url, txdata, txheaders)
+  try:
+    response = urllib2.urlopen(req)
+  except urllib2.HTTPError, error:
+    exit
+  
+  # Build the soup tree
+  links = SoupStrainer('script')
+  soup  = BeautifulSoup( response.read(), parseOnlyThese=links )
+  re_QT = re.compile('^QT_WriteOBJECT_XHTML\(\'(.*?)\',.*')
+  re_RM = re.compile('.*AC_RunRealContentX\(.*, \"SRC\", \"(.*?)\"\);')
+  re_WM = re.compile('.*name=\"filename\" value=\"(.*?)\".*')
+  
+  # Get the list of javascript tags to the streams
+  scriptlist = soup.findAll("script")
+  for script in scriptlist:
+    if script.string:
+      httpstr = re_QT.search(script.string)
+      if httpstr:
+        return httpstr.group(1)
+      else:
+        httpstr = re_RM.search(script.string)
+        if httpstr:
+          return httpstr.group(1)
+        else:
+          httpstr = re_WM.search(script.string)
+          if httpstr:
+            return  httpstr.group(1)
+  
+  return None
+    
+# Parse the 'fiche_multimedia' file to get the player URL
+def get_movie_sheet(idfilm):
+  # Get the URL
+  url = CAC_URL + 'fiche_multimedia.php?IDfilm=' + idfilm
+  req = urllib2.Request(url, txdata, txheaders)
+  try:
+    response = urllib2.urlopen(req)
+  except urllib2.HTTPError, error:
+    exit
+  
+  # Build the soup tree
+  links = SoupStrainer('td')
+  soup  = BeautifulSoup(response.read(), parseOnlyThese=links )
+  re_idba = re.compile('.*IDBA=([0-9]*).*', re.I)
+  re_res  = re.compile('haute r.*', re.I)
+  streams = []
+  
+  # Find the kind of trailer that are listed below
+  tdlist = soup.findAll("td", {"class" : ['arial8black', 
'tail_disclaimer_grey8point', 'arial9black3'] } )
+  title_part1 = "Bande annonce"
+  title_type  = "(Type de video inconnu)"
+  for td in tdlist:
+    # We have found the type of BA and the type of streams
+    if td['class'] == 'arial8black':
+      if td.a:
+        if td.a.string:
+          if re_res.search(td.a.string):
+            idba = re_idba.search(td.a['href'])
+            if idba:
+              streamurl = get_stream_url( idfilm, idba.group(1) )
+              streams += [ (title_part1 + " " + title_type, streamurl) ]
+              #print title_part1 + " " + title_type
+    # We have found the type of BA, search for the type of streams
+    if td['class'] == 'tail_disclaimer_grey8point':
+      if td.p:
+        if td.p.img:
+          if td.p.img['src'] == "images/data/ba/quicktime_ico.gif":
+            title_type = "(Quicktime)"
+          if td.p.img['src'] == "images/v2/div/player/real2.gif":
+            title_type = "(Real Media)"
+          if td.p.img['src'] == "images/data/ba/wmp_ico.gif":
+            title_type = "(Windows Media)"
+    # We are searching eventually a new type of BA
+    if td['class'] == 'arial9black3':
+      if td.b:
+        if td.b.string == "Bande annonce vf":
+          title_part1 = "Bande annonce VF"
+        if td.b.string == "Bande annonce vost":
+          title_part1 = "Bande annonce VOST"
+        if td.b.string == "Teaser vf":
+          title_part1 = "Teaser VF"
+        if td.b.string == "Teaser vost":
+          title_part1 = "Teaser VOST"
+      
+  return streams
+    
+
+# Return the list of tupple movie title and URL to the stream
+def get_movie_list_week(url):
+  trailers = []
+  
+  req = urllib2.Request(url, txdata, txheaders)
+  try:
+    response = urllib2.urlopen(req)
+  except urllib2.HTTPError, error:
+    exit
+  
+  # Build the soup tree
+  links = SoupStrainer('a')
+  soup  = BeautifulSoup( response.read(), parseOnlyThese=links )
+  re_id = re.compile('.*IDfilm=([0-9]*)', re.I)
+  
+  # Search all the movie title in the page
+  titletag = soup.findAll("a", {"class" : "style6"} )
+  for title in titletag:
+    idfilm = re_id.search(title['href'])
+    # If the ID is found, then check if a trailer is available
+    if idfilm:
+        # If some trailers are available (because the like is present, then we 
push it in the list
+        fiche_tag = soup.find("a", {"href" : 
"fiche_multimedia.php?IDfilm="+idfilm.group(1)} )
+        if fiche_tag:
+          fiche_tag.extract()
+          trailers += [ (title.next.string, idfilm.group(1)) ]
+
+  return trailers
+    
+

Modified: branches/rel-1/freevo/ChangeLog
==============================================================================
--- branches/rel-1/freevo/ChangeLog     (original)
+++ branches/rel-1/freevo/ChangeLog     Sun Dec  2 06:17:32 2007
@@ -22,6 +22,7 @@
 --------------------------------
 
  * New Alsa mixer 2 plug-in (F#1832948)
+ * New French DVD trailer grabber (F#1841775)
  * New French movie cover grabber (F#1841768)
  * New gphoto plug-in, in contrib/runtime (F#1838260)
  * New six channel mixer and idlebar plug-in (F#1833749)

Modified: branches/rel-1/freevo/Docs/CREDITS
==============================================================================
--- branches/rel-1/freevo/Docs/CREDITS  (original)
+++ branches/rel-1/freevo/Docs/CREDITS  Sun Dec  2 06:17:32 2007
@@ -67,6 +67,7 @@
 ------------------------
 
 Sylvain FABRE <centraladmin at lahiette.com>
+o French DVD trailer grabber
 o French movie cover grabber
 
 Thorsten Pferdekaemper <thorsten.pferdekaemper at t-online.de>

Added: branches/rel-1/freevo/src/video/plugins/cinemovies_trailers.py
==============================================================================
--- (empty file)
+++ branches/rel-1/freevo/src/video/plugins/cinemovies_trailers.py      Sun Dec 
 2 06:17:32 2007
@@ -0,0 +1,266 @@
+#if 0 /*
+# -----------------------------------------------------------------------
+# cinemovies_trailers.py - Plugin for streaming trailers from cinemovies.fr
+# -----------------------------------------------------------------------
+#
+# Revision 0.3  -  Author Sylvain Fabre
+#
+# Notes: This code is still beta 
+#
+#        Add "plugin.activate('video.ccinemovies_trailers')" in local_conf.py
+#        to activate it
+#        No other config needed
+#
+
+import os
+
+import config
+import plugin
+import menu
+import stat
+import time, datetime
+import re
+import urllib
+import string
+import util.fileops
+import util.misc
+import sys
+import codecs
+import os
+import traceback
+import urllib, urllib2, urlparse, commands
+
+from util import htmlenties2txt
+from util import fxdparser
+from gui.PopupBox import PopupBox
+
+from item import Item
+from video.videoitem import VideoItem
+from gui.ProgressBox import ProgressBox
+from BeautifulSoup import BeautifulSoup, SoupStrainer
+
+INTERNAL_VERSION = '040708_02'
+CAC_URL = 'http://www.cinemovies.fr/'
+
+class TrailerVideoItem(VideoItem):
+    def __init__(self, name, url, parent):
+        VideoItem.__init__(self, url, parent)
+        self.name = name
+        self.type = 'trailers'
+
+class PluginInterface(plugin.MainMenuPlugin):
+    """
+    A freevo interface to http://www.cinemovies.fr
+
+    plugin.activate('video.cinemovies')
+    """
+    def __init__(self):
+        plugin.MainMenuPlugin.__init__(self)
+
+    def items(self, parent):
+        return [ MovieTrailers(parent), DVDTrailers(parent) ]
+
+class MovieTrailers(Item):
+    def __init__(self, parent):
+        Item.__init__(self, parent)
+        self.name = _('Voir les bandes annonces de film')
+        self.type = 'trailers'
+
+    def actions(self):
+        return [ (self.make_menu_week, 'Titres de films') ]
+
+    def make_menu_week(self, arg=None, menuw=None):
+      items = generate_common_menu(self, "Recuperation des bandes annonces", 
"calendrier_fr-1-")
+      menuw.pushmenu(menu.Menu(_('Bandes annonces disponibles'), items))
+
+    def play_video(self, arg=None, menuw=None):
+      items = generate_common_stream_list(self, arg[1] )
+      menuw.pushmenu(menu.Menu(arg[0], items))
+
+class DVDTrailers(Item):
+    def __init__(self, parent):
+        Item.__init__(self, parent)
+        self.name = _('Voir les sorties DVD')
+        self.type = 'trailers'
+
+    def actions(self):
+        return [ (self.make_menu_week, 'Titres DVD') ]
+
+    def make_menu_week(self, arg=None, menuw=None):
+      items = generate_common_menu(self, "Recuperation des bandes annonces 
DVD", "calendrier_dvd-8-")
+      menuw.pushmenu(menu.Menu(_('Bandes annonces DVD disponibles'), items))
+
+    def play_video(self, arg=None, menuw=None):
+      items = generate_common_stream_list(self, arg[1] )
+      menuw.pushmenu(menu.Menu(arg[0], items))
+      
+# headers for urllib2
+txdata = None
+txheaders = {
+    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) 
Opera 8.51',
+    'Accept-Language': 'fr-fr',
+}
+
+#Generate a menu, whatever we are searching for DVD or movies
+def generate_common_menu(parent, title_box, page_prefix):
+  items = []
+
+  #Start grabbing from DVD/Movies of last week
+  current = datetime.date.today() - datetime.timedelta(days=7)
+  for week in [0, 1, 2, 3, 4, 5, 6]:
+    # Compute a new date for the week
+    newdate = current + datetime.timedelta(days=(week*7))
+    # Show some progress
+    box = PopupBox(text=_(title_box+'\nSemaine du 
'+newdate.strftime("%d/%m/%Y")))
+    box.show()
+
+    filehtml = page_prefix + newdate.strftime("%Y") + \
+              newdate.strftime("%m") + newdate.strftime("%d") + ".html"
+    #print "URL to fetch : %s" % filehtml
+    trailers = get_movie_list_week(CAC_URL + filehtml)
+    for title, idfilm in trailers:
+      items.append(menu.MenuItem('%s' % (title + " (" + 
newdate.strftime("%d/%m/%Y") + ")"),
+                                       parent.play_video, (title, idfilm) ) )
+    box.destroy()
+
+  return items
+
+# Generate the list of streams of a specific movie
+def generate_common_stream_list( object, idfilm ):
+  items = []
+      
+  box = PopupBox(text=_('Recuperation des types de bande annonces 
disponibles'))
+  box.show()
+      
+  streamlist = get_movie_sheet( idfilm )
+  if streamlist:
+    for title, streamurl in streamlist:
+      items.append(TrailerVideoItem(title, streamurl, object))
+  else:
+    items.append( menu.MenuItem('Pas de bande annonce dispo', None, None) )
+        
+  box.destroy()
+  return items
+    
+# Parse the 'player.php' file to get the stream URL
+def get_stream_url(idfilm, idba):  
+  # Get the URL
+  url = CAC_URL + "players/video.php?IDfilm=" + idfilm + "&IDBA=" + idba
+  req = urllib2.Request(url, txdata, txheaders)
+  try:
+    response = urllib2.urlopen(req)
+  except urllib2.HTTPError, error:
+    exit
+  
+  # Build the soup tree
+  links = SoupStrainer('script')
+  soup  = BeautifulSoup( response.read(), parseOnlyThese=links )
+  re_QT = re.compile('^QT_WriteOBJECT_XHTML\(\'(.*?)\',.*')
+  re_RM = re.compile('.*AC_RunRealContentX\(.*, \"SRC\", \"(.*?)\"\);')
+  re_WM = re.compile('.*name=\"filename\" value=\"(.*?)\".*')
+  
+  # Get the list of javascript tags to the streams
+  scriptlist = soup.findAll("script")
+  for script in scriptlist:
+    if script.string:
+      httpstr = re_QT.search(script.string)
+      if httpstr:
+        return httpstr.group(1)
+      else:
+        httpstr = re_RM.search(script.string)
+        if httpstr:
+          return httpstr.group(1)
+        else:
+          httpstr = re_WM.search(script.string)
+          if httpstr:
+            return  httpstr.group(1)
+  
+  return None
+    
+# Parse the 'fiche_multimedia' file to get the player URL
+def get_movie_sheet(idfilm):
+  # Get the URL
+  url = CAC_URL + 'fiche_multimedia.php?IDfilm=' + idfilm
+  req = urllib2.Request(url, txdata, txheaders)
+  try:
+    response = urllib2.urlopen(req)
+  except urllib2.HTTPError, error:
+    exit
+  
+  # Build the soup tree
+  links = SoupStrainer('td')
+  soup  = BeautifulSoup(response.read(), parseOnlyThese=links )
+  re_idba = re.compile('.*IDBA=([0-9]*).*', re.I)
+  re_res  = re.compile('haute r.*', re.I)
+  streams = []
+  
+  # Find the kind of trailer that are listed below
+  tdlist = soup.findAll("td", {"class" : ['arial8black', 
'tail_disclaimer_grey8point', 'arial9black3'] } )
+  title_part1 = "Bande annonce"
+  title_type  = "(Type de video inconnu)"
+  for td in tdlist:
+    # We have found the type of BA and the type of streams
+    if td['class'] == 'arial8black':
+      if td.a:
+        if td.a.string:
+          if re_res.search(td.a.string):
+            idba = re_idba.search(td.a['href'])
+            if idba:
+              streamurl = get_stream_url( idfilm, idba.group(1) )
+              streams += [ (title_part1 + " " + title_type, streamurl) ]
+              #print title_part1 + " " + title_type
+    # We have found the type of BA, search for the type of streams
+    if td['class'] == 'tail_disclaimer_grey8point':
+      if td.p:
+        if td.p.img:
+          if td.p.img['src'] == "images/data/ba/quicktime_ico.gif":
+            title_type = "(Quicktime)"
+          if td.p.img['src'] == "images/v2/div/player/real2.gif":
+            title_type = "(Real Media)"
+          if td.p.img['src'] == "images/data/ba/wmp_ico.gif":
+            title_type = "(Windows Media)"
+    # We are searching eventually a new type of BA
+    if td['class'] == 'arial9black3':
+      if td.b:
+        if td.b.string == "Bande annonce vf":
+          title_part1 = "Bande annonce VF"
+        if td.b.string == "Bande annonce vost":
+          title_part1 = "Bande annonce VOST"
+        if td.b.string == "Teaser vf":
+          title_part1 = "Teaser VF"
+        if td.b.string == "Teaser vost":
+          title_part1 = "Teaser VOST"
+      
+  return streams
+    
+
+# Return the list of tupple movie title and URL to the stream
+def get_movie_list_week(url):
+  trailers = []
+  
+  req = urllib2.Request(url, txdata, txheaders)
+  try:
+    response = urllib2.urlopen(req)
+  except urllib2.HTTPError, error:
+    exit
+  
+  # Build the soup tree
+  links = SoupStrainer('a')
+  soup  = BeautifulSoup( response.read(), parseOnlyThese=links )
+  re_id = re.compile('.*IDfilm=([0-9]*)', re.I)
+  
+  # Search all the movie title in the page
+  titletag = soup.findAll("a", {"class" : "style6"} )
+  for title in titletag:
+    idfilm = re_id.search(title['href'])
+    # If the ID is found, then check if a trailer is available
+    if idfilm:
+        # If some trailers are available (because the like is present, then we 
push it in the list
+        fiche_tag = soup.find("a", {"href" : 
"fiche_multimedia.php?IDfilm="+idfilm.group(1)} )
+        if fiche_tag:
+          fiche_tag.extract()
+          trailers += [ (title.next.string, idfilm.group(1)) ]
+
+  return trailers
+    
+

-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell.  From the desktop to the data center, Linux is going
mainstream.  Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to