2007-08-14 18:10:53 -07:00
import pygtk
import gtk
2007-08-26 06:15:05 -07:00
import pygst
import gst
import gobject
2007-09-04 05:19:21 -07:00
import pango
2007-08-14 18:10:53 -07:00
import clutter
2007-12-02 02:18:18 -08:00
import os
2007-08-26 06:15:05 -07:00
from clutter import cluttergst
2007-09-05 03:16:17 -07:00
from VideoController import VideoController
2007-11-19 03:38:15 -08:00
from modules . video_player . cover_viewer import coverViewer
2007-12-03 05:19:43 -08:00
from modules . video_player . folder_menu import folderMenu
2007-08-14 18:10:53 -07:00
2007-11-19 03:38:15 -08:00
class Module ( ) :
title = " Videos "
menu_image = " videos.png "
2007-12-05 03:49:50 -08:00
coverViewerWidth = 750
2007-12-03 05:19:43 -08:00
coverViewerHeight = 600
2007-12-05 03:49:50 -08:00
coverViewerPosX = 250
coverViewerPosY = 20
2007-12-03 05:19:43 -08:00
coverViewerRows = 3
coverViewerColumns = 4
cover_size = int ( coverViewerWidth / coverViewerColumns )
2007-08-14 18:10:53 -07:00
2007-11-19 03:38:15 -08:00
def __init__ ( self , MenuMgr , dbMgr ) :
self . stage = MenuMgr . get_stage ( )
2007-11-22 02:41:29 -08:00
self . MenuMgr = MenuMgr
2007-12-03 05:19:43 -08:00
self . dbMgr = dbMgr
self . viewerLibrary = [ ]
self . folderLibrary = [ ]
2007-11-19 03:38:15 -08:00
self . videoController = VideoController ( self . stage )
2007-08-14 18:10:53 -07:00
self . is_playing = False
2007-12-05 03:49:50 -08:00
self . controlState = " folder " #Options are "folder", "cover" or "video"
self . foldersPosX = ( self . coverViewerPosX - self . cover_size ) / 2
self . foldersPosY = ( self . stage . get_height ( ) - self . coverViewerHeight ) / 2
2007-08-14 18:10:53 -07:00
#This block can be moved to begin() but causes a performance hit when loading the module *shrug*
2007-12-03 05:19:43 -08:00
#base_cover_viewer = coverViewer(self.stage, self.coverViewerWidth, self.coverViewerHeight)
#self.viewerLibrary.append(base_cover_viewer)
#self.currentViewer = base_cover_viewer
2007-12-02 02:18:18 -08:00
self . baseDir = dbMgr . get_setting ( " VideoStartupDir " )
2007-12-03 05:19:43 -08:00
self . cwd = self . baseDir
self . folder_level = 0
base_folder_menu = folderMenu ( self . stage , self . coverViewerRows , self . cover_size )
2007-12-05 03:49:50 -08:00
base_folder_menu . set_position ( self . foldersPosX , self . foldersPosY )
2007-12-03 05:19:43 -08:00
self . folderLibrary . append ( base_folder_menu )
self . load_base_folders ( self . baseDir , base_folder_menu )
self . currentViewer = base_folder_menu . get_current_viewer ( )
#self.loadDir(self.baseDir, base_cover_viewer)
#results = dbMgr.get_videos()
def load_base_folders ( self , dirPath , folder_menu ) :
new_file_list = os . listdir ( dirPath )
#Images and Directories
for dir_entry in new_file_list :
tempPath = dirPath + " / " + dir_entry
if os . path . isdir ( tempPath ) and not ( dir_entry [ 0 ] == " . " ) :
tempViewer = coverViewer ( self . stage , self . coverViewerWidth , self . coverViewerHeight , self . coverViewerRows , self . coverViewerColumns )
self . loadDir ( tempPath , tempViewer )
folder_menu . add_base_dir ( dir_entry , tempViewer )
2007-09-03 06:13:34 -07:00
2007-12-03 05:19:43 -08:00
def loadDir ( self , dirPath , cover_viewer ) :
2007-12-02 02:18:18 -08:00
if not os . path . isdir ( dirPath ) :
print " ERROR: Invalid path "
return None
final_file_list = [ ]
new_file_list = os . listdir ( dirPath )
#Images and Directories
for dir_entry in new_file_list :
if os . path . isdir ( dirPath + " / " + dir_entry ) and not ( dir_entry [ 0 ] == " . " ) :
2007-12-03 05:19:43 -08:00
cover_viewer . add_folder ( dir_entry )
2007-12-02 02:18:18 -08:00
print dir_entry
else :
final_file_list . append ( dir_entry )
2007-12-03 05:19:43 -08:00
#Check if we're empty
if len ( final_file_list ) == 0 :
return
#Make sure the dirPath ends in "/"
if not dirPath [ - 1 ] == " / " :
dirPath = dirPath + " / "
#Generate some SQL to retrieve videos that were in the final_file_list
#Load the videos into the cover viewer
sql = " SELECT * FROM videometadata WHERE filename IN ( "
for filename in final_file_list :
filename = dirPath + filename
sql = sql + " \" " + filename + " \" , "
sqlLength = int ( len ( sql ) - 2 )
sql = sql [ : sqlLength ]
sql = sql + " ) "
2007-12-05 03:49:50 -08:00
#print sql
2007-12-03 05:19:43 -08:00
results = self . dbMgr . run_sql ( sql )
#Check for null return
if results == None :
print " VideoPlayer: No connection to DB or no videos found in DB "
return None
#Else add the entries in
for record in results :
tempVideo = videoItem ( )
tempVideo . importFromMythObject ( record )
cover_viewer . add_video ( tempVideo )
2007-12-02 02:18:18 -08:00
2007-11-19 03:38:15 -08:00
#Action to take when menu item is selected
def action ( self ) :
return self
2007-09-03 06:13:34 -07:00
2007-08-14 18:10:53 -07:00
def on_key_press_event ( self , stage , event ) :
2007-12-05 03:49:50 -08:00
up = clutter . keysyms . Up
down = clutter . keysyms . Down
left = clutter . keysyms . Left
right = clutter . keysyms . Right
if event . keyval == clutter . keysyms . q :
clutter . main_quit ( )
#*****************************************************************
#"State based input handling
if self . controlState == " folder " :
if event . keyval == clutter . keysyms . Escape :
return True
elif event . keyval == right :
self . controlState = " cover "
self . currentViewer = self . folderLibrary [ self . folder_level ] . get_current_viewer ( )
self . currentViewer . select_first ( )
self . folderLibrary [ self . folder_level ] . on_key_press_event ( event )
#**********************************************************
elif self . controlState == " video " :
2007-09-05 03:16:17 -07:00
if event . keyval == clutter . keysyms . Escape :
self . videoController . stop_video ( )
self . is_playing = False
2007-12-05 03:49:50 -08:00
self . controlState = " cover "
2007-09-05 03:16:17 -07:00
else :
self . videoController . on_key_press_event ( event )
2007-12-05 03:49:50 -08:00
2007-09-05 03:16:17 -07:00
return False
2007-12-05 03:49:50 -08:00
if event . keyval == clutter . keysyms . p :
if self . paused :
self . unpause ( )
else :
self . pause ( )
#**********************************************************
elif self . controlState == " cover " :
if ( event . keyval == up ) or ( event . keyval == down ) or ( event . keyval == left ) or ( event . keyval == right ) :
self . currentViewer . on_key_press_event ( event )
2007-08-29 06:35:13 -07:00
2007-12-05 03:49:50 -08:00
if event . keyval == clutter . keysyms . Return :
#Find whether the current item is a folder or video
item = self . currentViewer . get_current_item ( )
if item . isFolder :
self . MenuMgr . display_msg ( " Msg " , " Its a folder " )
else :
self . play_video ( )
2007-09-05 03:16:17 -07:00
2007-12-05 03:49:50 -08:00
if event . keyval == clutter . keysyms . Escape :
self . currentViewer . select_none ( )
self . controlState = " folder "
2007-09-05 03:16:17 -07:00
2007-08-29 06:35:13 -07:00
2007-08-14 18:10:53 -07:00
def begin ( self , MenuMgr ) :
2007-11-22 02:41:29 -08:00
#Check that the library actually contains something
2007-12-03 05:19:43 -08:00
if self . currentViewer . num_covers == 0 :
2007-11-22 02:41:29 -08:00
self . MenuMgr . display_msg ( " Error: No videos " , " There are no videos available in the library. This maybe caused by an empty library or a failed connection to the server. " )
self . stop ( )
return
2007-09-03 06:13:34 -07:00
2007-08-14 18:10:53 -07:00
#Create a backdrop for the player. In this case we just use the same background as the menus
self . backdrop = clutter . CloneTexture ( MenuMgr . get_skinMgr ( ) . get_Background ( ) )
self . backdrop . set_size ( self . stage . get_width ( ) , self . stage . get_height ( ) )
self . backdrop . set_opacity ( 0 )
self . backdrop . show ( )
self . stage . add ( self . backdrop )
#Fade the backdrop in
timeline_begin = clutter . Timeline ( 10 , 40 )
alpha = clutter . Alpha ( timeline_begin , clutter . ramp_inc_func )
2007-11-05 04:51:39 -08:00
self . begin_behaviour = clutter . BehaviourOpacity ( alpha , 0 , 255 )
self . begin_behaviour . apply ( self . backdrop )
2007-08-14 18:10:53 -07:00
2007-12-03 05:19:43 -08:00
2007-12-05 03:49:50 -08:00
self . stage . add ( self . folderLibrary [ 0 ] )
self . folderLibrary [ 0 ] . show ( )
2007-12-03 05:19:43 -08:00
self . currentViewer . set_opacity ( 0 )
self . currentViewer . show_all ( )
self . currentViewer . show ( )
self . stage . add ( self . currentViewer )
2007-12-05 03:49:50 -08:00
#cover_x = self.coverViewerPosX #self.stage.get_width() - int(self.coverViewerWidth * 1.1)
self . currentViewer . set_position ( self . coverViewerPosX , self . coverViewerPosY )
2007-12-03 05:19:43 -08:00
#self.viewerLibrary[0].set_position(50, 40)
self . currentViewer . toggle_details ( ) #Turns the details group on
2007-12-05 03:49:50 -08:00
#self.currentViewer.select_first()
2007-12-03 05:19:43 -08:00
self . begin_behaviour . apply ( self . currentViewer )
2007-08-14 18:10:53 -07:00
timeline_begin . start ( )
2007-12-05 03:49:50 -08:00
#self.folder_menu = folderMenu(self.stage, self.currentViewer.num_visible_rows, self.currentViewer.cover_size)
#self.folder_menu.set_dir_cover_viewer(self.currentViewer)
2007-12-03 05:19:43 -08:00
2007-08-14 18:10:53 -07:00
def stop ( self ) :
2007-12-02 02:18:18 -08:00
self . MenuMgr . currentPlugin = None
2007-08-15 07:23:45 -07:00
#Fade everything out
timeline_stop = clutter . Timeline ( 10 , 30 )
alpha = clutter . Alpha ( timeline_stop , clutter . ramp_inc_func )
2007-11-05 04:51:39 -08:00
self . stop_behaviour = clutter . BehaviourOpacity ( alpha , 255 , 0 )
2007-12-03 05:19:43 -08:00
self . stop_behaviour . apply ( self . currentViewer )
2007-11-05 04:51:39 -08:00
self . stop_behaviour . apply ( self . backdrop )
2007-12-05 03:49:50 -08:00
self . stop_behaviour . apply ( self . folderLibrary [ self . folder_level ] )
2007-08-15 07:23:45 -07:00
timeline_stop . connect ( ' completed ' , self . destroyPlugin )
timeline_stop . start ( )
2007-11-22 02:41:29 -08:00
2007-08-15 07:23:45 -07:00
def destroyPlugin ( self , data ) :
2007-12-03 05:19:43 -08:00
self . stage . remove ( self . currentViewer )
2007-12-05 03:49:50 -08:00
self . stage . remove ( self . folderLibrary [ self . folder_level ] )
2007-08-15 07:23:45 -07:00
self . backdrop . hide ( )
#self.stage.remove(self.overlay)
2007-11-15 00:36:01 -08:00
def play_video ( self ) :
2007-12-03 05:19:43 -08:00
vid = self . currentViewer . get_current_item ( ) . video
2007-11-15 00:36:01 -08:00
uri = " file:// " + str ( vid . filename )
self . videoController . play_video ( uri , self )
self . is_playing = True
2007-12-05 03:49:50 -08:00
self . controlState = " video "
2007-11-15 00:36:01 -08:00
2007-12-03 05:19:43 -08:00
self . stage . remove ( self . currentViewer )
2007-08-15 07:23:45 -07:00
2007-11-13 05:03:39 -08:00
def stop_video ( self ) :
if not self . is_playing :
return
self . is_playing = False
2007-08-14 18:10:53 -07:00
2007-11-19 03:38:15 -08:00
timeline = clutter . Timeline ( 15 , 25 )
2007-12-03 05:19:43 -08:00
self . currentViewer . set_opacity ( 0 )
2007-11-19 03:38:15 -08:00
alpha = clutter . Alpha ( timeline , clutter . ramp_inc_func )
self . behaviour = clutter . BehaviourOpacity ( alpha , 0 , 255 )
2007-12-03 05:19:43 -08:00
self . behaviour . apply ( self . currentViewer )
2007-11-19 03:38:15 -08:00
2007-12-03 05:19:43 -08:00
self . stage . add ( self . currentViewer )
self . currentViewer . show ( )
2007-11-19 03:38:15 -08:00
timeline . start ( )
2007-08-14 18:10:53 -07:00
def pause ( self ) :
pass
def unpause ( self ) :
2007-08-26 06:15:05 -07:00
pass
2007-08-14 18:10:53 -07:00
class videoItem ( ) :
def __init ( self ) :
self . mythID = None
def importFromMythObject ( self , mythObject ) :
self . mythID = mythObject [ 0 ]
self . title = mythObject [ 1 ]
self . director = mythObject [ 2 ]
self . plot = mythObject [ 3 ]
self . rating = mythObject [ 4 ]
self . inetRef = mythObject [ 5 ]
self . year = mythObject [ 6 ]
self . userRating = mythObject [ 7 ]
self . length = mythObject [ 8 ]
self . showLevel = mythObject [ 9 ]
self . filename = mythObject [ 10 ]
self . coverfile = mythObject [ 11 ]
self . childID = mythObject [ 12 ]
self . browse = mythObject [ 13 ]
self . playCommand = mythObject [ 14 ]
self . category = mythObject [ 15 ]
def getTitle ( self ) :
return self . title
def getCoverfile ( self ) :
return self . coverfile
2007-11-13 05:03:39 -08:00