url values gibt + statt leerzeichen aus

Code-Stücke können hier veröffentlicht werden.
Antworten
kangool
User
Beiträge: 12
Registriert: Mittwoch 24. März 2021, 21:30

habe ein altes kodi addon auf py3 upgedatet, was ziemlich heftig für mich ist da ich an und für sich nichts mit Programmiersprachen am Hut habe
es ist ein addon um mit stalker middlware zu verbinden

get_genres
get_all_channels funktioniert auch wunderbar
er speichert mir die listen auch ordentlich und sauber ab
mit Portalen die den stream Link klar ablegen funktioniert es auch ohne Probleme ("cmd":"ffmpeg http://direktlink")
werden die links aber so abgespeichert "cmd":"ffmpeg http://localhost/ch/282_"
dann bekomm ich dieses ergebnis "cmd":"ffmpeg+http://localhost/ch/282_"
Python setzt mir in die url die gesendet werden soll ein + statt ein Leerzeichen rein, was bei direktlinks ja anscheinend kein Problem darstellt.
Bei localhost auf jedenfall denn da bekomme ich dadaurch den fehler:
list index out of range

er verbindet zwar und ich bekomme auch meinen playtokken aber der stream kann nicht starten da ja das + und nicht wie es sein müsste %20 (weil URL Format) gesendet wird

wäre für Ratschläge dankbar

hier mal das py

Code: Alles auswählen

# -*- coding: utf-8 -*- 
import sys
import urllib.parse
import json
import os
import urllib.parse, urllib.request, urllib.error
import re, uuid
from time import time
from datetime import datetime
import math
import hashlib
from xml.dom import minidom

key = None;
mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()));
sn = None;
device_id = None;
device_id2 = None;
signature = None;

cache_version = '3'

def is_json(myjson):
  try:
    json_object = json.loads(myjson)
  except ValueError as e:
    return False
  return True

def setMac(nmac):
	global mac;
	
	if re.match("[0-9a-f]{2}([-:])[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", nmac.lower()):
		mac = nmac;

def getMac():
	global mac;
	return mac;
	
	
def setSerialNumber(serial):
	global sn, device_id, device_id2, signature;
	
	if serial == None:
		return;
	
	elif serial['custom'] == False:
		sn = hashlib.md5(mac).hexdigest().upper()[13:];
		device_id = hashlib.sha256(sn).hexdigest().upper();
		device_id2 = hashlib.sha256(mac).hexdigest().upper();
		signature = hashlib.sha256(sn + mac).hexdigest().upper();
	
	elif serial['custom'] == True:
		sn = serial['sn'];
		device_id = serial['device_id'];
		device_id2 = serial['device_id2'];
		signature = serial['signature'];

def handshake(url):
	global key;
	
	if key != None:
		return;
	
	info = retrieveData(url, values = {
		'type' : 'stb', 
		'action' : 'handshake',
		'JsHttpRequest' : '1-xml'})
		
	key = info['js']['token']
	
	getProfile(url);
	

def getProfile(url):
	global sn, device_id, device_id2, signature;
	
	values = {
		'type' : 'stb', 
		'action' : 'get_profile',
		'hd' : '1',
		'ver' : 'ImageDescription:%200.2.18-r11-pub-254;%20ImageDate:%20Wed%20Mar%2018%2018:09:40%20EET%202015;%20PORTAL%20version:%204.9.14;%20API%20Version:%20JS%20API%20version:%20331;%20STB%20API%20version:%20141;%20Player%20Engine%20version:%200x572',
		'num_banks' : '1',
		'stb_type' : 'MAG254',
		'image_version' : '218',
		'auth_second_step' : '0',
		'hw_version' : '2.6-IB-00',
		'not_valid_token' : '0',
		'JsHttpRequest' : '1-xml'}

	if sn != None:
		values['sn'] = sn;
		values['device_id'] = device_id;
		values['device_id2'] = device_id2;
		values['signature'] = signature;


	info = retrieveData(url, values);


