Jump to content


Photo

Streamlink Installation


  • Please log in to reply
31 replies to this topic

Re: Streamlink Installation #21 pcd

  • Senior Member
  • 759 posts

+88
Good

Posted 17 May 2018 - 20:00

 

Excuse me pcd I wanted to know if it's possible turn into channels for bouquetes tv of enigma2 (with streamlink installed) these 2 url that with player (streamlink) for ubuntu and win works giving light even without vpn

streamlink --http-header "X-Forwarded-For=85.6.69.69" https://www.rsi.ch/play/tv/live?tvLiveId=livestream_La1 best
streamlink --http-header "X-Forwarded-For=85.6.69.69" https://www.rsi.ch/play/tv/live?tvLiveId=livestream_La2 best

Sorry, not possible -

 

LA 1

Per motivi legali questo video è disponibile solo all'interno della
Svizzera.
 

Regards, pcd.



Re: Streamlink Installation #22 athoik

  • PLi® Core member
  • 8,458 posts

+327
Excellent

Posted 17 May 2018 - 20:32

Hi,

Streamlink is livestreamer continuation. See: https://github.com/c...amer/issues/274

And also see: https://github.com/c...amer/session.py
 
http-headers             (dict or str) A dict or semi-colon (;)
                                 delimited str of headers to add to each
                                 HTTP request, e.g. foo=bar;baz=qux
Manually setting the http-headers in livestreamersrv will do as a test
 
LIVESTREAMER.set_option("http-headers", "referrer=https://xxx/yyyy")
To get header automatically it's trickier but it can be done...


Here is a sample with the X-Forwarded-For...
 
def Streamer(wfile, url, quality):
    global LIVESTREAMER
    LIVESTREAMER.set_option("http-headers", "X-Forwarded-For=85.6.69.69")
    channel = LIVESTREAMER.resolve_url(url)
    streams = channel.get_streams()
    if not streams:
        raise Exception("No Stream Found!")
Then..
 
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http://localhost:88/https://www.rsi.ch/play/tv/live?tvLiveId=livestream_La1 La1
And...

Attached File  4097_0_1_0_0_0_0_0_0_0_20180517212935.jpg   154.1KB   7 downloads


PS. Don't forget to run ntp, because https validation on url will fail without proper time.

PPS. Original livestreamersrv bitbakes (and streamlink) can be found here: https://github.com/s...devtools/python

Obviously some people copied livestreamersrv and introduce it as streamlinksrv...

Edited by athoik, 17 May 2018 - 20:33.

Wavefield T90: 0.8W - 1.9E - 4.8E - 13E - 16E - 19.2E - 23.5E - 26E - 33E - 39E - 42E - 45E on EMP Centauri DiseqC 16/1
Unamed: 13E Quattro - 9E Quattro on IKUSI MS-0916

Re: Streamlink Installation #23 pablonero

  • Member
  • 20 posts

0
Neutral

Posted 18 May 2018 - 16:45

Sorry athoik but I'm a bit confused ...
replacing livestreamersrv with streamlinksrv (which I installed in enigma2) ,  I add the lines you have posted
and my / usr / sbin / stremlinksrv   is:
 
#!/usr/bin/python2.7

""" Streamlink Daemon """

import os
import sys
import time
import atexit
import traceback
import platform
from websocket import __version__ as websocket_version
from requests import __version__ as requests_version
from platform import node as hostname

from signal import SIGTERM

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
from streamlink import Streamlink
from streamlink.stream.ffmpegmux import MuxedStream
from streamlink import (StreamlinkError, PluginError, NoStreamsError, NoPluginError,  StreamError)
from streamlink import __version__ as streamlink_version
from streamlink import __version_date__ as streamlink_version_date
from urllib import unquote
from threading import Lock

PORT_NUMBER = 8088	# change it to 88 for livestreamersrv compatibility
STREAMLINK = None
LOGGER = None
LOGLEVEL = "info"	# "none", "error", "warning", "info" or "debug"
FFMPEG_VERBOSE = True

