1
1
#!/usr/bin/python
2
2
3
- from gevent import monkey ; monkey . patch_all ()
4
- from ws4py . client . geventclient import WebSocketClient
5
- import base64 , binascii , json , pprint , re , requests , string , sys , time , gevent , operator
3
+ from ws4py . client . threadedclient import WebSocketClient
4
+ from threading import Thread , Event
5
+ import base64 , binascii , json , re , requests , sys , operator
6
6
7
7
from .proto import mercury_pb2 , metadata_pb2
8
8
from .proto import playlist4changes_pb2 , playlist4content_pb2
@@ -38,7 +38,7 @@ class WrapAsync():
38
38
timeout = 10
39
39
40
40
def __init__ (self , callback , func , * args ):
41
- self .marker = gevent . event . AsyncResult ()
41
+ self .marker = Event ()
42
42
43
43
if callback == None :
44
44
callback = self .callback
@@ -50,17 +50,20 @@ def __init__(self, callback, func, *args):
50
50
func (* args , callback = callback )
51
51
52
52
def callback (self , * args ):
53
- self .marker .set (args )
53
+ self .data = args
54
+ self .marker .set ()
54
55
55
56
def get_data (self ):
56
57
try :
57
- data = self .marker .get (timeout = self .timeout )
58
+ self .marker .wait (timeout = self .timeout )
58
59
59
- if len (data ) > 0 and type (data [0 ] == SpotifyAPI ):
60
- data = data [1 :]
60
+ if len (self . data ) > 0 and type (self . data [0 ] == SpotifyAPI ):
61
+ self . data = self . data [1 :]
61
62
62
- return data if len (data ) > 1 else data [0 ]
63
+ return self . data if len (self . data ) > 1 else self . data [0 ]
63
64
except :
65
+ print "There was an error, disconnecting! Details below:"
66
+ print sys .exc_info ()
64
67
return False
65
68
66
69
class SpotifyClient (WebSocketClient ):
@@ -70,6 +73,12 @@ def set_api(self, api):
70
73
def opened (self ):
71
74
self .api_object .login ()
72
75
76
+ def received_message (self , m ):
77
+ self .api_object .recv_packet (m )
78
+
79
+ def closed (self , code , message ):
80
+ self .api_object .shutdown ()
81
+
73
82
class SpotifyUtil ():
74
83
@staticmethod
75
84
def gid2id (gid ):
@@ -127,7 +136,8 @@ class SpotifyAPI():
127
136
def __init__ (self , login_callback_func = False ):
128
137
self .auth_server = "play.spotify.com"
129
138
130
- self .logged_in_marker = gevent .event .AsyncResult ()
139
+ self .logged_in_marker = Event ()
140
+ self .heartbeat_marker = Event ()
131
141
self .username = None
132
142
self .password = None
133
143
self .account_type = None
@@ -186,9 +196,6 @@ def auth(self, username, password):
186
196
187
197
self .settings = resp .json ()["config" ]
188
198
189
- def auth_from_json (self , json ):
190
- self .settings = json
191
-
192
199
def populate_userdata_callback (self , sp , resp , callback_data ):
193
200
self .username = resp ["user" ]
194
201
self .country = resp ["country" ]
@@ -197,7 +204,7 @@ def populate_userdata_callback(self, sp, resp, callback_data):
197
204
if self .login_callback != False :
198
205
self .do_login_callback (True )
199
206
else :
200
- self .logged_in_marker .set (True )
207
+ self .logged_in_marker .set ()
201
208
self .chain_callback (sp , resp , callback_data )
202
209
203
210
def logged_in (self , sp , resp ):
@@ -213,9 +220,9 @@ def login(self):
213
220
214
221
def do_login_callback (self , result ):
215
222
if self .login_callback != False :
216
- gevent . spawn ( self .login_callback , self , result )
223
+ Thread ( target = self .login_callback , args = ( self , result )). start ( )
217
224
else :
218
- self .logged_in_marker .set (False )
225
+ self .logged_in_marker .set ()
219
226
220
227
def track_uri (self , track , callback = False ):
221
228
tid = self .recurse_alternatives (track )
@@ -599,18 +606,10 @@ def handle_error(self, err):
599
606
else :
600
607
Logging .error (major_str + " - " + minor_str )
601
608
602
- def event_handler (self ):
603
- while self .disconnecting == False :
604
- m = self .ws .receive ()
605
- if m is not None :
606
- self .recv_packet (str (m ))
607
- else :
608
- break
609
-
610
609
def heartbeat_handler (self ):
611
610
while self .disconnecting == False :
612
- gevent .sleep (15 )
613
611
self .heartbeat ()
612
+ self .heartbeat_marker .wait (timeout = 15 )
614
613
615
614
def connect (self , username , password , timeout = 10 ):
616
615
if self .settings == None :
@@ -620,27 +619,29 @@ def connect(self, username, password, timeout = 10):
620
619
self .password = password
621
620
622
621
Logging .notice ("Connecting to " + self .settings ["aps" ]["ws" ][0 ])
623
-
622
+
624
623
try :
625
624
self .ws = SpotifyClient (self .settings ["aps" ]["ws" ][0 ])
626
625
self .ws .set_api (self )
627
626
self .ws .connect ()
628
- self .greenlets = [
629
- gevent .spawn (self .event_handler ),
630
- gevent .spawn (self .heartbeat_handler )
631
- ]
627
+ Thread (target = self .heartbeat_handler ).start ()
632
628
if self .login_callback != False :
633
- gevent . joinall ( self . greenlets )
629
+ return
634
630
else :
635
631
try :
636
- return self .logged_in_marker .get (timeout = timeout )
632
+ self .logged_in_marker .wait (timeout = timeout )
633
+ return self .is_logged_in
637
634
except :
638
635
return False
639
636
except :
640
637
self .disconnect ()
638
+ print "There was an error, disconnecting! Details below:"
639
+ print sys .exc_info ()
641
640
return False
642
641
643
- def disconnect (self ):
642
+ def shutdown (self ):
644
643
self .disconnecting = True
645
- gevent .sleep (1 )
646
- gevent .killall (self .greenlets )
644
+ self .heartbeat_marker .set ()
645
+
646
+ def disconnect (self ):
647
+ self .ws .close ()
0 commit comments