def retrieveData(url, values ):
	global key, mac;
		
	url += ':8080'
	load = '/server/load.php'
	refer = '/c/'
	timezone = 'America%2FChicago';

	user_agent 	= 'Mozilla/5.0 (QtEmbedded; U; Linux; C) AppleWebKit/533.3 (KHTML, like Gecko) MAG200 stbapp ver: 4 rev: 1812 Mobile Safari/533.3';
	
	if key != None:
		headers 	= { 
			'User-Agent' : user_agent, 
			'Cookie' : 'mac=' + mac + '; stb_lang=en; timezone=' + timezone,
			'Referer' : url + refer,
			'Accept' : '*/*',
			'Connection' : 'Keep-Alive',
			'X-User-Agent' : 'Model: MAG254; Link: Ethernet',
			'Authorization' : 'Bearer ' + key };
	
	else:
		headers 	= { 
			'User-Agent' : user_agent, 
			'Cookie' : 'mac=' + mac+ '; stb_lang=en; timezone=' + timezone,
			'Referer' : url + refer,
			'Accept' : '*/*',
			'Connection' : 'Keep-Alive',
			'X-User-Agent' : 'Model: MAG254; Link: Ethernet' };

	
	data = urllib.parse.urlencode(values).encode('utf-8');

	req = urllib.request.Request(url + load, data, headers);
	resp = urllib.request.urlopen(req).read().decode("utf-8");
	
	if not is_json(resp):
		req = urllib.request.Request(url + load + '?' + data, headers=headers);
		resp = urllib.request.urlopen(req).read().decode("utf-8");

	if not is_json(resp):
		raise Exception(resp)

	info = json.loads(resp)

	return info;


def getGenres(portal_mac, url, serial, path):	
	global key, cache_version;
	
	now = time();
	portalurl = "_".join(re.findall("[a-zA-Z0-9]+", url));
	portalurl = path + '/' + portalurl + '-genres';
	
	setMac(portal_mac);
	setSerialNumber(serial);
	
	if not os.path.exists(path): 
		os.makedirs(path);
	
	if os.path.exists(portalurl):
		#check last time
		with open(portalurl, 'rb') as data_file: data = json.load(data_file);
		
		if 'version' not in data or data['version'] != cache_version:
			clearCache(url, path);
			
		else:
			time_init = float(data['time']);
			# update 12h
			if ((now - time_init) / 3600) < 12:
				return data;
	
	handshake(url);
	
	info = retrieveData(url, values = {
		'type' : 'itv', 
		'action' : 'get_genres',
		'JsHttpRequest' : '1-xml'})
		
	
	results = info['js']
	
	data = '{ "version" : "' + cache_version + '", "time" : "' + str(now) + '", "genres" : {  \n'

	for i in results:
		alias 	= i["alias"]
		id 		= i["id"]
		title 	= i['title']
		
		data += '"'+ id +'" : {"alias":"'+ alias +'", "title":"'+ title +'"}, \n'

	
	data = data[:-3] + '\n}}'

	with open(portalurl, 'wb') as f: f.write(data.encode('utf-8'));
	
	return json.loads(data.encode('utf-8'));
	