def Streamer(wfile, url, quality):
    global STREAMLINK
    STREAMLINK.set_option("http-headers", "X-Forwarded-For=85.6.69.69")
    channel = STREAMLINK.resolve_url(url)
    streams = channel.get_streams()
    if not streams:
        raise Exception("No Stream Found!")


def Stream(wfile, url, quality):
	try:
		Streamer(wfile, url, quality)
	except NoPluginError:
		LOGGER.error("Streamlink is unable to handle the URL '{0}'", url)
		wfile.write(open("/usr/share/offline.mp4", "r").read())
	except PluginError as err:
		LOGGER.error("Plugin error: {0}", err)
		wfile.write(open("/usr/share/offline.mp4", "r").read())
	except Exception as err:
		if LOGLEVEL == "debug":
			LOGGER.error("Got exception:\n{0}", traceback.format_exc().splitlines())
		else:
			LOGGER.error("Got exception: {0}", err)
		wfile.write(open("/usr/share/offline.mp4", "r").read())
	finally:
		wfile.close()


def Streamer(wfile, url, quality):
	global STREAMLINK
	streams = STREAMLINK.streams(url)
	if not streams:
		raise Exception("No streams found on URL '{0}'".format(url))
	LOGGER.info("Streams:\n{0}", streams.keys())
	stream_quali = "best"
	for q in quality.split(','):
		if q in streams:
			stream_quali = q
			break;
	stream = streams[stream_quali]
	LOGGER.debug("Stream selected: Q '{0}', URL '{1}'", stream_quali, stream)
	fd = stream.open()
	try:
		while True:
			buff = fd.read(4096)
			if not buff:
				raise Exception("No Data!")
			wfile.write(buff)
	except:
		raise
	finally:
		if fd:
			LOGGER.info("Closing currently open stream...")
			fd.close()
			raise Exception("End Of Data!")


class StreamHandler(BaseHTTPRequestHandler):

	def do_HEAD(s):
		s.send_response(200)
		s.send_header("Server", "Enigma2 Streamlink")
		s.send_header("Content-type", "text/html")
		s.end_headers()

	def do_GET(s):
		"""Respond to a GET request."""
		s.send_response(200)
		s.send_header("Server", "Enigma2 Streamlink")
		s.send_header("Content-type", "text/html")
		s.end_headers()

		url=unquote(s.path[1:])
		quality="best"

		if url.startswith("q=") and url.index("/") > 0:
			i = url.index("/")
			quality = url[2:i]
			url = url[i+1:]

		s.log_message("URL: %s Quality: %s", url, quality)
		Stream(s.wfile, url, quality)


class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
	"""Handle requests in a separate thread."""


def start():
	global STREAMLINK, LOGGER
	STREAMLINK = Streamlink()
	LOGGER = STREAMLINK.logger.new_module("streamlinksrv")
	STREAMLINK.set_loglevel(LOGLEVEL)
	STREAMLINK.set_option("ffmpeg-verbose", FFMPEG_VERBOSE)
	STREAMLINK.set_option("http-headers", "referrer=https://xxx/yyyy")
	#STREAMLINK.set_option("http-ssl-verify", False)
	#STREAMLINK.set_option("hls-segment-threads", 2)
	#STREAMLINK.set_plugin_option("plugin_name", "email", "your_email_address")
	#STREAMLINK.set_plugin_option("plugin_name", "password", "your_password")
	httpd = ThreadedHTTPServer(("", PORT_NUMBER), StreamHandler)
	LOGGER.info("{0} Server started - Host: {1}, Port: {2}", time.asctime(), hostname(), PORT_NUMBER)
	LOGGER.info("Python:     {0}".format(platform.python_version()))
	LOGGER.info("Streamlink: {0} / {1}".format(streamlink_version, streamlink_version_date))
	LOGGER.info("Requests({0}), Websocket({1})".format(requests_version, websocket_version))
	if MuxedStream.is_usable(STREAMLINK):
		LOGGER.info("ffmpeg is usable.")
	try:
		httpd.serve_forever()
	except KeyboardInterrupt:
		pass
	httpd.server_close()
	LOGGER.info("{0} Server stopped - Host: {1}, Port: {2}", time.asctime(), hostname(), PORT_NUMBER)


