diff --git a/config.ini b/config.ini index 9945e81..77e826b 100644 --- a/config.ini +++ b/config.ini @@ -1,5 +1,6 @@ [main] -streaming_method = youtube +streaming_method = web +streaming_service = youtube [kerk] name = immanuel kapel diff --git a/main.py b/main.py index 0c26d6a..1b9cfba 100755 --- a/main.py +++ b/main.py @@ -9,33 +9,4 @@ if __name__ == "__main__": args = parser.parse_args() streamer = Streamer(args.config) - streamer.stream() - exit(0) - - omr = Youtube("UCIh6v7QDfo8FBYAifTMrD3A") - - #Update driver - driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) - - #Start kerkomroep - options = Options() - options.add_argument("start-maximized") - options.add_experimental_option("detach", True) - driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) - - #Open livestream url - driver.get(omr.livestream_url()) - - driver.timeouts.implicit_wait = 3 - - # while True: - # try: - # button = driver.find_element(by=By.XPATH, value=omr.get_xpath()) - # if button != None: - # break - # except: - # pass - # time.sleep(1) - - # actionChains = ActionChains(driver) - # actionChains.move_to_element(button).click().perform() \ No newline at end of file + streamer.stream() \ No newline at end of file diff --git a/notlive.html b/notlive.html new file mode 100644 index 0000000..ade6c53 --- /dev/null +++ b/notlive.html @@ -0,0 +1,9 @@ + + + + Immanuelkapel + + +

Waiting to go live

+ + diff --git a/streamer.py b/streamer.py index 0736d74..4570891 100644 --- a/streamer.py +++ b/streamer.py @@ -1,15 +1,11 @@ -import selenium -from streaming.kerkomroep import KerkOmroep +from streaming.kerkomroep import Web_KerkOmroep from configparser import ConfigParser - from selenium import webdriver -from selenium.webdriver import ActionChains from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager -from selenium.webdriver.common.by import By -from streaming.youtube import Youtube +from streaming.youtube import Web_Youtube class Streamer: def __init__(self, config_path="config.ini") -> None: @@ -19,6 +15,7 @@ class Streamer: self.setup_web_driver() def load_config_values(self): + self.streaming_service = self.config.get('main', 'streaming_service').lower() self.streaming_method = self.config.get('main', 'streaming_method').lower() self.kerk_name = self.config.get('kerk', 'name') @@ -26,11 +23,11 @@ class Streamer: self.kdg_id = self.config.get('kerk', 'kerkdienstgemist_id') #Setup streamer based on streaming_method - if self.streaming_method == "kerkdienstgemist": - self.stream_service = KerkOmroep(self.kdg_id) + if self.streaming_service == "kerkdienstgemist": + self.stream_service = Web_KerkOmroep(self.kdg_id) else: #Default to youtube - self.stream_service = Youtube(self.youtube_id) + self.stream_service = Web_Youtube(self.youtube_id) def setup_web_driver(self): self.options = Options() @@ -42,5 +39,11 @@ class Streamer: self.driver.timeouts.implicit_wait = 3 def stream(self): - self.driver.get(self.stream_service.livestream_url()) - self.stream_service.post_load_actions(self.driver) + if self.streaming_method == "video": + self.stream_service.pre_load_actions(self.driver) + else: + #Default to web + self.stream_service.pre_load_actions(self.driver) + self.driver.get(self.stream_service.livestream_url()) + self.stream_service.post_load_actions(self.driver) + diff --git a/streaming/base_stream.py b/streaming/base_stream.py index 0283ce8..47c6326 100644 --- a/streaming/base_stream.py +++ b/streaming/base_stream.py @@ -4,7 +4,7 @@ from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait import time -class StreamService: +class Web_StreamService: def __init__(self) -> None: pass @@ -19,6 +19,9 @@ class StreamService: def click_video_play(self): raise NotImplemented() + + def pre_load_actions(self): + raise NotImplemented() def post_load_actions(self, driver): raise NotImplemented() \ No newline at end of file diff --git a/streaming/kerkomroep.py b/streaming/kerkomroep.py index 463e421..d23a8cc 100644 --- a/streaming/kerkomroep.py +++ b/streaming/kerkomroep.py @@ -7,7 +7,7 @@ ICHTHUSKERK_URL = "https://kerkdienstgemist.nl/stations/2110-Ichthuskerk-Ridderk LIVESTREAM_URL = "events/live" XPATH= "/html/body/div[5]/div/article/div/div/div[1]/div[1]/div/div[2]" -class KerkOmroep(StreamService): +class Web_KerkOmroep(Web_StreamService): def __init__(self, kerk_id=IMMANUELKAPEL_URL) -> None: self.kerk_id = kerk_id #URL that points to the church inside the kerkomroep environment pass @@ -32,6 +32,9 @@ class KerkOmroep(StreamService): pass time.sleep(1) button.click() + + def pre_load_actions(self, driver): + pass def post_load_actions(self, driver): self.click_video_play(driver) diff --git a/streaming/youtube.py b/streaming/youtube.py index 27e2407..5f90c06 100644 --- a/streaming/youtube.py +++ b/streaming/youtube.py @@ -1,21 +1,42 @@ +from fcntl import F_SEAL_SEAL +import requests from streaming.base_stream import * +import os, time ICHTHUSKERK_ID = "UCIh6v7QDfo8FBYAifTMrD3A" IMMANUELKAPEL_ID = "UCud4rRtOf2e146HZWDfj6YA" START_FULL_WINDOW = "?start=68" #Note, this is not full screen, but full window -class Youtube(StreamService): +class Web_Youtube(Web_StreamService): def __init__(self, id=IMMANUELKAPEL_ID) -> None: self.id = id def livestream_url(self): return f"https://www.youtube.com/channel/{self.id}/live{START_FULL_WINDOW}" - def is_live(self): - return True + def channel_url(self): + return f"https://www.youtube.com/channel/{self.id}" - def post_load_actions(self): - return + def is_live(self): + #https://github.com/bogeta11040/if-youtube-channel-live + page = requests.get(f"https://www.youtube.com/channel/{self.id}", cookies={'CONSENT': 'YES+42'}) + data = page.content.decode() + if "hqdefault_live.jpg" in data: + return True + return False + + def wait_until_live(self): + while True: + try: + if self.is_live(): + break + except: + print("Failed to get live status of stream!") + time.sleep(10) + + def pre_load_actions(self, driver): + driver.get(f"file:{os.getcwd()}/notlive.html") + self.wait_until_live() def post_load_actions(self, driver): self.bypass_cookies(driver) @@ -30,5 +51,4 @@ class Youtube(StreamService): except: pass time.sleep(1) - accept_button.click() - #driver.find_element_by_xpath('//button[@aria-label="Agree to the use of cookies and other data for the purposes described"]').click() \ No newline at end of file + accept_button.click() \ No newline at end of file diff --git a/tests/kerkdienstgemist.ini b/tests/kerkdienstgemist.ini index 7765f43..e9276e5 100644 --- a/tests/kerkdienstgemist.ini +++ b/tests/kerkdienstgemist.ini @@ -1,5 +1,6 @@ [main] -streaming_method = kerkdienstgemist +streaming_method = web +streaming_service = kerkdienstgemist [kerk] name = immanuel kapel diff --git a/tests/youtube.ini b/tests/youtube.ini index 9945e81..ec84f70 100644 --- a/tests/youtube.ini +++ b/tests/youtube.ini @@ -1,5 +1,6 @@ [main] -streaming_method = youtube +streaming_method = video +streaming_service = youtube [kerk] name = immanuel kapel