def getVoD(portal_mac, url, serial, path):	
	now = time();
	portalurl = "_".join(re.findall("[a-zA-Z0-9]+", url));
	portalurl = path + '/' + portalurl + '-vod';
	
	setMac(portal_mac);
	#setSerialNumber(serial);
	
	if not os.path.exists(path):
		os.makedirs(path)
	
	if os.path.exists(portalurl):
		#check last time
		with open(portalurl) as data_file: data = json.load(data_file);
	
		if 'version' not in data or data['version'] != cache_version:
			clearCache(url, path);
			
		else:
			time_init = float(data['time']);
			# update 12h
			if ((now - time_init) / 3600) < 12:
				return data;
	
	handshake(url);
	
	data = '{ "version" : "' + cache_version + '", "time" : "' + str(now) + '", "vod" : [  \n'
	
	page = 1;
	pages = 0;
	total_items = 1.0;
	max_page_items = 1.0;
	
	while True:
		info = retrieveData(url, values = {
			'type' : 'vod', 
			'action' : 'get_ordered_list',
			'sortby' : 'added',
			'not_ended' : '0',
			'p' : page,
			'fav' : '0',
			'JsHttpRequest' : '1-xml'})
		
		total_items = float(info['js']['total_items']);
		max_page_items = float(info['js']['max_page_items']);
		pages = math.ceil(total_items/max_page_items);
		
		results = info['js']['data']


		for i in results:
			name 	= i["name"]
			cmd 	= i['cmd']
			logo 	= i["screenshot_uri"]
		
			data += '{"name":"'+ name +'", "cmd":"'+ cmd +'", "logo":"'+ logo +'"}, \n'

		page += 1;
		if page > pages or page == 10:
			break;

	data = data[:-3] + '\n]}'

	with open(portalurl, 'wb') as f: f.write(data.encode('utf-8'));
	
	return json.loads(data.encode('utf-8'));


def orderChannels(channels):
      	n_data = {};
      	for i in channels:	
      		number 		= i["number"];
      		n_data[int(number)] = i;
      	
      	ordered = sorted(n_data);
      	data = {};
      	for i in ordered:	
      		data[i] = n_data[i];
      		
      	return list(data.values());


def getAllChannels(portal_mac, url, serial, path):

	added = False;
	
	now = time();
	
	portalurl = "_".join(re.findall("[a-zA-Z0-9]+", url));
	portalurl = path + '/' + portalurl
	
	setMac(portal_mac);
	setSerialNumber(serial);
	
	if not os.path.exists(path):
		os.makedirs(path)

	if os.path.exists(portalurl):

		#check last time
		with open(portalurl, 'rb') as data_file: data = json.load(data_file);
	
		if 'version' not in data or data['version'] != cache_version:
			clearCache(url, path);
			
		else:
			time_init = float(data['time']);
			# update 12h
			if ((now - time_init) / 3600) < 12:
				return data;
	
	handshake(url);
	
	genres = getGenres(portal_mac, url, serial, path);
	genres = genres["genres"];
	
	info = retrieveData(url, values = {
		'type' : 'itv', 
		'action' : 'get_all_channels',
		'JsHttpRequest' : '1-xml'})
	
	
	results = info['js']['data'];

	data = '{ "version" : "' + cache_version + '", "time" : "' + str(now) + '", "channels" : { \n'

	for i in results:
		id 		= i["id"]
		number 	= i["number"]
		name 	= i["name"]
		cmd 	= i['cmd']
		logo 	= i["logo"]
		tmp 	= i["use_http_tmp_link"]
		genre_id 	= i["tv_genre_id"];
		
		genre_title = genres[genre_id]['title'];
		
		_s1 = cmd.split(' ');	
		_s2 = _s1[0];
		if len(_s1)>1:
			_s2 = _s1[1];
		
		added = True;
		data += '"' + id + '": {"number":"'+ number +'", "name":"'+ name +'", "cmd":"'+ cmd +'", "logo":"'+ logo +'", "tmp":"'+ str(tmp) +'", "genre_id":"'+ str(genre_id) +'", "genre_title":"'+ genre_title +'"}, \n'


	page = 1;
	pages = 0;
	total_items = 0;
	max_page_items = 0;

	while True:
		# retrieve adults
		info = retrieveData(url, values = {
			'type' : 'itv', 
			'action' : 'get_ordered_list',
			'genre' : '10',
			'p' : page,
			'fav' : '0',
			'JsHttpRequest' : '1-xml'})
	
		total_items = float(info['js']['total_items']);
		max_page_items = float(info['js']['max_page_items']);
		pages = math.ceil(total_items/max_page_items);
	
		results = info['js']['data']

		for i in results:
			id 		= i["id"]
			number 	= i["number"]
			name 	= i["name"]
			cmd 	= i['cmd']
			logo 	= i["logo"]
			tmp 	= i["use_http_tmp_link"]
			genre_id 	= i["tv_genre_id"];
			genre_title = genres[genre_id]['title'];
		
			data += '"' + id + '": {"number":"'+ number +'", "name":"'+ name +'", "cmd":"'+ cmd +'", "logo":"'+ logo +'", "tmp":"'+ str(tmp) +'", "genre_id":"'+ str(genre_id) +'", "genre_title":"'+ genre_title +'"}, \n'
			
			added = True;

		page += 1;
		if page > pages:
			break;
	

	if not added:
		data = data + '\n}}';
	else:
		data = data[:-3] + '\n}}';

	
	with open(portalurl, 'w') as f: f.write(data.encode('utf-8'));
	
	return json.loads(data.encode('utf-8'));