class Daemon:
	"""
	A generic daemon class.

	Usage: subclass the Daemon class and override the run() method
	"""
	def __init__(self, pidfile, stdin="/dev/null", stdout="/dev/null", stderr="/dev/null"):
		self.stdin = stdin
		self.stdout = stdout
		self.stderr = stderr
		self.pidfile = pidfile

	def daemonize(self):
		"""
		do the UNIX double-fork magic, see Stevens' "Advanced
		Programming in the UNIX Environment" for details (ISBN 0201563177)
		http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
		"""
		try:
			pid = os.fork()
			if pid > 0:
				# exit first parent
				sys.exit(0)
		except OSError, e:
			sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
			sys.exit(1)

		# decouple from parent environment
		os.chdir("/")
		os.setsid()
		os.umask(0)

		# do second fork
		try:
			pid = os.fork()
			if pid > 0:
				# exit from second parent
				sys.exit(0)
		except OSError, e:
			sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
			sys.exit(1)

		# redirect standard file descriptors
		sys.stdout.flush()
		sys.stderr.flush()
		si = file(self.stdin, "r")
		so = file(self.stdout, "a+")
		se = file(self.stderr, "a+", 0)
		os.dup2(si.fileno(), sys.stdin.fileno())
		os.dup2(so.fileno(), sys.stdout.fileno())
		os.dup2(se.fileno(), sys.stderr.fileno())

		# write pidfile
		atexit.register(self.delpid)
		pid = str(os.getpid())
		file(self.pidfile,"w+").write("%s\n" % pid)

	def delpid(self):
		os.remove(self.pidfile)

	def start(self):
		"""
		Start the daemon
		"""
		# Check for a pidfile to see if the daemon already runs
		try:
			pf = file(self.pidfile,"r")
			pid = int(pf.read().strip())
			pf.close()
		except IOError:
			pid = None

		if pid:
			message = "pidfile %s already exist. Daemon already running?\n"
			sys.stderr.write(message % self.pidfile)
			sys.exit(1)

		# Start the daemon
		self.daemonize()
		self.run()

	def stop(self):
		"""
		Stop the daemon
		"""
		# Get the pid from the pidfile
		try:
			pf = file(self.pidfile,"r")
			pid = int(pf.read().strip())
			pf.close()
		except IOError:
			pid = None

		if not pid:
			message = "pidfile %s does not exist. Daemon not running?\n"
			sys.stderr.write(message % self.pidfile)
			return # not an error in a restart

		# Try killing the daemon process
		try:
			while 1:
				os.kill(pid, SIGTERM)
				time.sleep(0.1)
		except OSError, err:
			err = str(err)
			if err.find("No such process") > 0:
				if os.path.exists(self.pidfile):
					os.remove(self.pidfile)
			else:
				print str(err)
				sys.exit(1)

	def restart(self):
		"""
		Restart the daemon
		"""
		self.stop()
		self.start()

	def run(self):
		"""
		You should override this method when you subclass Daemon. It will be called after the process has been
		daemonized by start() or restart().
		"""


class StreamlinkDaemon(Daemon):
	def run(self):
		start()


if __name__ == "__main__":
	daemon = StreamlinkDaemon("/var/run/streamlink.pid")
	if len(sys.argv) == 2:
		if "start" == sys.argv[1]:
			daemon.start()
		elif "stop" == sys.argv[1]:
			daemon.stop()
		elif "restart" == sys.argv[1]:
			daemon.restart()
		elif "manualstart" == sys.argv[1]:
			daemon.stop()
			start()
		else:
			print "Unknown command"
			sys.exit(2)
		sys.exit(0)
	else:
		print "usage: %s start|stop|restart|manualstart" % sys.argv[0]
		print "       manualstart include a stop"
		sys.exit(2)


