Ivars 6 년 전
부모
커밋
3e8c0375ec
9개의 변경된 파일1022개의 추가작업 그리고 944개의 파일을 삭제
  1. 11
    11
      addon.py
  2. 2
    2
      addon.xml
  3. 9
    0
      changelog.md
  4. 26
    14
      context_download.py
  5. 6
    4
      kmake.bat
  6. 853
    812
      project.wpr
  7. 2
    1
      resources/language/English/strings.xml
  8. 6
    0
      resources/settings.xml
  9. 107
    100
      wingdbstub.py

+ 11
- 11
addon.py 파일 보기

@@ -1,15 +1,15 @@
1 1
 # -*- coding: utf-8 -*-
2
+
2 3
 try:
3 4
     import wingdbstub
5
+    #import ptvsd
6
+    #ptvsd.enable_attach("debug", address = ('127.0.0.1', 5678))
7
+    #ptvsd.wait_for_attach()
8
+    print "[playstream] Remote debug started"
4 9
 except:
10
+    print "[playstream] Remote debug skipped"
5 11
     pass
6
-#try:
7
-#    import ptvsd
8
-#    ptvsd.enable_attach("debug")
9
-#    ptvsd.wait_for_attach()
10
-#except:
11
-#    pass
12
-import os,os.path,sys, glob, shutil, re
12
+import os, os.path,sys, glob, shutil, re
13 13
 import urllib, traceback
14 14
 try:
15 15
     import cPickle as pickle
@@ -100,7 +100,6 @@ for source in sources.plugins:
100 100
     sources.plugins[source].options_write(options)
101 101
 
102 102
 
103
-
104 103
 @plugin.route(".+" )
105 104
 def main():
106 105
     global prefix
@@ -229,8 +228,9 @@ def play_video(streams):
229 228
     if len(streams)>1:
230 229
         slist = []
231 230
         for s in streams:
232
-            slist.append("%s [%s,%s]"%(s["name"],s["quality"],s["lang"]))
233
-        res = xbmcgui.Dialog().select("Select stream",slist, useDetails=True) if not CLI_MODE else 0
231
+            name2 = "%s,%s" % (s["quality"],s["lang"]) if s["lang"] else s["quality"]
232
+            slist.append("[%s] %s"%(name2, s["name"]))
233
+        res = xbmcgui.Dialog().select("Select stream",slist) if not CLI_MODE else 0
234 234
         #res = xbmcgui.Dialog().contextmenu(slist) if not CLI_MODE else 0
235 235
         stream = streams[res]
236 236
     else:
@@ -303,7 +303,7 @@ def get_view_mode(vm):
303 303
             "Banner": 501,
304 304
             "FanArt": 502
305 305
         },