def getEPG(portal_mac, url, serial, path):	
	global key, cache_version;
	
	now = time();
	portalurl = "_".join(re.findall("[a-zA-Z0-9]+", url));
	portalurl = path + '/' + portalurl + '-epg';
	
	setMac(portal_mac);
	setSerialNumber(serial);
	
	if not os.path.exists(path): 
		os.makedirs(path);
	
	if os.path.exists(portalurl):
		#check last time
		xmldoc = minidom.parse(portalurl);
		
		itemlist = xmldoc.getElementsByTagName('tv');
		
		version = itemlist[0].attributes['cache-version'].value;
		
		if version != cache_version:
			clearCache(url, path);
			
		else:
			time_init = float(itemlist[0].attributes['cache-time'].value);
			# update 2h
			if ((now - time_init) / 3600) < 2:
				return xmldoc.toxml(encoding='utf-8');
	

	channels = getAllChannels(portal_mac, url, serial, path);
	channels = channels['channels'];
	
	handshake(url);
	
	info = retrieveData(url, values = {
		'type' : 'itv', 
		'action' : 'get_epg_info',
		'period' : '6',
		'JsHttpRequest' : '1-xml'})


	results = info['js']['data'];
	
	doc = minidom.Document();
	base = doc.createElement('tv');
	base.setAttribute("cache-version", cache_version);
	base.setAttribute("cache-time", str(now));
	base.setAttribute("generator-info-name", "IPTV Plugin");
	base.setAttribute("generator-info-url", "http://www.xmltv.org/");
	doc.appendChild(base)


	for c in results:
		
		if not str(c) in channels:
			continue;
	
		channel = channels[str(c)];
		name = channel['name'];
		
		c_entry = doc.createElement('channel');
		c_entry.setAttribute("id", str(c));
		base.appendChild(c_entry)
		
		
		dn_entry = doc.createElement('display-name');
		dn_entry_content = doc.createTextNode(name);
		dn_entry.appendChild(dn_entry_content);
		c_entry.appendChild(dn_entry);
	

	for k,v in list(results.items()):
	
		channel = None;
		
		if str(k) in channels:
			channel = channels[str(k)];
		
		for epg in v:
		
			start_time 	= datetime.fromtimestamp(float(epg['start_timestamp']));
			stop_time	= datetime.fromtimestamp(float(epg['stop_timestamp']));
			
			pg_entry = doc.createElement('programme');
			pg_entry.setAttribute("start", start_time.strftime('%Y%m%d%H%M%S -0000'));
			pg_entry.setAttribute("stop", stop_time.strftime('%Y%m%d%H%M%S -0000'));
			pg_entry.setAttribute("channel", str(k));
			base.appendChild(pg_entry);
			
			t_entry = doc.createElement('title');
			t_entry.setAttribute("lang", "en");
			t_entry_content = doc.createTextNode(epg['name']);
			t_entry.appendChild(t_entry_content);
			pg_entry.appendChild(t_entry);
			
			d_entry = doc.createElement('desc');
			d_entry.setAttribute("lang", "en");
			d_entry_content = doc.createTextNode(epg['descr']);
			d_entry.appendChild(d_entry_content);
			pg_entry.appendChild(d_entry);
			
			dt_entry = doc.createElement('date');
			dt_entry_content = doc.createTextNode(epg['on_date']);
			dt_entry.appendChild(dt_entry_content);
			pg_entry.appendChild(dt_entry);
			
			c_entry = doc.createElement('category');
			c_entry_content = doc.createTextNode(epg['category']);
			c_entry.appendChild(c_entry_content);
			pg_entry.appendChild(c_entry);
			
		
			if channel != None and channel['logo'] != '':
				i_entry = doc.createElement('icon');
				i_entry.setAttribute("src", url + ':8080/misc/logos/320/' + channel['logo']);
				i_entry.appendChild(i_entry_content);
				pg_entry.appendChild(i_entry);

	
	with open(portalurl, 'wb') as f: f.write(doc.toxml(encoding='utf-8'));
	
	return doc.toxml(encoding='utf-8');
	



