Merge branch 'main' into autoplay

This commit is contained in:
David
2024-05-30 09:05:18 +02:00
committed by GitHub
6 changed files with 34 additions and 17 deletions

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "iSponsorBlockTV" name = "iSponsorBlockTV"
version = "2.0.6" version = "2.0.7"
authors = [ authors = [
{"name" = "dmunozv04"} {"name" = "dmunozv04"}
] ]

View File

@@ -1,10 +1,10 @@
aiohttp==3.9.0 aiohttp==3.9.5
appdirs==1.4.4 appdirs==1.4.4
argparse==1.4.0 argparse==1.4.0
async-cache==1.1.1 async-cache==1.1.1
pyytlounge==1.6.3 pyytlounge==2.0.0
rich==13.6.0 rich==13.7.1
ssdp==1.3.0 ssdp==1.3.0
textual==0.40.0 textual==0.58.0
textual-slider==0.1.1 textual-slider==0.1.1
xmltodict==0.13.0 xmltodict==0.13.0

View File

@@ -5,9 +5,11 @@ import aiohttp
from . import api_helpers, ytlounge from . import api_helpers, ytlounge
async def pair_device(): async def pair_device(web_session):
try: try:
lounge_controller = ytlounge.YtLoungeApi("iSponsorBlockTV") lounge_controller = ytlounge.YtLoungeApi(
"iSponsorBlockTV", web_session=web_session
)
pairing_code = input( pairing_code = input(
"Enter pairing code (found in Settings - Link with TV code): " "Enter pairing code (found in Settings - Link with TV code): "
) )
@@ -33,6 +35,7 @@ async def pair_device():
def main(config, debug: bool) -> None: def main(config, debug: bool) -> None:
print("Welcome to the iSponsorBlockTV cli setup wizard") print("Welcome to the iSponsorBlockTV cli setup wizard")
loop = asyncio.get_event_loop_policy().get_event_loop() loop = asyncio.get_event_loop_policy().get_event_loop()
web_session = aiohttp.ClientSession()
if debug: if debug:
loop.set_debug(True) loop.set_debug(True)
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
@@ -52,7 +55,7 @@ def main(config, debug: bool) -> None:
del config["atvs"] del config["atvs"]
devices = config.devices devices = config.devices
while not input(f"Paired with {len(devices)} Device(s). Add more? (y/n) ") == "n": while not input(f"Paired with {len(devices)} Device(s). Add more? (y/n) ") == "n":
task = loop.create_task(pair_device()) task = loop.create_task(pair_device(web_session))
loop.run_until_complete(task) loop.run_until_complete(task)
device = task.result() device = task.result()
if device: if device:
@@ -112,7 +115,6 @@ def main(config, debug: bool) -> None:
" otherwise the program will fail to start.\nYou can add one by" " otherwise the program will fail to start.\nYou can add one by"
" re-running this setup wizard." " re-running this setup wizard."
) )
web_session = aiohttp.ClientSession()
api_helper = api_helpers.ApiHelper(config, web_session) api_helper = api_helpers.ApiHelper(config, web_session)
while True: while True:
channel_info = {} channel_info = {}
@@ -152,7 +154,6 @@ def main(config, debug: bool) -> None:
channel_info["name"] = results[int(choice)][1] channel_info["name"] = results[int(choice)][1]
channel_whitelist.append(channel_info) channel_whitelist.append(channel_info)
# Close web session asynchronously # Close web session asynchronously
loop.run_until_complete(web_session.close())
config.channel_whitelist = channel_whitelist config.channel_whitelist = channel_whitelist
@@ -167,3 +168,4 @@ def main(config, debug: bool) -> None:
config.auto_play = not input("Do you want to enable autoplay? (y/n) ") == "n" config.auto_play = not input("Do you want to enable autoplay? (y/n) ") == "n"
print("Config finished") print("Config finished")
config.save() config.save()
loop.run_until_complete(web_session.close())

View File

