From 1f5ceca06eeffcabaa1455f9213bf5d3acdab7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Sat, 9 Mar 2019 22:55:57 +0100 Subject: [PATCH] Added WoWInterface support --- CurseBreaker.py | 4 ++-- CurseBreaker/Core.py | 3 +++ CurseBreaker/CurseForge.py | 4 ++-- CurseBreaker/WoWInterface.py | 40 ++++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 CurseBreaker/WoWInterface.py diff --git a/CurseBreaker.py b/CurseBreaker.py index b888c94..388eef2 100644 --- a/CurseBreaker.py +++ b/CurseBreaker.py @@ -11,8 +11,8 @@ class GUI: def __init__(self): parser = argparse.ArgumentParser(description='All options support comma separated lists. ' 'When started without arguments program will update all add-ons.', - epilog='Supported URLs: https://www.curseforge.com/wow/addons/,' - ' ElvUI, ElvUI:Dev') + epilog='Supported URLs: https://www.curseforge.com/wow/addons/, ' + 'https://www.wowinterface.com/downloads/, ElvUI, ElvUI:Dev') parser.add_argument('-a', '--add', help='Install add-ons', metavar='URL') parser.add_argument('-r', '--remove', help='Remove add-ons', metavar='URL') parser.add_argument('-u', '--update', help='Update add-ons', metavar='URL') diff --git a/CurseBreaker/Core.py b/CurseBreaker/Core.py index be2afee..0d7268b 100644 --- a/CurseBreaker/Core.py +++ b/CurseBreaker/Core.py @@ -3,6 +3,7 @@ import shutil from .CurseForge import CurseForgeAddon from .ElvUI import ElvUIAddon +from .WoWInterface import WoWInterfaceAddon class Core: @@ -37,6 +38,8 @@ def parse_url(self, url): if hasattr(parser, 'redirectUrl'): self.config['URLCache'][url] = parser.redirectUrl return parser + if url.startswith('https://www.wowinterface.com/downloads/'): + return WoWInterfaceAddon(url) elif url.lower() == 'elvui': return ElvUIAddon('master') elif url.lower() == 'elvui:dev': diff --git a/CurseBreaker/CurseForge.py b/CurseBreaker/CurseForge.py index 19a1d6d..0f12530 100644 --- a/CurseBreaker/CurseForge.py +++ b/CurseBreaker/CurseForge.py @@ -34,8 +34,8 @@ def get_current_version(self): if not self.currentVersion: for row in table.find_all('tr', attrs={'class': 'project-file-list-item'}): if 'Beta' in str(row.find('td', attrs={'class': 'project-file-release-type'})): - self.currentVersion = row.find('a', attrs={'class': 'overflow-tip twitch-link'}).contents[ - 0].strip() + self.currentVersion = row.find('a', attrs={'class': 'overflow-tip twitch-link'}).contents[0]\ + .strip() break except Exception: raise RuntimeError('Failed to parse CurseForge page. Check if URL is correct.') diff --git a/CurseBreaker/WoWInterface.py b/CurseBreaker/WoWInterface.py new file mode 100644 index 0000000..d190017 --- /dev/null +++ b/CurseBreaker/WoWInterface.py @@ -0,0 +1,40 @@ +import os +import io +import zipfile +import requests +from bs4 import BeautifulSoup + + +class WoWInterfaceAddon: + def __init__(self, url): + try: + self.soup = BeautifulSoup(requests.get(url).content, 'html.parser') + self.name = self.soup.find('meta', attrs={'property': 'og:title'})['content'] + self.downloadUrl = url.replace('/info', '/download') + self.currentVersion = None + self.archive = None + self.directories = [] + except Exception: + raise RuntimeError('Failed to parse WoWInterface page. Check if URL is correct.') + + def get_current_version(self): + try: + self.currentVersion = self.soup.find('div', attrs={'id': 'version'}).contents[0].split(': ')[1].strip() + except Exception: + raise RuntimeError('Failed to parse WoWInterface page. Check if URL is correct.') + + def get_addon(self): + try: + dsoup = BeautifulSoup(requests.get(self.downloadUrl).content, 'html.parser') + self.archive = zipfile.ZipFile(io.BytesIO(requests.get(dsoup.find('div', attrs={'class': 'manuallink'}). + find('a')['href'].strip()).content)) + for file in self.archive.namelist(): + if '/' not in os.path.dirname(file): + self.directories.append(os.path.dirname(file)) + self.directories = list(set(self.directories)) + except Exception: + raise RuntimeError('Failed to download the archive.') + + def install(self, path): + self.get_addon() + self.archive.extractall(path)