def retriveUrl(portal_mac, url, serial, channel, tmp):
	
	setMac(portal_mac);
	setSerialNumber(serial);
		
	if 'matrix' in channel:
		return retrieve_matrixUrl(url, channel);
		
	else:
		return retrive_defaultUrl(url, channel, tmp);
		
	
		
def retrive_defaultUrl(url, channel, tmp):

	if tmp == '0':
		s = channel.split(' ');
		url = s[0];
		if len(s)>1:
			url = s[1];
		return url;


	handshake(url);
	
	cmd = channel;
    
	

	info = retrieveData(url, values = {
		'type' : 'itv', 
		'action' : 'create_link', 
		'cmd' : channel});
	cmd = info['js']['cmd'];
		
	s = cmd.split(' ');
			
	url = s[0];
	
	if len(s)>1:
		url = s[1];


	# RETRIEVE THE 1 EXTM3U
	request = urllib.request.Request(url)
	request.get_method = lambda : 'HEAD'
	response  = urllib.request.urlopen(request);
	data = response.read();
	
	
	data = data.splitlines();
	data = data[len(data) - 1];

	# RETRIEVE THE 2 EXTM3U
	url = response.geturl().split('?')[0];
	url_base = url[: -(len(url) - url.rfind('/'))]
	return url_base + '/' + data;

	
	return url;


def retrieve_matrixUrl(url, channel):

	channel = channel.split('/');
	channel = channel[len(channel) -1];
	
	url += '/:8080/server/api/matrix.php?channel=' + channel + '&mac=' + mac;
	
	# RETRIEVE THE 1 EXTM3U
	request = urllib.request.Request(url)
	response  = urllib.request.urlopen(request);
	data = response.read();

	_s1 = data.split(' ');	
	data = _s1[0];
	if len(_s1)>1:
		data = _s1[len(_s1) -1];
	
	return data;



def retriveVoD(portal_mac, url, serial, video):
	
	setMac(portal_mac);
	setSerialNumber(serial);
		
	s = video.split(' ');
	url = s[0];
	if len(s)>1:
		url = s[1];

	
	url = url.replace('TOMTOM:', 'http://');
	

	# RETRIEVE THE 1 EXTM3U
	request = urllib.request.Request(url)
	response  = urllib.request.urlopen(request);
	url = response.geturl();


	# RETRIEVE THE 1 EXTM3U
	request = urllib.request.Request(url)
	#request.get_method = lambda : 'HEAD'
	response  = urllib.request.urlopen(request);
	data = response.read();
	data = data.splitlines();
	data = data[len(data) - 1];
	
	# RETRIEVE THE 2 EXTM3U
	url = response.geturl().split('?')[0];
	url_base = url[: -(len(url) - url.rfind('/'))]
	return url_base + '/' + data;

def clearCache(url, path):
	
	portalurl = "_".join(re.findall("[a-zA-Z0-9]+", url));
	
	for root, dirs, files in os.walk(path):
		for file in files:
			if file.startswith(portalurl):
				os.remove(root + '/' + file);


