• Vítejte na XBMC-Kodi.cz
  • Česko-slovenská komunita fanoušků XBMC/Kodi
Vítejte návštevníku! Přihlášení Registrace


Hodnocení tématu:
  • 6 Hlas(ů) - 2.33 Průměr
  • 1
  • 2
  • 3
  • 4
  • 5
Playlist OrangeTV Addon
#41
@eta 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.
 
Citovat
#42
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.
 
Citovat
#43
(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 Big Grin
SZ nepoužívejte na dotazy, které se hodí pro všechny. Pouze pokud chcete abych něco někde doplnil, opravil.
_____
i3 Haswell + Arch Linux + Docker (Tvheadend + WG + Home-Assistant + Deconz + LetsEncrypt ) + Samba Share
Apple TV (Infuse, TvhClient), Apollo Lake Mini PC (Kodi 18.4)
 
Citovat
#44
@eta 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...
 
Citovat
#45
(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 Big Grin

pri volani channels.json v: class O2TVGO -> def live_channels, a tam v JSONe pri konkretnej stanici je definovane recordTvPlayableDeviceTypes
 
Citovat
#46
@Client

pošli mi sz nebo mail dám ti účet
 
Citovat
#47
@eta Ozvu se později, teď na to moc času nemám.
 
Citovat
#48
@jastrab: Děkuji Ti moc! To se tam kouknu znova.
SZ nepoužívejte na dotazy, které se hodí pro všechny. Pouze pokud chcete abych něco někde doplnil, opravil.
_____
i3 Haswell + Arch Linux + Docker (Tvheadend + WG + Home-Assistant + Deconz + LetsEncrypt ) + Samba Share
Apple TV (Infuse, TvhClient), Apollo Lake Mini PC (Kodi 18.4)
 
Citovat
#49
@eta 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. 6 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...
 
Citovat
#50
@Client, 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
 
Citovat
#51
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.
 
Citovat
#52
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
 
Citovat
#53
(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)['channelKey'])); ????????????????
 
Citovat
#54
potřeboval bych bash ne php....
 
Citovat
#55
@otava5 Jseme mimo prostor a čas... Až se vrátím domů. Víkend.
 
Citovat
#56
(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...
 
Citovat
#57
Client: link na json pro playlist.sh je https://app01.gtm.orange.sk/sws/subscrip...cess_token=zde token z access.id
Děkuji  6
 
Citovat
#58
@otava5 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.
 
Citovat
#59
Client: https://pastebin.com/raw/bQVWtaGs je jako https://app01.gtm.orange.sk/sws/subscrip...ken=xxxxxx
Omlouvám se nemůžu se dávat platný token viz screen....
a tento token je obsažen v access.id stejně jako u o2tv...


Přiložené soubory Miniatury
   
 
Citovat
#60
@otava5 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.
 
Citovat
  


Přejít na fórum:


Prochází: 1 host(ů)