aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/livestreamer/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/livestreamer/utils.py')
-rw-r--r--src/livestreamer/utils.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/livestreamer/utils.py b/src/livestreamer/utils.py
index 015b7b2..a3633d9 100644
--- a/src/livestreamer/utils.py
+++ b/src/livestreamer/utils.py
@@ -1,11 +1,17 @@
+from .compat import is_win32
from .plugins import PluginError
import argparse
import hashlib
import hmac
+import os
import requests
+import tempfile
import zlib
+if is_win32:
+ from ctypes import windll, cast, c_ulong, c_void_p, byref
+
SWFKey = b"Genuine Adobe Flash Player 001"
RequestsConfig = { "danger_mode": True }
@@ -22,6 +28,66 @@ class ArgumentParser(argparse.ArgumentParser):
else:
yield "--%s" % line
+class NamedPipe(object):
+ def __init__(self, name):
+ self.fifo = None
+ self.pipe = None
+
+ if is_win32:
+ self.path = os.path.join("\\\\.\\pipe", name)
+ self.pipe = self._create_named_pipe(self.path)
+ else:
+ self.path = os.path.join(tempfile.gettempdir(), name)
+ self._create_fifo(self.path)
+
+ def _create_fifo(self, name):
+ os.mkfifo(name, 0o660)
+
+ def _create_named_pipe(self, path):
+ PIPE_ACCESS_OUTBOUND = 0x00000002
+ PIPE_TYPE_BYTE = 0x00000000
+ PIPE_READMODE_BYTE = 0x00000000
+ PIPE_WAIT = 0x00000000
+ PIPE_UNLIMITED_INSTANCES = 255
+ INVALID_HANDLE_VALUE = -1
+ bufsize = 8192
+
+ pipe = windll.kernel32.CreateNamedPipeA(path,
+ PIPE_ACCESS_OUTBOUND,
+ PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
+ PIPE_UNLIMITED_INSTANCES,
+ bufsize,
+ bufsize,
+ 0,
+ None)
+
+ if pipe == INVALID_HANDLE_VALUE:
+ raise IOError(("error code 0x{0:08X}").format(windll.kernel32.GetLastError()))
+
+ return pipe
+
+ def open(self, mode):
+ if not self.pipe:
+ self.fifo = open(self.path, mode)
+
+ def write(self, data):
+ if self.pipe:
+ windll.kernel32.ConnectNamedPipe(self.pipe, None)
+ written = c_ulong(0)
+ windll.kernel32.WriteFile(self.pipe, cast(data, c_void_p),
+ len(data), byref(written),
+ None)
+ return written
+ else:
+ return self.fifo.write(data)
+
+ def close(self):
+ if self.pipe:
+ windll.kernel32.DisconnectNamedPipe(self.pipe)
+ else:
+ self.fifo.close()
+ os.unlink(self.path)
+
def urlopen(url, method="get", exception=PluginError, **args):
if "data" in args and args["data"] is not None:
method = "post"