def main(argv):

      if argv[0] == 'load':
      	#getAllChannels(argv[1], argv[2], None, argv[4]);
      	data = getAllChannels(argv[1], argv[2], json.loads(argv[3]), argv[4]);
      	
      	
      elif argv[0] == 'genres':
      	getGenres(argv[1], argv[2], None, argv[3]);

      elif argv[0] == 'vod':
      	getVoD('', argv[1], argv[2]);
      	
      elif argv[0] == 'channel':     	
      	url = retriveUrl(argv[1], argv[2], json.loads(argv[3]), argv[4], argv[5]);
      	print (url)
	
      elif argv[0] == 'vod_url':
      	url = retriveVoD('', argv[1], argv[2]);
      	print (url)
      	
      elif argv[0] == 'cache':
      	clearCache(argv[1], argv[2]);
      	
      elif argv[0] == 'profile':
      	handshake(argv[1]);
      	
      elif argv[0] == 'epg':
      	url = getEPG(argv[1], argv[2], json.loads(argv[3]), argv[4]);
      	#print (url)



if __name__ == "__main__":
   main(sys.argv[1:])


und hier das ganze addon
http://kcguide.de/Addons/entwicklung/pl ... lker19.zip

wäre nett wenn mir jemand einen Schubbser in die richtige Richtung geben könnte
MFG und Danke
kangool
User
Beiträge: 12
Registriert: Mittwoch 24. März 2021, 21:30

ach ja sorry es geht um diesen abschnitt hier

Code: Alles auswählen

	cmd = channel;
    
	

	info = retrieveData(url, values = {
		'type' : 'itv', 
		'action' : 'create_link', 
		'cmd' : channel});
	cmd = info['js']['cmd'];
		
	s = cmd.split(' ');
			
	url = s[0];
	
	if len(s)>1:
		url = s[1];
exact diesem hier

'cmd' : channel});

wenn jemand das addon installiert es sind zugänge 1 bis 10 die eben mit nem direktlink sind im stalker portal
und 11 ist eben einer mit localhost

mit http debbuger oder fiddler sieht man dann auc wunderbar die ausgabe der links
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kangool: Also Du bist eigentlich kein Programmierer, und wir haben hier ein 680+ Zeilen langes Programm, das offensichtlich nicht von jemandem stammt der wirklich Python programmiert, sondern eigentlich in einer anderen Programmiersprache — Ich habe noch nie sooo viele Semikolons in einem ”Python”-Quelltext gesehen.

Dann gibt es ``global`` und einiges an kopiertem Code, und Sachen da wünschte ich gerade ich hätte die nicht gesehen. Mal zufällig rausgegriffen `getAllChannels()`: Da wird ziemlich aufwändig und unübersichtlich manuell aus JSON-Daten eine neue ”Datenstruktur” als Zeichenkette mit JSON-Quelltext mittels Zeichenkettenoperationen zusammengebastelt. Ich dachte ja erst um das als JSON dann irgendwo ins Netz zu schicken, aber nein: diese zusammengebastelte JSON-Zeichenkette wird am Ende geparst um im Programm eine Python-Datenstruktur zu haben. Warum zur Hölle bastelt man sich dafür erst umständlich und fehleranfällig eine Zeichenkette mit JSON zusammen, statt gleich viel einfacher, lesbarer, und weniger fehleranfällig die Python-Datenstruktur aufzubauen‽

Dann gibt es so Sachen wie dauernd ``if``-Anweisungen denen gleich als nächstes ein ``if``- oder ``elif``-Anweisung mit genau der entgegengesetzten Bedingung folgen, statt ``else`` zu nehmen.

Da war also nicht nur kein Python-Programmierer am Werk, sondern ganz generell jemand der nicht gut programmiert.

Und da soll man jetzt suchen wo ein '+' in eine URL kommen könnte.

Edit: Habe den neuen Beitrag gesehen: Das Programm ist da also gar nicht schuld an dem "+", sondern das ist in den Daten die es bekommt. Na dann muss man halt korrekt damit umgehen. Mit "%20" statt dem Leerzeichen käme das Programm ja auch nicht klar. In `urllib.parse` gibt es Funktionen um Zeichen ausserhalb von ASCII passend für URLs zu kodieren. Und auch für die Rückrichtung.

