From 39602bc6c10397e1d36e6c50af21009822eb1b31 Mon Sep 17 00:00:00 2001 From: "Jakob L. Kreuze" Date: Wed, 19 Jun 2024 15:30:11 -0400 Subject: Initial authentication support --- addon.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++--- resources/settings.xml | 40 +++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 resources/settings.xml diff --git a/addon.py b/addon.py index 6dd59a8..1d89740 100644 --- a/addon.py +++ b/addon.py @@ -69,6 +69,7 @@ def get_series(official=True, sort_by="date", offset=1): "order": sort_by, "page": offset, }, + cookies=get_session() ).text soup = BeautifulSoup(html, "html.parser") visual_links = [ @@ -95,6 +96,7 @@ def get_collections(official=True, sort_by="date", offset=1): "order": sort_by, "page": offset, }, + cookies=get_session() ).text soup = BeautifulSoup(html, "html.parser") visual_links = [ @@ -112,7 +114,7 @@ def get_series_videos(url): :return: list of video list entries :rtype: list """ - html = requests.get(url).text + html = requests.get(url, cookies=get_session()).text soup = BeautifulSoup(html, "html.parser") visual_links = [ json.loads(li["data-visual-link"]) @@ -141,6 +143,7 @@ def fetch_visual_links(visual_links): "include_all_suitabilities": "0", "isAjaxRequest": "1", }, + cookies=get_session() ) result = r.json() @@ -258,7 +261,7 @@ def get_video_url(url): :return: stream URL :rtype: str """ - html = requests.get(url).text + html = requests.get(url, cookies=get_session()).text soup = BeautifulSoup(html, "html.parser") video_id = soup.find("meta", property="og:url")["content"].strip( "https://www.newgrounds.com/portal/view/" @@ -266,6 +269,7 @@ def get_video_url(url): response = requests.get( "https://www.newgrounds.com/portal/video/{}".format(video_id), headers={"X-Requested-With": "XMLHttpRequest"}, + cookies=get_session() ).json() preferences = ["1080p", "720p", "360p"] for preference in preferences: @@ -287,9 +291,10 @@ def get_addon_video_info(url): :return: dictionary of video metadata :rtype: dict """ - html = requests.get(url).text + html = requests.get(url, cookies=get_session()).text soup = BeautifulSoup(html, "html.parser") + xbmc.log("Getting {}...".format(url), 2) title = soup.find("div", id="embed_header").h2.string thumbnail = soup.find("meta", property="og:image") if thumbnail is not None: @@ -396,6 +401,7 @@ def get_frontpage_video_urls( headers={ "X-Requested-With": "XMLHttpRequest", }, + cookies=get_session() ).json() soup = BeautifulSoup(response["content"], "html.parser") @@ -436,6 +442,7 @@ def search(term, sort_by="relevance", offset=1): headers={ "X-Requested-With": "XMLHttpRequest", }, + cookies=get_session(), ).json() soup = BeautifulSoup(response["content"], "html.parser") @@ -609,5 +616,61 @@ def router(paramstring): raise ValueError(f"Invalid paramstring: {paramstring}!") +SESSION_COOKIE_NAME = "vmkIdu5l8m" + + +def test_logged_in(session): + return ( + requests.get( + "https://www.newgrounds.com/account", cookies={SESSION_COOKIE_NAME: session} + ).status_code + != 401 + ) + + +def get_session(): + addon = Addon() + + session = addon.getSetting("newgrounds.session") + if session is not None: # and test_logged_in(session): + return {SESSION_COOKIE_NAME: session} + + username = addon.getSetting("newgrounds.username") + password = addon.getSetting("newgrounds.password") + + if username == "" or password == "": + return {} + + session = open_new_session(username, password) + addon.setSetting("newgrounds.session", session) + + return {SESSION_COOKIE_NAME: session} + + +def open_new_session(username, password): + html = requests.get("https://www.newgrounds.com/login").text + soup = BeautifulSoup(html, "html.parser") + + form = soup.find("form", method="post") + endpoint = form["action"] + auth = form.find("input")["value"] + + r = requests.post( + "https://www.newgrounds.com" + endpoint, + data={ + "auth": auth, + "username": username, + "password": password, + "code": "", + "codehint": "------", + }, + cookies={ + "passport-auth": auth, + }, + ) + session = r.cookies[SESSION_COOKIE_NAME] + return session + + if __name__ == "__main__": router(sys.argv[2][1:]) diff --git a/resources/settings.xml b/resources/settings.xml new file mode 100644 index 0000000..a4d2427 --- /dev/null +++ b/resources/settings.xml @@ -0,0 +1,40 @@ + + +
+ + + + 0 + + + true + + + 30201 + + + + 0 + + + true + + + 302023 + + + + 0 + + + true + + + 30203 + true + + + + +
+
-- cgit v1.3