Skip to content

Commit f3ef413

Browse files
committed
Implement sleep timer and fix volume bug
1 parent f929e69 commit f3ef413

File tree

4 files changed

+69
-8
lines changed

4 files changed

+69
-8
lines changed

api.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,21 @@ def render_POST(self, request):
2020
class SleepTimerResource(Resource):
2121
def render_GET(self, request):
2222
timeinminutes = player.PLAYER.get_sleep_timer()
23-
return b''
23+
return ('{"sleeptimer":' + str(timeinminutes) + ' }').encode('utf8')
2424

2525
def render_POST(self, request):
26-
timeinminutes = 1
27-
player.PLAYER.set_sleep_timer(timeinminutes)
26+
content = request.content.getvalue().decode('utf8')
27+
data = json.loads(content)
28+
29+
if 'time' in data:
30+
timeinminutes = data['time']
31+
player.PLAYER.set_sleep_timer(timeinminutes)
2832
return b''
2933

34+
def cancel(self):
35+
player.PLAYER.set_sleep_timer(0)
36+
37+
3038
class StreamUrlListResource(Resource):
3139
def render_GET(self, request):
3240
streamlist = [{'name': 'Hardbase', 'url': 'http://listen.hardbase.fm/tunein-mp3-pls', 'orderid': 1},
@@ -65,4 +73,4 @@ def render_GET(self, request):
6573
# 90 -> 100
6674
vol = int((int(vol) - 60) / 0.3)
6775

68-
return b'{"volume":' + str(vol) + ' }'
76+
return ('{"volume":' + str(vol) + ' }').encode('utf8')

backend/VLCPlayer.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
from .IPlayerInterface import IPlayer
21
import vlc
32

3+
from .IPlayerInterface import IPlayer
4+
from .sleep import Sleep
5+
46
class Player(IPlayer):
57

68
def __init__(self):
79
self.instance = vlc.Instance("--no-xlib")
810
self.player = self.instance.media_player_new()
9-
self.sleep_timer = 0
11+
self.sleep_timer = None
1012

1113
def play(self, url):
1214
media = self.instance.media_new(url)
@@ -24,7 +26,18 @@ def set_volume(self, volume):
2426
self.player.audio_set_volume(volume)
2527

2628
def set_sleep_timer(self, timeInMinutes):
27-
self.sleep_timer = timeInMinutes
29+
"""
30+
Create a new sleep timer. Cancels any existing timers.
31+
When set to 0 cancles timers.
32+
"""
33+
if self.sleep_timer:
34+
self.sleep_timer.cancel()
35+
36+
if timeInMinutes > 0:
37+
self.sleep_timer = Sleep(timeInMinutes, self.stop)
2838

2939
def get_sleep_timer(self):
30-
return self.sleep_timer
40+
if self.sleep_timer:
41+
return self.sleep_timer.remaining()
42+
else:
43+
return 0

backend/sleep.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from time import time
2+
from threading import Timer
3+
4+
5+
class Sleep():
6+
def __init__(self, sleepInMinutes, callbackFnc):
7+
self.__time_in_sec = sleepInMinutes * 60
8+
self.__callback = callbackFnc
9+
self.__start_time = time()
10+
self.start()
11+
12+
def start(self):
13+
print("start sleep timer with " + str(self.__time_in_sec))
14+
self.__timer = Timer(self.__time_in_sec, self.__callback)
15+
self.__timer.start()
16+
17+
def cancel(self):
18+
self.__timer.cancel()
19+
20+
def remaining(self):
21+
# time passed - time set * 60 for minutes
22+
print(time())
23+
print(self.__start_time)
24+
remaining_time = (self.__time_in_sec - (time() - self.__start_time)) / 60
25+
26+
if remaining_time < 0:
27+
remaining_time = 0
28+
29+
return int(remaining_time)

service.tac

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# You can run this .tap file directly with:
22
# twistd -ny service.tac
33

4+
from twisted.internet import reactor, defer
45
from twisted.application import service, internet
56
from twisted.web.server import Site
67
from twisted.web.static import File
@@ -18,10 +19,13 @@ factory = WebSocketServerFactory("ws://localhost:9000")
1819
factory.protocol = websocket.MpdProtocol
1920
# factory.setProtocolOptions(maxConnections=2)
2021

22+
sleep_timer = api.SleepTimerResource()
23+
2124
root = Resource()
2225
root.putChild(b"play", api.PlayResource())
2326
root.putChild(b"stop", api.StopResource())
2427
root.putChild(b"volume", api.VolumeResource())
28+
root.putChild(b"sleeptimer", sleep_timer)
2529
root.putChild(b"streamurls", api.StreamUrlListResource())
2630
root.putChild(b"index", File('index.html'))
2731
site = Site(root)
@@ -32,3 +36,10 @@ internet.TCPServer(9000, factory).setServiceParent(rpi_service)
3236
application = service.Application("Radio Pi")
3337
# attach the service to its parent application
3438
rpi_service.setServiceParent(application)
39+
40+
# cancel running sleeptimer
41+
@defer.inlineCallbacks
42+
def graceful_shutdown():
43+
yield sleep_timer.cancel()
44+
45+
reactor.addSystemEventTrigger('before', 'shutdown', graceful_shutdown)

0 commit comments

Comments
 (0)