Was in dem Programm an URLs und Dateipfaden als Zeichenkettenoperationen zusammengebastelt wird, sieht grundsätzlich recht abenteuerlich aus. Für Pfade verwendet man besser `pathlib` und für HTTP-Anfragen würde ich das `requests`-Modul verwenden. `minidom` verwendet man eigentlich auch nicht wenn man nicht muss. Die ElementTree-API ist „pythonischer“.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
kangool
User
Beiträge: 12
Registriert: Mittwoch 24. März 2021, 21:30

wie gesagt es ist nicht mein addon
es ist ein uraltes ding
das ich mal irgendwo ausgegraben hatte und mit den richtigen zugängen, also stalker middlware portalen, auch ohne probleme funktioniert
in kodi18 (ds original addon in py2)
und auch in kodi19 funkioniert es so mit den richtigen portalen
ich würde aber gerne meinen eigenen portal zugang mit meiner mac der mag 254 verwenden


wenn er sich eben channel aus der abgespeichertein datei holt (was ich oben eh geschrieben habe) fügt er halt zwischen

ffmpeg und http ein + ein und nicht wie er sollte %20
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kangool: Wie gesagt, das Programm selbst scheint das nicht zu tun, sondern das Datum bereits mit dem "+" vom Server zu bekommen. Und auch "%20" statt "+" würde an der Stelle ebenfalls das gleiche Problem machen, weil auch das nicht mit einem ``.split(" ")`` zu trennen wäre.

Grundsätzlich gibt es wie schon gesagt in `urllib.parse()` passende Funktionen um das zu richten.

Wobei man auch dann noch sagen muss, dass das `split()` nicht robust ist, denn in der dem "ffmpeg" folgenden URL können ja ebenfalls kodierte Leerzeichen enthalten sein, wodurch das `split()` dann nicht mehr nur zwei Teile liefert, nach dem dekodieren. Wenn man genau zwei Teile erwartet, ist `partition()` die sinnvollere Wahl.

Edit: Ich weiss, dass ist nicht von Dir, aber `cmd` in dem gezeigten Quelltextabschnitt für so unterschiedliche Dinge zu verwenden, ist auch recht verwirrend. Zumal `channel` ja auch nur unnötigerweise zu `cmd` umbenannt wird.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
kangool
User
Beiträge: 12
Registriert: Mittwoch 24. März 2021, 21:30

__blackjack__ hat geschrieben: Dienstag 5. Oktober 2021, 10:34 @kangool: Wie gesagt, das Programm selbst scheint das nicht zu tun, sondern das Datum bereits mit dem "+" vom Server zu bekommen. Und auch "%20" statt "+" würde an der Stelle ebenfalls das gleiche Problem machen, weil auch das nicht mit einem ``.split(" ")`` zu trennen wäre.

Grundsätzlich gibt es wie schon gesagt in `urllib.parse()` passende Funktionen um das zu richten.

Wobei man auch dann noch sagen muss, dass das `split()` nicht robust ist, denn in der dem "ffmpeg" folgenden URL können ja ebenfalls kodierte Leerzeichen enthalten sein, wodurch das `split()` dann nicht mehr nur zwei Teile liefert, nach dem dekodieren. Wenn man genau zwei Teile erwartet, ist `partition()` die sinnvollere Wahl.

Edit: Ich weiss, dass ist nicht von Dir, aber `cmd` in dem gezeigten Quelltextabschnitt für so unterschiedliche Dinge zu verwenden, ist auch recht verwirrend. Zumal `channel` ja auch nur unnötigerweise zu `cmd` umbenannt wird.
danke für die aufklärung
urrlib.parse funktion wäre in dem fal quote....was aber in dem fall wieder nicht funktioniert weil nicht mit bytes kompatible....
ich versteh grösstenteils was der code bewirkt

ich werd mich wohl drannsetzen müssen und python lernen muss...weil werd wohl so nix werden ausser das teil neu aufzubauen
Antworten