Tak to by museli mít omezené ve smluvních podmínkách, a pochybuji, že se k tomu odhodlají. Smyslem je, a všichni to tak deklarují, mít možnost se dívat současně na více zařízeních. Pokud k tomu někdo přistoupí, riskuje ztrátu trhu.
Na druhou stranu je vidět, že zatížení sítě bývá občas enormní a pokud to přestává fungovat, tak nějaká restrikce samozřejmě přijít může. Otázka je, jak se k tomu zase postaví poskytovatelé připojení. Nárůst služeb OTT je pro ně určitě další příležitost, jak získat zákazníky. Takže uvidíme, co s tím udělá trh. Už dnes je jasné, že jsou mezi poskytovateli poměrně značné rozdíly v kvalitě služeb a garanci parametrů. Často to samozřejmě bývá regionální záležitost, ale výběr poskytovatele připojení (je-li možný) se ukazuje v tomto případě jako klíčový. Já mám například kliku, v mém bydlišti a u mého poskytovatele jsou ty služby excelentní, takže v podstatě všechny problémy plynoucí z parametrů připojení se mě absolutně (klepu to na dřevo) netýkají.
Jen technická poznámka. U používání (v tomto a podobných tématech na fóru uvedených postupů) je samozřejmě důležité dodržovat jisté zásady. Mnoho uživatelů si myslelo, že poskytovatelem limitovaný počet zařízení "očůrají" a budou si různá zařízení registrovat pod jedním ID. To sice může chvíli fungovat, ale je jasné, že jednoduchou kontrolou na to poskytovatel může celkem snadno přijít a pak je jisté, že s tomu učiní přítrž. Druhá věc je, že někteří poskytovatelé (např. DIGI TV na platformě 4NET) nepodporují současné spuštění více streamů pro jedno zařízení. U poskytovatelů používajících NanguTV jsem zatím takovou restrikci neviděl.
podívej se na obsah subscription-configuration.json u orange.sk, dřív sem si nevšiml parametru maxConcurrentStreams:, ale je tam. k 4net platformě, máš správný postřeh, hlavně DIGI TV pobízí k detailnějšímu logování.
Jak si vyřešil přihlašování u Viagia ? Funguje na jiným principu než O2 nebo Orange. Já generuju jednou za 24 h cookies file. Používám php verzi generátoru.
(14.5.2019, 12:51)jastrab Napsal(a): [ -> ]Staci nahradit hodnotu PC za STB v params: {"deviceType": "STB"}, pri ziskavani kanalov (procka live_channels).
Vid hodnota recordTvPlayableDeviceTypes v jsone: [u'MOBILE', u'CONNECTED_TV', u'PC', u'TABLET', u'STB', u'APPLE_TV']
V jakém API volání to vrací tento JSON? :) To je náhodou cool že už patlají asi 2 roky appku na Apple TV
Já jsem viaGIA ještě netestoval. Nemám účet. Příští týden budu testovat klasickou TV od T-Mobile a upřímně řečeno ani nevím, jaký je mezi TV T-Mobile a viaGIA rozdíl. Jakmile otestuji T-Mobile, tak se podívám i na viaGIA.
Jinak to, že každá implementace NanguTV má vlastní způsob přihlašování, je celkem pochopitelné. Musí se navázat na autorizační postupy daného poskytovatele. Stejně jako se pravděpodobně upravují detaily služby a její parametry a omezení. A to, že se tam objevil parametr maxConcurrentStreams: je také celkem pochopitelné. Možnost requestu na více streamů z jednoho zařízení je jedna z věcí, kterou asi zakáží postupně všichni. Z jejich pohledu to není parametr, kterým by získávali většinovou masu zákazníků. Těch pár uživatelů s Tvheadend je nezajímá, naopak jsou to pro ně potenciální šiřitelé pirátského obsahu. Takže proč by je měli krmit...
(19.5.2019, 13:01)marhycz Napsal(a): [ -> ]V jakém API volání to vrací tento JSON? :) To je náhodou cool že už patlají asi 2 roky appku na Apple TV
pri volani
channels.json v: class
O2TVGO -> def
live_channels, a tam v JSONe pri konkretnej stanici je definovane
recordTvPlayableDeviceTypes
pošli mi sz nebo mail dám ti účet
Ozvu se později, teď na to moc času nemám.
: Děkuji Ti moc! To se tam kouknu znova.
Tak mi došlo, co jsi myslel tím Viagia. Myslel jsem si, že je to nějaká další verze platformy pro T-Mobile TV.
Konečně mi dorazil balíček od T-Mobile. Zatím jsem to jen narychlo vyzkoušel na telefonu, ale když jsem chtěl nahrát komunikaci a spustil Pocket Capture, tak mi s tím aplikace T-Mobile TV nefunguje a já se ani nepřihlásím. Vypadá to, jako by to měli blokované, pokud je aktivní VPN...
, jop.. nepříhlásíš se na žádné appce. zkoušel už dávno. potřeboval bych s tebou probrat jednu věc. mimo veřejné forum.
o2tvgo.py pro t-mobile... mám i ostatní.
Kód:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Wrapper pro O2TV Go
"""
import requests
__author__ = "Štěpán Ort"
__license__ = "MIT"
__version__ = "1.1.8"
__email__ = "stepanort@gmail.com"
_COMMON_HEADERS = {"X-NanguTv-App-Version": "Android#1.2.9",
"X-NanguTv-Device-Name": "Nexus 7",
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 5.1.1; Nexus 7 Build/LMY47V)",
"Accept-Encoding": "gzip",
"Connection": "Keep-Alive"}
def _to_string(text):
if type(text).__name__ == 'unicode':
output = text.encode('utf-8')
else:
output = str(text)
return output
# Kanál
class LiveChannel:
# JiRo - doplněn parametr kvality
def __init__(self, o2tv, channel_key, name, logo_url, weight, quality):
self._o2tv = o2tv
self.channel_key = channel_key
self.name = name
self.weight = weight
self.logo_url = logo_url
self.quality = quality # doplněn parametr kvality
def url(self):
if not self._o2tv.access_token:
self._o2tv.refresh_access_token()
access_token = self._o2tv.access_token
if not self._o2tv.subscription_code:
self._o2tv.refresh_configuration()
subscription_code = self._o2tv.subscription_code
playlist = None
while access_token:
params = {"serviceType": "LIVE_TV",
"subscriptionCode": subscription_code,
"channelKey": self.channel_key,
"deviceType": "PC",
"videoCodec": "H264",
"streamingProtocol": "HLS"} # JiRo - doplněn parametr kvality
headers = _COMMON_HEADERS
cookies = {"access_token": access_token,
"deviceId": self._o2tv.device_id}
req = requests.get('http://app01.prg04.iptv.viagia.cz/sws/server/streaming/uris.json',
params=params, headers=headers, cookies=cookies)
json_data = req.json()
access_token = None
if 'statusMessage' in json_data:
status = json_data['statusMessage']
if status == 'bad-credentials':
access_token = self._o2tv.refresh_access_token()
elif status == 'channel.not-found':
raise ChannelIsNotBroadcastingError()
else:
raise Exception(status)
else:
# Pavuucek: Pokus o vynucení HD kvality
playlist = ""
# pro kvalitu STB nebo PC se pokusíme vybrat HD adresu.
# když není k dispozici, tak první v seznamu
for uris in json_data["uris"]:
if self.quality == "STB" or self.quality == "PC":
if uris["resolution"] == "HD" and playlist == "":
playlist = uris["uri"]
else:
# pro ostatní vracíme SD adresu
if uris["resolution"] == "SD" and playlist == "":
playlist = uris["uri"]
# playlist nebyl přiřazený, takže první adresa v seznamu
if playlist == "":
playlist = json_data["uris"][0]["uri"]
return playlist
class ChannelIsNotBroadcastingError(BaseException):
pass
class AuthenticationError(BaseException):
pass
class TooManyDevicesError(BaseException):
pass
# JiRo - doplněna kontrola zaplacené služby
class NoPurchasedServiceError(BaseException):
pass
class O2TVGO:
def __init__(self, device_id, username, password, quality, log_function=None): # JiRo - doplněn parametr kvality
self.username = username
self.password = password
self._live_channels = {}
self.access_token = None
self.subscription_code = None
self.locality = None
self.offer = None
self.device_id = device_id
self.quality = quality # JiRo - doplněn parametr kvality
self.log_function = log_function
def _log(self, message):
if self.log_function:
self.log_function(message)
def get_access_token_password(self):
self._log('Getting Token via password...')
if not self.username or not self.password:
raise AuthenticationError()
headers = _COMMON_HEADERS
headers["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"
data = {'grant_type': 'password',
'client_id': 'web-portal-tsystem',
'client_secret': 'siez5teu0eedoo1Aoch4quux8Xez2i',
'isp_id': '1',
'username': self.username,
'password': self.password,
'platform_id': 'a2c01b0ef79ba0200293ef838660df59',
}
req = requests.post('https://oauth.prg04.iptv.viagia.cz/oauth/token',
data=data, headers=headers, verify=False)
j = req.json()
if 'error' in j:
error = j['error']
if error == 'authentication-failed':
self._log('Authentication Error')
return None
else:
raise Exception(error)
self.access_token = j["access_token"]
self.expires_in = j["expires_in"]
self._log('Token OK')
return self.access_token
def refresh_access_token(self):
if not self.access_token:
self.get_access_token_password()
if not self.access_token:
self._log('Authentication Error (failed to get token)')
raise AuthenticationError()
return self.access_token
def refresh_configuration(self):
if not self.access_token:
self.refresh_access_token()
access_token = self.access_token
headers = _COMMON_HEADERS
cookies = {"access_token": access_token, "deviceId": self.device_id}
req = requests.get(
'http://app01.prg04.iptv.viagia.cz/sws/subscription/settings/subscription-configuration.json', headers=headers,
cookies=cookies)
j = req.json()
if 'errorMessage' in j:
error_message = j['errorMessage']
status_message = j['statusMessage']
# JiRo - změna z 'unauthorized-device' na 'devices-limit-exceeded'
if status_message == 'devices-limit-exceeded':
raise TooManyDevicesError()
else:
raise Exception(error_message)
self.subscription_code = _to_string(j["subscription"])
self.offer = j["billingParams"]["offers"]
self.tariff = j["billingParams"]["tariff"]
self.locality = j["locality"]
def live_channels(self):
if not self.access_token:
self.refresh_access_token()
access_token = self.access_token
if not self.offer:
self.refresh_configuration()
offer = self.offer
if not self.tariff:
self.refresh_configuration()
tariff = self.tariff
if not self.locality:
self.refresh_configuration()
locality = self.locality
quality = self.quality # JiRo - doplněn parametr kvality
if len(self._live_channels) == 0:
headers = _COMMON_HEADERS
cookies = {"access_token": access_token,
"deviceId": self.device_id}
params = {"locality": self.locality,
"tariff": self.tariff ,
"isp": "1",
"imageSize": "LARGE",
"language": "cze",
"deviceType": "PC",
"liveTvStreamingProtocol": "HLS",
"offer": self.offer} # doplněn parametr kvality
req = requests.get('http://app01.prg04.iptv.viagia.cz/sws/server/tv/channels.json',
params=params, headers=headers, cookies=cookies)
j = req.json()
purchased_channels = j['purchasedChannels']
if len(purchased_channels) == 0: # JiRo - doplněna kontrola zaplacené služby
raise NoPurchasedServiceError() # JiRo - doplněna kontrola zaplacené služby
items = j['channels']
for channel_id, item in items.iteritems():
if channel_id in purchased_channels:
live = item['liveTvPlayable']
if live:
channel_key = _to_string(item['channelKey'])
logo = _to_string(item['logo'])
if not logo.startswith('http://'):
logo = 'http://app01.prg04.iptv.viagia.cz/' + logo
name = _to_string(item['channelName'])
weight = item['weight']
self._live_channels[channel_key] = LiveChannel(
self, channel_key, name, logo, weight, quality) # doplněn parametr kvality
done = False
offset = 0
return self._live_channels
Mám na vás jednu otázku..ako tu riesite EPG ? Kedze v playliste sú názvy stanic ine ako by som potřeboval..Dakujem.
(14.8.2019, 16:11)otava5 Napsal(a): [ -> ]Client: Dokázal bys nám udělat playlist.sh pro Orange? Trápím se s tím už pár hodin a nějak jsem se neposunul....
https://pastebin.com/raw/bQVWtaGs
v php nejak takto (array_keys(json_decode($res, true)['channel
Key'])); ????????????????
potřeboval bych bash ne php....
Jseme mimo prostor a čas... Až se vrátím domů. Víkend.
(14.8.2019, 16:11)otava5 Napsal(a): [ -> ]Client: Dokázal bys nám udělat playlist.sh pro Orange? Trápím se s tím už pár hodin a nějak jsem se neposunul....
https://pastebin.com/raw/bQVWtaGs
hhh...
Ale já se tam nedostanu. Raději to stáhni a pošli mi to v souboru, jako ten předchozí. Ale to podle mne byl úplně jiný json, než ten, které potřebuju. Z toho žádný playlist nesestavím.
Ale z tohohle já regulérní playlist neudělám. Repektive, můžu udělat, ale jen nějakým odhadem, když si řeknu, že ty konce jako _archiv, archiv_30, _osk, a pod. oříznu a to co zbude prohlásím za identifikaci kanálu. A je to ono skutečně tak? A co ty "konce" znamenají. Budou tam jen ty, co jsem vyjmenoval, nebo se tam mohou objevit i jiné? A nebo je identifikace kanálu to celé? Odchytejte response, kde je nějaký regulérní seznam live kanálů služby jako v O2. Takový typ odpovědi tam přeci přeci musí. To co jsi poslal, regulérní seznam není. A pokud chcete dekódovat tohle, tak to parsujte jako text.
Jinak tady na začátku tématu máš řešení pro Orange v pythonu, takže se stačí na to parsování podávat tam a přepsat to do scriptu.
Upřímně, mně se už nechce se v tom babrat. Věnoval jsme tomu už hodně času a peněz za zaplacené služby a stačilo mi to. To co potřebuji já nebo mí známí z OTT jsem udělal a na ničem dalším se nehodlám už podílet.