@@ -10,13 +10,14 @@ from . import api_helpers, ytlounge
class DeviceListener: class DeviceListener:
def __init__(self, api_helper, config, device, debug: bool): def __init__(self, api_helper, config, device, debug: bool, web_session):
self.task: Optional[asyncio.Task] = None self.task: Optional[asyncio.Task] = None
self.api_helper = api_helper self.api_helper = api_helper
self.offset = device.offset self.offset = device.offset
self.name = device.name self.name = device.name
self.cancelled = False self.cancelled = False
self.logger = logging.getLogger(f"iSponsorBlockTV-{device.screen_id}") self.logger = logging.getLogger(f"iSponsorBlockTV-{device.screen_id}")
self.web_session = web_session
if debug: if debug:
self.logger.setLevel(logging.DEBUG) self.logger.setLevel(logging.DEBUG)
else: else:
@@ -28,7 +29,7 @@ class DeviceListener:
self.logger.addHandler(sh) self.logger.addHandler(sh)
self.logger.info(f"Starting device") self.logger.info(f"Starting device")
self.lounge_controller = ytlounge.YtLoungeApi( self.lounge_controller = ytlounge.YtLoungeApi(
device.screen_id, config, api_helper, self.logger device.screen_id, config, api_helper, self.logger, self.web_session
) )
# Ensures that we have a valid auth token # Ensures that we have a valid auth token
@@ -155,7 +156,7 @@ def main(config, debug):
web_session = aiohttp.ClientSession(loop=loop, connector=tcp_connector) web_session = aiohttp.ClientSession(loop=loop, connector=tcp_connector)
api_helper = api_helpers.ApiHelper(config, web_session) api_helper = api_helpers.ApiHelper(config, web_session)
for i in config.devices: for i in config.devices:
device = DeviceListener(api_helper, config, i, debug) device = DeviceListener(api_helper, config, i, debug, web_session)
devices.append(device) devices.append(device)
tasks.append(loop.create_task(device.loop())) tasks.append(loop.create_task(device.loop()))
tasks.append(loop.create_task(device.refresh_auth_loop())) tasks.append(loop.create_task(device.refresh_auth_loop()))
@@ -165,3 +166,5 @@ def main(config, debug):
print("Cancelling tasks and exiting...") print("Cancelling tasks and exiting...")
loop.run_until_complete(finish(devices)) loop.run_until_complete(finish(devices))
loop.run_until_complete(web_session.close()) loop.run_until_complete(web_session.close())
loop.run_until_complete(tcp_connector.close())
loop.close()

View File

@@ -234,8 +234,8 @@ class AddDevice(ModalWithClickExit):
def __init__(self, config, **kwargs) -> None: def __init__(self, config, **kwargs) -> None:
super().__init__(**kwargs) super().__init__(**kwargs)
self.config = config self.config = config
web_session = aiohttp.ClientSession() self.web_session = aiohttp.ClientSession()
self.api_helper = api_helpers.ApiHelper(config, web_session) self.api_helper = api_helpers.ApiHelper(config, self.web_session)
self.devices_discovered_dial = [] self.devices_discovered_dial = []
def compose(self) -> ComposeResult: def compose(self) -> ComposeResult:
@@ -336,7 +336,9 @@ class AddDevice(ModalWithClickExit):
@on(Button.Pressed, "#add-device-pin-add-button") @on(Button.Pressed, "#add-device-pin-add-button")
async def handle_add_device_pin(self) -> None: async def handle_add_device_pin(self) -> None:
self.query_one("#add-device-pin-add-button").disabled = True self.query_one("#add-device-pin-add-button").disabled = True
lounge_controller = ytlounge.YtLoungeApi("iSponsorBlockTV") lounge_controller = ytlounge.YtLoungeApi(
"iSponsorBlockTV", web_session=self.web_session
)
pairing_code = self.query_one("#pairing-code-input").value pairing_code = self.query_one("#pairing-code-input").value
pairing_code = int( pairing_code = int(
pairing_code.replace("-", "").replace(" ", "") pairing_code.replace("-", "").replace(" ", "")

View File

@@ -2,6 +2,7 @@ import asyncio
import json import json
import pyytlounge import pyytlounge
from aiohttp import ClientSession
from .constants import youtube_client_blacklist from .constants import youtube_client_blacklist
@@ -9,8 +10,17 @@ create_task = asyncio.create_task
class YtLoungeApi(pyytlounge.YtLoungeApi): class YtLoungeApi(pyytlounge.YtLoungeApi):
def __init__(self, screen_id, config=None, api_helper=None, logger=None): def __init__(
self,
screen_id,
config=None,
api_helper=None,
logger=None,
web_session: ClientSession = None,
):
super().__init__("iSponsorBlockTV", logger=logger) super().__init__("iSponsorBlockTV", logger=logger)
if web_session is not None:
self.session = web_session # And use the one we passed
self.auth.screen_id = screen_id self.auth.screen_id = screen_id
self.auth.lounge_id_token = None self.auth.lounge_id_token = None
self.api_helper = api_helper self.api_helper = api_helper