PK ~BQxP , , plugin.video.tvone1112/addon.py# -*- coding: utf-8 -*-
#
# Copyright (C) 2018 RACC
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
from __future__ import unicode_literals, absolute_import
import sys
from xbmcgui import ListItem
from kodi_six import xbmc, xbmcgui, xbmcaddon, xbmcplugin
from routing import Plugin
import os
import json
from future.moves.urllib.parse import urlencode
from datetime import datetime
from dateutil.parser import parse
from dateutil.tz import gettz, tzlocal
from resources.lib.lntv import LnTv, LiveStream
try:
from xbmcvfs import translatePath
except ImportError:
from kodi_six.xbmc import translatePath
addon = xbmcaddon.Addon()
plugin = Plugin()
plugin.name = addon.getAddonInfo("name")
user_agent = "Dalvik/2.1.0 (Linux; U; Android 5.1.1; AFTT Build/LVY48F)"
USER_DATA_DIR = translatePath(addon.getAddonInfo("profile"))
ADDON_DATA_DIR = translatePath(addon.getAddonInfo("path"))
RESOURCES_DIR = os.path.join(ADDON_DATA_DIR, "resources")
if not os.path.exists(USER_DATA_DIR):
os.makedirs(USER_DATA_DIR)
cert_file = os.path.join(RESOURCES_DIR, "com.lnt.androidnettv.crt")
cert_key_file = os.path.join(RESOURCES_DIR, "com.lnt.androidnettv.key")
mytv = LnTv(USER_DATA_DIR, cert_file, cert_key_file)
try:
locale_timezone = json.loads(
xbmc.executeJSONRPC(
'{"jsonrpc": "2.0", "method": "Settings.GetSettingValue", "params": {"setting": "locale.timezone"}, "id": 1}'
)
)
if "result" in locale_timezone:
if locale_timezone["result"]["value"]:
local_tzinfo = gettz(locale_timezone["result"]["value"])
else:
local_tzinfo = tzlocal()
else:
local_tzinfo = tzlocal()
except:
local_tzinfo = ""
def xbmc_curl_encode(url):
return "{0}|{1}".format(url[0], urlencode(url[1]))
def time_from_zone(timestring, newfrmt="default", in_zone="UTC"):
try:
if newfrmt == "default":
newfrmt = xbmc.getRegion("time").replace(":%S", "")
in_time = parse(timestring)
in_time_with_timezone = in_time.replace(tzinfo=gettz(in_zone))
local_time = in_time_with_timezone.astimezone(local_tzinfo)
return local_time.strftime(newfrmt)
except:
return timestring
@plugin.route("/")
def root():
mytv.update_live_channels()
list_items = []
for category in mytv.get_live_categories():
li = ListItem(category.cat_name, offscreen=True)
url = plugin.url_for(list_channels, cat=category.cat_id)
list_items.append((url, li, True))
li = ListItem("[VOD]", offscreen=True)
url = plugin.url_for(vod)
list_items.append((url, li, True))
li = ListItem("[Live]", offscreen=True)
url = plugin.url_for(list_live)
list_items.append((url, li, True))
xbmcplugin.addDirectoryItems(plugin.handle, list_items)
xbmcplugin.endOfDirectory(plugin.handle)
@plugin.route("/vod")
def vod():
mytv.update_vod_channels()
list_items = []
for category in mytv.get_vod_categories():
li = ListItem(category.cat_name, offscreen=True)
url = plugin.url_for(vod_list, cat=category.cat_id)
list_items.append((url, li, True))
xbmcplugin.addDirectoryItems(plugin.handle, list_items)
xbmcplugin.endOfDirectory(plugin.handle)
@plugin.route("/vod_list/")
def vod_list(cat):
mytv.update_vod_channels()
image_headers = {"User-Agent": mytv.user_agent}
list_items = []
for channel in mytv.get_vod_channels_by_category(int(cat)):
li = ListItem(channel.name, offscreen=True)
image = xbmc_curl_encode((channel.image_path, image_headers))
li.setProperty("IsPlayable", "true")
li.setInfo(type="Video", infoLabels={"Title": channel.name, "mediatype": "video"})
li.setArt({"thumb": image, "icon": image})
url = plugin.url_for(play_vod, channel=channel.channel_id)
list_items.append((url, li, False))
xbmcplugin.addDirectoryItems(plugin.handle, list_items)
xbmcplugin.setContent(plugin.handle, "videos")
xbmcplugin.endOfDirectory(plugin.handle)
@plugin.route("/list_live")
def list_live():
live_data = mytv.get_live_events()
list_items = []
for day, events in live_data.items():
for event in events:
if len(event["channel_list"]) == 0:
continue
event_time = time_from_zone(datetime.utcfromtimestamp(int(event["start"])).strftime("%c"), "%Y-%m-%d %H:%M")
title = "[{0}] {1}".format(event_time, event["title"])
li = ListItem(title, offscreen=True)
li.setProperty("IsPlayable", "true")
li.setInfo(type="Video", infoLabels={"Title": title, "mediatype": "video"})
url = plugin.url_for(event_resolve, title=event["title"].encode("utf-8"))
list_items.append((url, li, False))
xbmcplugin.addSortMethod(plugin.handle, xbmcplugin.SORT_METHOD_LABEL)
xbmcplugin.addDirectoryItems(plugin.handle, list_items)
xbmcplugin.setContent(plugin.handle, "videos")
xbmcplugin.endOfDirectory(plugin.handle)
@plugin.route("/event_resolve.pvr")
def event_resolve():
def find_event(data, title):
for day, events in live_data.items():
for event in events:
if event["title"] == title:
return event
live_data = mytv.get_live_events()
live_event = find_event(live_data, plugin.args["title"][0])
if len(live_event["channel_list"]) > 1:
select_list = []
for channel in live_event["channel_list"]:
select_list.append(channel["c_name"])
dialog = xbmcgui.Dialog()
ret = dialog.select("Choose Stream", select_list)
selected_channel = live_event["channel_list"][ret]
else:
selected_channel = live_event["channel_list"][0]
resolved_stream = ()
link = selected_channel["links"][0]
stream = mytv.get_live_link(link)
new_stream = LiveStream(
url=stream.get("link"),
token=stream.get("token"),
user_agent=stream.get("user_agent"),
referer=stream.get("referer"),
player_referer=stream.get("player_referer"),
player_user_agent=stream.get("player_user_agent"),
)
resolved_stream = mytv.resolve_stream(new_stream)
li = ListItem(path=xbmc_curl_encode(resolved_stream))
if "playlist.m3u8" in resolved_stream[0]:
li.setContentLookup(False)
li.setMimeType("application/vnd.apple.mpegurl")
if addon.getSetting("inputstream") == "true":
if int(xbmc.__version__[0]) < 3:
li.setProperty("inputstreamaddon", "inputstream.adaptive")
else:
li.setProperty("inputstream", "inputstream.adaptive")
li.setProperty("inputstream.adaptive.manifest_type", "hls")
li.setProperty("inputstream.adaptive.stream_headers", urlencode(resolved_stream[1]))
xbmcplugin.setResolvedUrl(plugin.handle, True, li)
@plugin.route("/list_channels/")
def list_channels(cat=None):
mytv.update_live_channels()
image_headers = {"User-Agent": mytv.user_agent}
list_items = []
for channel in mytv.get_live_channels_by_category(int(cat)):
li = ListItem(channel.name, offscreen=True)
image = xbmc_curl_encode((channel.image_path, image_headers))
li.setProperty("IsPlayable", "true")
li.setInfo(type="Video", infoLabels={"Title": channel.name, "mediatype": "video"})
li.setArt({"thumb": image, "icon": image})
url = plugin.url_for(play, c_id=channel.channel_id)
list_items.append((url, li, False))
xbmcplugin.addDirectoryItems(plugin.handle, list_items)
xbmcplugin.setContent(plugin.handle, "videos")
xbmcplugin.endOfDirectory(plugin.handle)
@plugin.route("/play//play.pvr")
def play(c_id):
mytv.update_live_channels()
image_headers = {"User-Agent": mytv.user_agent}
stream_list = mytv.get_streams_by_channel_id(int(c_id))
if stream_list.count() > 1:
select_list = []
for stream in stream_list:
select_list.append("Stream {0} {1}".format(stream.token, stream.stream_id))
dialog = xbmcgui.Dialog()
ret = dialog.select("Choose Stream", select_list)
# if not
selected_stream = stream_list[ret]
else:
selected_stream = stream_list[0]
resolved_stream = mytv.resolve_stream(selected_stream)
image = xbmc_curl_encode((selected_stream.livechannel.image_path, image_headers))
title = selected_stream.livechannel.name
li = ListItem(title, path=xbmc_curl_encode(resolved_stream))
li.setArt({"thumb": image, "icon": image})
if "playlist.m3u8" in resolved_stream[0]:
li.setContentLookup(False)
li.setMimeType("application/vnd.apple.mpegurl")
if addon.getSetting("inputstream") == "true":
if int(xbmc.__version__[0]) < 3:
li.setProperty("inputstreamaddon", "inputstream.adaptive")
else:
li.setProperty("inputstream", "inputstream.adaptive")
li.setProperty("inputstream.adaptive.manifest_type", "hls")
li.setProperty("inputstream.adaptive.stream_headers", urlencode(resolved_stream[1]))
xbmcplugin.setResolvedUrl(plugin.handle, True, li)
@plugin.route("/play_vod")
def play_vod():
mytv.update_vod_channels()
image_headers = {"User-Agent": mytv.user_agent}
channel = int(plugin.args["channel"][0])
stream_list = mytv.get_vodstreams_by_channel_id(channel)
if stream_list.count() > 1:
select_list = []
for stream in stream_list:
select_list.append(stream.quality)
dialog = xbmcgui.Dialog()
ret = dialog.select("Choose Stream", select_list)
# if not
selected_stream = stream_list[ret]
else:
selected_stream = stream_list[0]
resolved_stream = mytv.resolve_stream(selected_stream)
image = xbmc_curl_encode((selected_stream.vodchannel.image_path, image_headers))
title = selected_stream.vodchannel.name
li = ListItem(title, path=xbmc_curl_encode(resolved_stream))
li.setArt({"thumb": image, "icon": image})
if "playlist.m3u8" in resolved_stream[0]:
li.setContentLookup(False)
li.setMimeType("application/vnd.apple.mpegurl")
if addon.getSetting("inputstream") == "true":
if int(xbmc.__version__[0]) < 3:
li.setProperty("inputstreamaddon", "inputstream.adaptive")
else:
li.setProperty("inputstream", "inputstream.adaptive")
li.setProperty("inputstream.adaptive.manifest_type", "hls")
li.setProperty("inputstream.adaptive.stream_headers", urlencode(resolved_stream[1]))
xbmcplugin.setResolvedUrl(plugin.handle, True, li)
if __name__ == "__main__":
plugin.run(sys.argv)
del mytv
PK ~BQ9] ] plugin.video.tvone1112/addon.xml
video
true
tvOne1112
tvOne1112
all
GPL-3.0-only
PK 4P7ъ ! plugin.video.tvone1112/fanart.jpgIExif MM * b j( 1 " r2 i + ' + 'Adobe Photoshop CC 2015 (Windows) 2020:06:10 18:49:39 8 " *( 2 H H Adobe_CM Adobe d
Z "
?
3 !1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw 5 !1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ? 纷៕OV-?"~e@wPzSues{u]G̤X=OTLTi3 ;LR ;<}ʫ&hy%6 nuT:g3rGg:`.l;ྦྷlZɵ6gڪQY wWXzTnceLwT[톐Kò겷m7/v~'UӴh_XZac˫Y" sL~J5N,W[Ae3^nK[f~5_n,itƚ~+SeXaO%w.ISbk2ꇃm94}4{F\m1vBaqa\[un=]oQ+SduSc:[KRW_9l^}ZuQưpsN,yoI>}F17m7=lo_++kK`\ƹSJ~`ղں-$v6kŬ{^Zw9,m[N]vqko3d m?hBկ/J2]J>}fvuLtXu*⊛jPpe48˿HuW:xNfK챬8l{'}/^߫}`閸+qh{Su{rKZ
MB'[`crK2kw5 ?Ɗ@Akuࢶ43JYu H)0R/MuGF;GmJ֑JX`^~*SR-