I have to change something because the lines work with a vpn but with this no ...



Re: Streamlink Installation #24 satforindo

  • Senior Member
  • 62 posts

0
Neutral

Posted 18 May 2018 - 18:53

Pablonero, you define "Streamer" twice:

 

def Streamer(wfile, url, quality):

 

Just add (insert) what athoik explained under the one on your streamlinksrv file.

 

Attached File  Screenshot from 2018-05-19 00-51-54.png   81.64KB   6 downloads

 

The original of streamlinksrv is actually livestreamsrv as athoik said.


Edited by Budiarno, 18 May 2018 - 18:54.


Re: Streamlink Installation #25 pablonero

  • Member
  • 20 posts

0
Neutral

Posted 18 May 2018 - 21:17

I had noticed it. I tried to correct it but obviously I did not do it well because it did not work. Can you help me?



Re: Streamlink Installation #26 satforindo

  • Senior Member
  • 62 posts

0
Neutral

Posted 19 May 2018 - 01:50

Here's mine, after following athoik instruction above. Take a look at "def Streamer(wfile, url, quality)" on the streamlinksrv.

 

Attached File  4097_0_1_0_0_0_0_0_0_0_20180519074543.jpg   73.67KB   5 downloads

Attached Files



Re: Streamlink Installation #27 pablonero

  • Member
  • 20 posts

0
Neutral

Posted 19 May 2018 - 02:10

Thanks to all I solved...



Re: Streamlink Installation #28 pablonero

  • Member
  • 20 posts

0
Neutral

Posted 19 May 2018 - 02:20

Thanks to all I solved...( my streamlinksrv e userbouquet.tv are slightly different)

 

thanks Budiarno, thanks athoik



Re: Streamlink Installation #29 pzanone

  • Senior Member
  • 224 posts

+13
Neutral

Posted 21 May 2018 - 20:06

is it also possible to insert this site in the server-lib?

http://v4.ustreamix.com

:unsure:



Re: Streamlink Installation #30 pzanone

  • Senior Member
  • 224 posts

+13
Neutral

Posted 22 May 2018 - 13:39

I wanted to understand if it was possible to enter the VPN option only for that RSI channel

def Streamer(wfile, url, quality):
    global STREAMLINK
    STREAMLINK.set_option("http-headers", "X-Forwarded-For=85.6.69.69")
    channel = STREAMLINK.resolve_url(url)
    streams = channel.get_streams()
    if not streams:
        raise Exception("No Stream Found!")

type

If "rsi.ch" in streams:

   xxxxxxxxxxxxxxxxx

 

regards



Re: Streamlink Installation #31 pablonero

  • Member
  • 20 posts

0
Neutral

Posted 29 May 2018 - 15:12

Another question ... can the quality of the rsi stream in enigma 2 ( low, best etc..)  be chosen only in streamlink.srv or can it also be indicated in the stream in userbouquets.tv? thanks



Re: Streamlink Installation #32 pablonero

  • Member
  • 20 posts

0
Neutral

Posted 9 January 2019 - 18:26

I wanted to understand if it was possible to enter the VPN option only for that RSI channel

def Streamer(wfile, url, quality):
    global STREAMLINK
    STREAMLINK.set_option("http-headers", "X-Forwarded-For=85.6.69.69")
    channel = STREAMLINK.resolve_url(url)
    streams = channel.get_streams()
    if not streams:
        raise Exception("No Stream Found!")

type

If "rsi.ch" in streams:

   xxxxxxxxxxxxxxxxx

 

regards

 

I can use http-proxy to insert an https proxy in streamlinksrv ...
the exact function is this?
 
 
def Streamer (wfile, url, quality):
         global STREAMLINK
         STREAMLINK.set_option ("https-proxy", "https-proxy xx.xx.xxx.xxx:port")
         channel = STREAMLINK.resolve_url (url)
         streams = channel.get_streams ()
         if not streams:
         raise Exception("No Stream Found!")
 
Will all https links go through the proxy?



0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users