/
RaspberryPiMediaPlayer.py
160 lines (130 loc) · 5.2 KB
/
RaspberryPiMediaPlayer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
from Cocoa import *
from Foundation import NSObject
from PyObjCTools import AppHelper
from scp_handler import SCPHandler
from omxplayer import OMXPlayer
from threading import Thread
import os, re, time
def string_to_path(string):
rstring = string
chars_to_escape = (' ', '(', ')', '[', ']', ':')
for c in chars_to_escape:
rstring = rstring.replace(c, '\\'+c)
return rstring
class RPiMediaPlayerController(NSWindowController):
audio_formats = ['mp3','mpa','flac','ogg','wav','wma','m4a']
video_formats = ['avi','wmv','mpg','mpeg','mp4','mkv','m4v','m2v','mpv','ogv','flv','mov']
media_patterns = re.compile(".*\.("+"|".join(audio_formats+video_formats)+")$", re.IGNORECASE)
hostnameField = objc.IBOutlet()
usernameField = objc.IBOutlet()
passwordField = objc.IBOutlet()
filenameField = objc.IBOutlet()
messageField = objc.IBOutlet()
nowPlayingField = objc.IBOutlet()
playButton = objc.IBOutlet()
fButton = objc.IBOutlet()
ffButton = objc.IBOutlet()
bButton = objc.IBOutlet()
bbButton = objc.IBOutlet()
stopButton = objc.IBOutlet()
volupButton = objc.IBOutlet()
voldownButton = objc.IBOutlet()
uploadButton = objc.IBOutlet()
playButtons = (
'playButton',
'fButton',
'ffButton',
'bButton',
'bbButton',
'stopButton',
'volupButton',
'voldownButton',
)
def setPlayButtons(self,enable):
for button in self.playButtons:
eval('self.{}'.format(button)).setEnabled_(enable)
def scp_and_play(self):
self.scp_handler = SCPHandler(self.hostname,self.username,self.password)
self.remote_file = "/tmp/{}".format(self.filename.split("/")[-1])
self.scp_handler.scp(self.filename,self.remote_file)
filename = self.filename.split("/")[-1].replace("\\","")
self.messageField.setStringValue_("Upload starting...")
time.sleep(0.5)
while self.scp_handler.progress != 100:
time.sleep(0.1)
message = "Uploading {filename} to {remote}\nProgress: {p}%".format(
filename=filename,
remote=self.hostname,
p=self.scp_handler.progress)
self.messageField.setStringValue_(message)
message = "Uploading {filename} to {remote}\nProgress: Done".format(
filename=filename,
remote=self.hostname)
self.messageField.setStringValue_(message)
# start player
self.omxplayer = OMXPlayer(self.hostname, self.username, self.password)
self.omxplayer.play(self.remote_file)
self.nowPlayingField.setStringValue_("Currently Playing:\n{}".format(filename))
self.setPlayButtons(True)
# poll for status of video
# (don't start polling until omxplayer has had some time to get started)
time.sleep(10)
while self.omxplayer.playing:
time.sleep(1)
# reset when playing is done
self.setPlayButtons(False)
self.uploadButton.setEnabled_(True)
self.nowPlayingField.setStringValue_("Nothing playing")
def windowDidLoad(self):
NSWindowController.windowDidLoad(self)
self.setPlayButtons(False)
@objc.IBAction
def upload_(self, sender):
self.hostname = self.hostnameField.stringValue()
self.username = self.usernameField.stringValue()
self.password = self.passwordField.stringValue()
self.filename = self.filenameField.stringValue()
if not os.path.isfile(self.filename):
self.messageField.setStringValue_("File not found.")
return
if not self.media_patterns.match(self.filename):
self.messageField.setStringValue_("Please only provide audio or video files")
return
self.uploadButton.setEnabled_(False)
self.filename = string_to_path(self.filename)
scp_and_play_thread = Thread(target=self.scp_and_play, args=())
scp_and_play_thread.daemon = True
scp_and_play_thread.start()
@objc.IBAction
def playpause_(self, sender):
self.omxplayer.toggle_play()
@objc.IBAction
def f_(self, sender):
self.omxplayer.f()
@objc.IBAction
def ff_(self, sender):
self.omxplayer.ff()
@objc.IBAction
def b_(self, sender):
self.omxplayer.b()
@objc.IBAction
def bb_(self, sender):
self.omxplayer.bb()
@objc.IBAction
def volup_(self, sender):
self.omxplayer.volup()
@objc.IBAction
def voldown_(self, sender):
self.omxplayer.voldown()
@objc.IBAction
def stop_(self, sender):
self.omxplayer.close()
self.setPlayButtons(False)
self.uploadButton.setEnabled_(True)
self.nowPlayingField.setStringValue_("Nothing playing")
if __name__=="__main__":
app = NSApplication.sharedApplication()
playerController = RPiMediaPlayerController.alloc().initWithWindowNibName_("RaspberryPiMediaPlayer")
playerController.showWindow_(playerController)
NSApp.activateIgnoringOtherApps_(True)
AppHelper.runEventLoop()