306
-            "skin.estuary.isl": {
306
+        "skin.estuary.isl": {
307 307
             "None": None,
308 308
             "List": 50,
309 309
             "Poster": 51,

+ 2
- 2
addon.xml 파일 보기

@@ -1,10 +1,10 @@
1 1
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
-<addon version="0.1.83" id="plugin.video.playstream" name="PlayStream" provider-name="ivars777"  >
2
+<addon version="0.1.94" id="plugin.video.playstream" name="PlayStream" provider-name="ivars777"  >
3 3
   <requires>
4 4
     <import addon="xbmc.python" version="2.1.0"/>
5 5
     <import addon="script.module.requests" />
6 6
     <import addon="script.module.simplejson" />
7
-    <import addon="script.module.pycryptodome" optional="true"/>
7
+    <import addon="script.module.twisted" optional="true"/>
8 8
   </requires>
9 9
   <extension point="xbmc.python.pluginsource" library="addon.py">
10 10
     <provides>video</provides>

+ 9
- 0
changelog.md 파일 보기

@@ -1,3 +1,12 @@
1
+**0.1.94** (04.09.2018):
2
+- [fix] salabots TVPlay (raidījumu kategorijas)
3
+
4
+**0.1.93** (04.09.2018):
5
+- [feature] pievienota iespēja spēlēt strīmus no enigma2 satelītuztvērēja
6
+
7
+**0.1.91** (21.08.2018):
8
+- [feature] pievienots jaunais tvplay (nepareiza mime-type dēļ nerādās bildes)
9
+
1 10
 **0.1.77** (28.06.2018):
2 11
 - [change] salabots, lai strādā ar Kodi 18 (alpha2)
3 12
 

+ 26
- 14
context_download.py 파일 보기

@@ -89,7 +89,8 @@ def download_video(title, data, download_dir, overwrite, cb_notify=None, num=Non
89 89
     if len(streams)>1 and not num:
90 90
         slist = []
91 91
         for s in streams:
92
-            slist.append("%s [%s,%s]"%(s["name"],s["quality"],s["lang"]))
92
+            name2 = "%s,%s" % (s["quality"],s["lang"]) if s["lang"] else s["quality"]
93
+            slist.append("[%s] %s"%(name2, s["name"]))
93 94
         res = xbmcgui.Dialog().select("Select stream",slist) if not CLI_MODE else 0
94 95
         #res = xbmcgui.Dialog().contextmenu(slist) if not CLI_MODE else 0
95 96
         stream = streams[res]
@@ -215,9 +216,13 @@ def download_hls(url, outputfile, headers=None, overwrite=True, limit=None, cb_n
215 216
 #    if not "User-Agent" in headers:
216 217
 #        headers["User-Agent"] = UA
217 218
     #outputfile = file.join(download_dir,output)
219
+    if "/" in outputfile:
220
+        output = outputfile.split('/')[-1]
221
+    else:
222
+        output = outputfile.split('\\')[-1]
218 223
 
219
-    if cb_notify: cb_notify("Download started - %s" % outputfile)
220
-    print "Download started - %s" % outputfile, url
224
+    if cb_notify: cb_notify("Download started - %s" % output)
225
+    print "Download started - %s" % output
221 226
     #print url
222 227
 
223 228
 
@@ -277,17 +282,20 @@ def download_hls(url, outputfile, headers=None, overwrite=True, limit=None, cb_n
277 282
         r = requests.get(url2, headers=headers, verify=False)
278 283
         content = r.content
279 284
         if key:
280
-            #from Crypto.Cipher import AES
281
-            import pyaes
285
+            try:
286
+                from Cryptodome.Cipher import AES
287
+            except:
288
+                raise Exception("No Crypto or Cryptodome library")
289
+            #import pyaes
282 290
             iv = content[:16]
283 291
             #key2 = binascii.a2b_hex(key)
284
-            #d = AES.new(key, AES.MODE_CBC, iv)
285
-            d = pyaes.AESModeOfOperationCBC(key, iv = iv)
286
-            content2 = ""
287
-            for i in range(16, len(content), 16):
288
-                content2 += d.decrypt(content[i:i+16])
289
-            content = content2
290
-            #content = d.decrypt(content[16:])
292
+            d = AES.new(key, AES.MODE_CBC, iv)
293
+            #d = pyaes.AESModeOfOperationCBC(key, iv = iv)
294
+            #content2 = ""
295
+            #for i in range(16, len(content), 16):
296
+            #    content2 += d.decrypt(content[i:i+16])
297
+            #content = content2
298
+            content = d.decrypt(content[16:])
291 299
             #d = pyaes.Decrypter(pyaes.AESModeOfOperationCBC(key, iv))
292 300
             #content = d.feed(content[16:])
293 301
         tsfile.write(content)
@@ -343,9 +351,13 @@ def download_file(url, outputfile, headers=None, overwrite=True, limit=None, cb_
343 351
 #    if not "User-Agent" in headers:
344 352
 #        headers["User-Agent"] = UA
345 353
     #fname = file.join(download_dir,output)
354
+    if "/" in outputfile:
355
+        output = outputfile.split('/')[-1]
356
+    else:
357
+        output = outputfile.split('\\')[-1]
346 358
 
347
-    if cb_notify: cb_notify("Download started - %s" % outputfile)
348
-    print "Download started - %s" % outputfile
359
+    if cb_notify: cb_notify("Download started - %s" % output)
360
+    print "Download started - %s" % output
349 361
     #print url
350 362
     try:
351 363
         r = requests.get(url,headers=headers, stream=True)

+ 6
- 4
kmake.bat 파일 보기

@@ -2,16 +2,16 @@
2 2
 
3 3
 :--- Pull content submodule ---
4 4
 pushd resources\lib\content
5
-:git commit -a -m a
6
-:git checkout .
7
-:git pull
5
+rem git commit -a -m a
6
+git checkout .
7
+git pull
8 8
 popd
9 9
 
10 10
 :=== Parameters ===
11 11
 python get_version.py addon.xml >version.txt
12 12
 set /p ver=<version.txt
13 13
 echo %ver%
14
-rem pause
14
+pause
15 15
 
16 16
 set prog=PlayStream
17 17
 set pack_name=plugin.video.playstream
@@ -79,6 +79,8 @@ resources\lib\content\sources\tvdom.py
79 79
 resources\lib\content\sources\ustvnow.py
80 80
 resources\lib\content\sources\viaplay.py
81 81
 resources\lib\content\sources\filmas.py
82
+resources\lib\content\sources\tvplay.py
83
+resources\lib\content\sources\enigma2.py
82 84
 resources\lib\content\sources\YouTubeVideoUrl.py
83 85
 resources\lib\content\sources\jsinterp.py
84 86
 resources\lib\content\sources\swfinterp.py

+ 853
- 812
project.wpr
파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
파일 보기


+ 2
- 1
resources/language/English/strings.xml 파일 보기

@@ -19,6 +19,7 @@
19 19
   <string id="40013">USTVNow</string>
20 20
   <string id="40014">FilmOn</string>
21 21
   <string id="40015">MTGPlay</string>
22
+  <string id="40016">Enigma2</string>
22 23
 
23 24
   <string id="50001">Username</string>
24 25
   <string id="50002">Password</string>
@@ -39,5 +40,5 @@
39 40
   <string id="50023">Remote content config file location/name (ftp or http)</string>
40 41
   <string id="50024">Use remote content config file</string>
41 42
   <string id="50025">Overwrite existing files while downloading</string>
42
-
43
+  <string id="50026">Enigma2 hostname or ip address</string>
43 44
 </strings>

+ 6
- 0
resources/settings.xml 파일 보기

@@ -55,5 +55,11 @@
55 55
         <setting type="sep" />
56 56
     </category>
57 57
 
58
+   <category label="40016">
59
+        <setting id="enigma2_host" label="50026" type="text" default="" />
60
+        <setting id="enigma2_user" label="50001" type="text" default="" />
61
+        <setting id="enigma2_password" label="50002" type="text" default="change password" />
62
+        <setting type="sep" />
63
+    </category>
58 64
 
59 65
 </settings>

+ 107
- 100
wingdbstub.py 파일 보기

@@ -1,54 +1,46 @@
1 1
 #########################################################################
2
-""" wingdbstub.py    -- Debug stub for debuggifying Python programs
2
+""" wingdbstub.py -- Start debugging Python programs from outside of Wing
3 3
 
4
-Copyright (c) 1999-2001, Archaeopteryx Software, Inc.  All rights reserved.
4
+Copyright (c) 1999-2018, Archaeopteryx Software, Inc.  All rights reserved.
5 5
 
6 6
 Written by Stephan R.A. Deibel and John P. Ehresman
7 7
 
8 8
 Usage:
9 9
 -----
10 10
 
11
-This is the file that Wing DB users copy into their python project 
12
-directory if they want to be able to debug programs that are launched
13
-outside of the IDE (e.g., CGI scripts, in response to a browser page
14
-load).
15
-
16
-To use this, edit the configuration values below to match your 
17
-Wing installation and requirements of your project.
18
-
19
-Then, add the following line to your code:
11
+This file is used to initiate debug in Python code without launching
12
+that code from Wing.  To use it, edit the configuration values below,
13
+start Wing and configure it to listen for outside debug connections,
14
+and then add the following line to your code:
20 15
 
21 16
   import wingdbstub
22 17
 
23
-Debugging will start immediately after this import statements.
24
-
25
-Next make sure that your IDE is running and that it's configured to accept
26
-connections from the host the debug program will be running on.
18
+Debugging will start immediately after this import statement is reached.
27 19
 
28
-Now, invoking your python file should run the code within the debugger.
29
-Note, however, that Wing will not stop in the code unless a breakpoint
30
-is set.
31
-
32
-If the debug process is started before the IDE, or is not listening
33
-at the time this module is imported then the program will run with
34
-debugging until an attach request is seen.  Attaching only works 
35
-if the .wingdebugpw file is present; see the manual for details.
36
-
37
-On win32, you either need to edit WINGHOME in this script or
38
-pass in an environment variable called WINGHOME that points to
39
-the Wing installation directory.
20
+For details, see Debugging Externally Launched Code in the manual.
40 21
 
41 22
 """
42 23
 #########################################################################
43 24
 
44 25
 import sys
45 26
 import os
46
-import imp
27
+if sys.version_info >= (3, 7):
28
+  import importlib
29
+else:
30
+  import imp
47 31
 
32
+#------------------------------------------------------------------------
33
+# Required configuration values (some installers set this automatically)
34
+
35
+# This should be the full path to your Wing installation.  On OS X, use
36
+# the full path of the Wing application bundle, for example
37
+# /Applications/WingIDE.app.  When set to None, the environment variable
38
+# WINGHOME is used instead.
39
+WINGHOME = r"C:\Program Files (x86)\Wing IDE 6.1"
48 40
 
49 41
 #------------------------------------------------------------------------
50
-# Default configuration values:  Note that the named environment 
51
-# variables, if set, will override these settings.
42
+# Optional configuration values:  The named environment variables, if set,
43
+# will override these settings.
52 44
 
53 45
 # Set this to 1 to disable all debugging; 0 to enable debugging
54 46
 # (WINGDB_DISABLED environment variable)
@@ -60,30 +52,33 @@ kWingDebugDisabled = 0
60 52
 kWingHostPort = 'localhost:50005'
61 53
 
62 54
 # Port on which to listen for connection requests, so that the
63
-# IDE can (re)attach to the debug process after it has started.
55
+# IDE can attach or reattach to the debug process after it has started.
64 56
 # Set this to '-1' to disable listening for connection requests.
65 57
 # This is only used when the debug process is not attached to
66 58
 # an IDE or the IDE has dropped its connection. The configured
67 59
 # port can optionally be added to the IDE's Common Attach Hosts
68
-# preference. Note that a random port is used instead if this 
69
-# port is already in use!
60
+# preference. Note that a random port is used instead if the given
61
+# port is already in use.
70 62
 # (WINGDB_ATTACHPORT environment variable)
71 63
 kAttachPort = '50015'
72 64
 
73 65
 # Set this to a filename to log verbose information about the debugger
74 66
 # internals to a file.  If the file does not exist, it will be created
75
-# as long as its enclosing directory exists and is writeable.  Use 
76
-# "<stderr>" or "<stdout>".  Note that "<stderr>" may cause problems 
77
-# on win32 if the debug process is not running in a console.
67
+# as long as its enclosing directory exists and is writeable.  Use
68
+# "<stderr>" or "<stdout>" to write to stderr or stdout.  Note that
69
+# "<stderr>" may cause problems on Windows if the debug process is not
70
+# running in a console.
78 71
 # (WINGDB_LOGFILE environment variable)
79 72
 kLogFile = None
80 73
 
81
-# Set to get a tremendous amount of logging from the debugger internals
82
-# (WINGDB_LOGVERYVERBOSE)
74
+# Produce a tremendous amount of logging from the debugger internals.
75
+# Do not set this unless instructed to do so by Wingware support.  It
76
+# will slow the debugger to a crawl.
77
+# (WINGDB_LOGVERYVERBOSE environment variable)
83 78
 kLogVeryVerbose = 0
84 79
 
85 80
 # Set this to 1 when debugging embedded scripts in an environment that
86
-# creates and reuses a Python instance across multiple script invocations:  
81
+# creates and reuses a Python instance across multiple script invocations.
87 82
 # It turns off automatic detection of program quit so that the debug session
88 83
 # can span multiple script invocations.  When this is turned on, you may
89 84
 # need to call ProgramQuit() on the debugger object to shut down the
@@ -92,49 +87,49 @@ kLogVeryVerbose = 0
92 87
 # only the first one will be able to debug unless it terminates debug
93 88
 # and the environment variable WINGDB_ACTIVE is unset before importing
94 89
 # this module in the second or later Python instance.  See the Wing
95
-# IDE manual for details.
96
-kEmbedded = 0
90
+# manual for details.
91
+# (WINGDB_EMBEDDED environment variable)
92
+kEmbedded = 1
97 93
 
98 94
 # Path to search for the debug password file and the name of the file
99
-# to use.  The password file contains the encryption type and connect 
100
-# password for all connections to the IDE and must match the wingdebugpw
101
-# file in the profile dir used by the IDE.  Any entry of '$<winguserprofile>' 
102
-# is replaced by the wing user profile directory for the user that the 
103
-# current process is running as
95
+# to use.  The password file contains a security token for all
96
+# connections to the IDE and must match the wingdebugpw file in the
97
+# User Settngs directory used by the IDE. '$<winguserprofile>'
98
+# is replaced by the User Settings directory for the user that
99
+# is running the process.
104 100
 # (WINGDB_PWFILEPATH environment variable)
105 101
 kPWFilePath = [os.path.dirname(__file__), '$<winguserprofile>']
106 102
 kPWFileName = 'wingdebugpw'
107 103
 
108
-# Whether to exit if the debugger fails to run or to connect with an IDE
109
-# for whatever reason
104
+# Whether to exit when the debugger fails to run or to connect with the IDE
105
+# By default, execution continues without debug or without connecting to
106
+# the IDE.
107
+# (WINGDB_EXITONFAILURE environment variable)
110 108
 kExitOnFailure = 0
111 109
 
112 110
 #------------------------------------------------------------------------
113 111
 # Find Wing debugger installation location
114 112
 
115
-# Edit this to point to your Wing installation or set to None to use env WINGHOME
116
-# On OS X this must be set to name of the Wing application bundle
117
-# (for example, /Applications/WingIDE.app)
118
-WINGHOME = None
119
-
120 113
 if sys.hexversion >= 0x03000000:
121 114
   def has_key(o, key):
122 115
     return key in o
123 116
 else:
124 117
   def has_key(o, key):
125 118
     return o.has_key(key)
126
-    
119
+
127 120
 # Check environment:  Must have WINGHOME defined if still == None
128 121
 if WINGHOME == None:
129 122
   if has_key(os.environ, 'WINGHOME'):
130 123
     WINGHOME=os.environ['WINGHOME']
131 124
   else:
132
-    sys.stdout.write("*******************************************************************\n")
133
-    sys.stdout.write("Error: Could not find Wing installation!  You must set WINGHOME or edit\n")
134
-    sys.stdout.write("wingdbstub.py where indicated to point it to the location where\n")
135
-    sys.stdout.write("Wing is installed.\n")
136
-    sys.exit(1)
137
-
125
+    msg = '\n'.join(["*******************************************************************",
126
+                     "Error: Could not find Wing installation!  You must set WINGHOME or edit",
127
+                     "wingdbstub.py where indicated to point it to the location where",
128
+                     "Wing is installed.\n"])
129
+    sys.stderr.write(msg)
130
+    raise ImportError(msg)
131
+
132
+WINGHOME = os.path.expanduser(WINGHOME)
138 133
 kPWFilePath.append(WINGHOME)
139 134
 
140 135
 # The user settings dir where per-user settings & patches are located.  Will be
@@ -142,35 +137,35 @@ kPWFilePath.append(WINGHOME)
142 137
 kUserSettingsDir = None
143 138
 if kUserSettingsDir is None:
144 139
   kUserSettingsDir = os.environ.get('WINGDB_USERSETTINGS')
145
-  
140
+
146 141
 def _FindActualWingHome(winghome):
147 142
   """ Find the actual directory to use for winghome.  Needed on OS X
148 143
   where the .app directory is the preferred dir to use for WINGHOME and
149 144
   .app/Contents/MacOS is accepted for backward compatibility. """
150
-  
145
+
151 146
   if sys.platform != 'darwin':
152 147
     return winghome
153
-  
148
+
154 149
   app_dir = None
155 150
   if os.path.isdir(winghome):
156 151
     if winghome.endswith('/'):
157 152
       wo_slash = winghome[:-1]
158 153
     else:
159 154
       wo_slash = winghome
160
-      
155
+
161 156
     if wo_slash.endswith('.app'):
162 157
       app_dir = wo_slash
163 158
     elif wo_slash.endswith('.app/Contents/MacOS'):
164 159
       app_dir = wo_slash[:-len('/Contents/MacOS')]
165
-    
160
+
166 161
   if app_dir and os.path.isdir(os.path.join(app_dir, 'Contents', 'Resources')):
167 162
     return os.path.join(app_dir, 'Contents', 'Resources')
168
-  
163
+
169 164
   return winghome
170
-  
165
+
171 166
 def _ImportWingdb(winghome, user_settings=None):
172 167
   """ Find & import wingdb module. """
173
-  
168
+
174 169
   try:
175 170
     exec_dict = {}
176 171
     execfile(os.path.join(winghome, 'bin', '_patchsupport.py'), exec_dict)
@@ -181,16 +176,29 @@ def _ImportWingdb(winghome, user_settings=None):
181 176
   dir_list.extend([os.path.join(winghome, 'bin'), os.path.join(winghome, 'src')])
182 177
   for path in dir_list:
183 178
     try:
184
-      f, p, d = imp.find_module('wingdb', [path])
185
-      try:
186
-        return imp.load_module('wingdb', f, p, d)
187
-      finally:
188
-        if f is not None:
189
-          f.close()
190
-      break
179
+      if sys.version_info >= (3, 7):
180
+        import importlib.machinery
181
+        import importlib.util
182
+
183
+        spec = importlib.machinery.PathFinder.find_spec('wingdb', [path])
184
+        if spec is not None:
185
+          mod = importlib.util.module_from_spec(spec)
186
+          if mod is not None:
187
+            spec.loader.exec_module(mod)
188
+            return mod
189
+      else:
190
+        f, p, d = imp.find_module('wingdb', [path])
191
+        try:
192
+          return imp.load_module('wingdb', f, p, d)
193
+        finally:
194
+          if f is not None:
195
+            f.close()
196
+
191 197
     except ImportError:
192 198
       pass
193 199
 
200
+  return None
201
+
194 202
 #------------------------------------------------------------------------
195 203
 # Set debugger if it hasn't been set -- this is to handle module reloading
196 204
 # In the reload case, the debugger variable will be set to something
@@ -198,7 +206,7 @@ try:
198 206
   debugger
199 207
 except NameError:
200 208
   debugger = None
201
-  
209
+
202 210
 # Unset WINGDB_ACTIVE env if it was inherited from another process
203 211
 # XXX Would be better to be able to call getpid() on dbgtracer but can't access it yet
204 212
 if 'WINGDB_ACTIVE' in os.environ and os.environ['WINGDB_ACTIVE'] != str(os.getpid()):
@@ -207,15 +215,15 @@ if 'WINGDB_ACTIVE' in os.environ and os.environ['WINGDB_ACTIVE'] != str(os.getpi
207 215
 # Start debugging if not disabled and this module has never been imported
208 216
 # before
209 217
 if (not kWingDebugDisabled and debugger is None
210
-    and not has_key(os.environ, 'WINGDB_DISABLED') and 
218
+    and not has_key(os.environ, 'WINGDB_DISABLED') and
211 219
     not has_key(os.environ, 'WINGDB_ACTIVE')):
212 220
 
213 221
   exit_on_fail = 0
214
-  
222
+
215 223
   try:
216 224
     # Obtain exit if fails value
217 225
     exit_on_fail = os.environ.get('WINGDB_EXITONFAILURE', kExitOnFailure)
218
-    
226
+
219 227
     # Obtain configuration for log file to use, if any
220 228
     logfile = os.environ.get('WINGDB_LOGFILE', kLogFile)
221 229
     if logfile == '-' or logfile == None or len(logfile.strip()) == 0:
@@ -224,31 +232,31 @@ if (not kWingDebugDisabled and debugger is None
224 232
     very_verbose_log = os.environ.get('WINGDB_LOGVERYVERBOSE', kLogVeryVerbose)
225 233
     if type(very_verbose_log) == type('') and very_verbose_log.strip() == '':
226 234
       very_verbose_log = 0
227
-      
235
+
228 236
     # Determine remote host/port where the IDE is running
229 237
     hostport = os.environ.get('WINGDB_HOSTPORT', kWingHostPort)
230 238
     colonpos = hostport.find(':')
231 239
     host = hostport[:colonpos]
232 240
     port = int(hostport[colonpos+1:])
233
-  
241
+
234 242
     # Determine port to listen on locally for attach requests
235 243
     attachport = int(os.environ.get('WINGDB_ATTACHPORT', kAttachPort))
236
-  
244
+
237 245
     # Check if running embedded script
238 246
     embedded = int(os.environ.get('WINGDB_EMBEDDED', kEmbedded))
239
-  
247
+
240 248
     # Obtain debug password file search path
241 249
     if has_key(os.environ, 'WINGDB_PWFILEPATH'):
242 250
       pwfile_path = os.environ['WINGDB_PWFILEPATH'].split(os.pathsep)
243 251
     else:
244 252
       pwfile_path = kPWFilePath
245
-    
253
+
246 254
     # Obtain debug password file name
247 255
     if has_key(os.environ, 'WINGDB_PWFILENAME'):
248 256
       pwfile_name = os.environ['WINGDB_PWFILENAME']
249 257
     else:
250 258
       pwfile_name = kPWFileName
251
-    
259
+
252 260
     # Load wingdb.py
253 261
     actual_winghome = _FindActualWingHome(WINGHOME)
254 262
     wingdb = _ImportWingdb(actual_winghome, kUserSettingsDir)
@@ -257,13 +265,13 @@ if (not kWingDebugDisabled and debugger is None
257 265
       sys.stdout.write("Error: Cannot find wingdb.py in $(WINGHOME)/bin or $(WINGHOME)/src\n")
258 266
       sys.stdout.write("Error: Please check the WINGHOME definition in wingdbstub.py\n")
259 267
       sys.exit(2)
260
-    
268
+
261 269
     # Find the netserver module and create an error stream
262 270
     netserver = wingdb.FindNetServerModule(actual_winghome, kUserSettingsDir)
263 271
     err = wingdb.CreateErrStream(netserver, logfile, very_verbose_log)
264
-    
272
+
265 273
     # Start debugging
266
-    debugger = netserver.CNetworkServer(host, port, attachport, err, 
274
+    debugger = netserver.CNetworkServer(host, port, attachport, err,
267 275
                                         pwfile_path=pwfile_path,
268 276
                                         pwfile_name=pwfile_name,
269 277
                                         autoquit=not embedded)
@@ -271,7 +279,7 @@ if (not kWingDebugDisabled and debugger is None
271 279
     os.environ['WINGDB_ACTIVE'] = str(os.getpid())
272 280
     if debugger.ChannelClosed():
273 281
       raise ValueError('Not connected')
274
-    
282
+
275 283
   except:
276 284
     if exit_on_fail:
277 285
       raise
@@ -281,19 +289,19 @@ if (not kWingDebugDisabled and debugger is None
281 289
 def Ensure(require_connection=1, require_debugger=1):
282 290
   """ Ensure the debugger is started and attempt to connect to the IDE if
283 291
   not already connected.  Will raise a ValueError if:
284
-  
292
+
285 293
   * the require_connection arg is true and the debugger is unable to connect
286 294
   * the require_debugger arg is true and the debugger cannot be loaded
287
-  
295
+
288 296
   If SuspendDebug() has been called through the low-level API, calling
289 297
   Ensure() resets the suspend count to zero and additional calls to
290 298
   ResumeDebug() will be ignored until SuspendDebug() is called again.
291
-  
299
+
292 300
   Note that a change to the host & port to connect to will only
293 301
   be use if a new connection is made.
294
-  
302
+
295 303
   """
296
-  
304
+
297 305
   if debugger is None:
298 306
     if require_debugger:
299 307
       raise ValueError("No debugger")
@@ -303,18 +311,17 @@ def Ensure(require_connection=1, require_debugger=1):
303 311
   colonpos = hostport.find(':')
304 312
   host = hostport[:colonpos]
305 313
   port = int(hostport[colonpos+1:])
306
-  
314
+
307 315
   resumed = debugger.ResumeDebug()
308 316
   while resumed > 0:
309 317
     resumed = debugger.ResumeDebug()
310
-  
311
-  debugger.SetClientAddress((host, port))  
312
-  
318
+
319
+  debugger.SetClientAddress((host, port))
320
+
313 321
   if not debugger.DebugActive():
314 322
     debugger.StartDebug()
315 323
   elif debugger.ChannelClosed():
316 324
     debugger.ConnectToClient()
317
-    
325
+
318 326
   if require_connection and debugger.ChannelClosed():
319 327
     raise ValueError('Not connected')
320
-