mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-09 00:34:16 +02:00
Merge branch 'staging' into svg
# Conflicts: # CHANGELOG.md
This commit is contained in:
@@ -8,11 +8,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
### Improvements
|
### Improvements
|
||||||
- All icons are now SVG files
|
- All icons are now SVG files
|
||||||
- HDPI support ( by [octopusSD](https://github.com/octopusSD) )
|
- HDPI support ( by [octopusSD](https://github.com/octopusSD) )
|
||||||
|
- Web:
|
||||||
|
- not using HTTP sessions anymore to perform the searches. It seems to avoid URLs not being found after an internet drop event.
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
- missing categories i18n [48](https://github.com/vinifmor/bauh/issues/48)
|
||||||
- not verifying if an icon path is a file
|
- not verifying if an icon path is a file
|
||||||
- Web:
|
- Web:
|
||||||
- not handling HTTP connection issues
|
- not handling HTTP connection issues
|
||||||
|
- not passing the Home path as a String ( does not work in Python 3.5 )
|
||||||
|
|
||||||
## [0.8.0] 2019-12-24
|
## [0.8.0] 2019-12-24
|
||||||
### Features
|
### Features
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
HOME_PATH = Path.home()
|
CACHE_PATH = '{}/.cache/bauh'.format(Path.home())
|
||||||
CACHE_PATH = '{}/.cache/bauh'.format(HOME_PATH)
|
CONFIG_PATH = '{}/.config/bauh'.format(Path.home())
|
||||||
CONFIG_PATH = '{}/.config/bauh'.format(HOME_PATH)
|
DESKTOP_ENTRIES_DIR = '{}/.local/share/applications'.format(Path.home())
|
||||||
DESKTOP_ENTRIES_DIR = '{}/.local/share/applications'.format(HOME_PATH)
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class HttpClient:
|
|||||||
self.sleep = sleep
|
self.sleep = sleep
|
||||||
self.logger = logger
|
self.logger = logger
|
||||||
|
|
||||||
def get(self, url: str, params: dict = None, headers: dict = None, allow_redirects: bool = True, ignore_ssl: bool = False, single_call: bool = False) -> requests.Request:
|
def get(self, url: str, params: dict = None, headers: dict = None, allow_redirects: bool = True, ignore_ssl: bool = False, single_call: bool = False, session: bool = True) -> requests.Response:
|
||||||
cur_attempts = 1
|
cur_attempts = 1
|
||||||
|
|
||||||
while cur_attempts <= self.max_attempts:
|
while cur_attempts <= self.max_attempts:
|
||||||
@@ -35,7 +35,10 @@ class HttpClient:
|
|||||||
if ignore_ssl:
|
if ignore_ssl:
|
||||||
args['verify'] = False
|
args['verify'] = False
|
||||||
|
|
||||||
res = self.session.get(url, **args)
|
if session:
|
||||||
|
res = self.session.get(url, **args)
|
||||||
|
else:
|
||||||
|
res = requests.get(url, **args)
|
||||||
|
|
||||||
if res.status_code == 200:
|
if res.status_code == 200:
|
||||||
return res
|
return res
|
||||||
@@ -56,20 +59,20 @@ class HttpClient:
|
|||||||
|
|
||||||
self.logger.warning("Could not retrieve data from '{}'".format(url))
|
self.logger.warning("Could not retrieve data from '{}'".format(url))
|
||||||
|
|
||||||
def get_json(self, url: str, params: dict = None, headers: dict = None, allow_redirects: bool = True):
|
def get_json(self, url: str, params: dict = None, headers: dict = None, allow_redirects: bool = True, session: bool = True):
|
||||||
res = self.get(url, params=params, headers=headers, allow_redirects=allow_redirects)
|
res = self.get(url, params=params, headers=headers, allow_redirects=allow_redirects, session=session)
|
||||||
return res.json() if res else None
|
return res.json() if res else None
|
||||||
|
|
||||||
def get_yaml(self, url: str, params: dict = None, headers: dict = None, allow_redirects: bool = True):
|
def get_yaml(self, url: str, params: dict = None, headers: dict = None, allow_redirects: bool = True, session: bool = True):
|
||||||
res = self.get(url, params=params, headers=headers, allow_redirects=allow_redirects)
|
res = self.get(url, params=params, headers=headers, allow_redirects=allow_redirects, session=session)
|
||||||
return yaml.safe_load(res.text) if res else None
|
return yaml.safe_load(res.text) if res else None
|
||||||
|
|
||||||
def get_content_length(self, url: str) -> str:
|
def get_content_length(self, url: str, session: bool = True) -> str:
|
||||||
"""
|
params = {'url': url, 'allow_redirects': True, 'stream': True}
|
||||||
:param url:
|
if session:
|
||||||
:return:
|
res = self.session.get(**params)
|
||||||
"""
|
else:
|
||||||
res = self.session.get(url, allow_redirects=True, stream=True)
|
res = requests.get(**params)
|
||||||
|
|
||||||
if res.status_code == 200:
|
if res.status_code == 200:
|
||||||
size = res.headers.get('Content-Length')
|
size = res.headers.get('Content-Length')
|
||||||
@@ -77,6 +80,11 @@ class HttpClient:
|
|||||||
if size is not None:
|
if size is not None:
|
||||||
return system.get_human_size_str(size)
|
return system.get_human_size_str(size)
|
||||||
|
|
||||||
def exists(self, url: str) -> bool:
|
def exists(self, url: str, session: bool = True) -> bool:
|
||||||
res = self.session.head(url=url, allow_redirects=True, verify=False, timeout=5)
|
params = {'url': url, 'allow_redirects': True, 'verify': False, 'timeout': 5}
|
||||||
|
if session:
|
||||||
|
res = self.session.head(**params)
|
||||||
|
else:
|
||||||
|
res = self.session.get(**params)
|
||||||
|
|
||||||
return res.status_code in (200, 403)
|
return res.status_code in (200, 403)
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
|
from pathlib import Path
|
||||||
from bauh.api.constants import HOME_PATH
|
|
||||||
|
|
||||||
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
LOCAL_PATH = '{}/.local/share/bauh/appimage'.format(HOME_PATH)
|
LOCAL_PATH = '{}/.local/share/bauh/appimage'.format(Path.home())
|
||||||
INSTALLATION_PATH = LOCAL_PATH + '/installed/'
|
INSTALLATION_PATH = LOCAL_PATH + '/installed/'
|
||||||
SUGGESTIONS_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/suggestions.txt'
|
SUGGESTIONS_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/suggestions.txt'
|
||||||
@@ -20,15 +20,14 @@ from bauh.api.abstract.handler import ProcessWatcher
|
|||||||
from bauh.api.abstract.model import SoftwarePackage, PackageHistory, PackageUpdate, PackageSuggestion, \
|
from bauh.api.abstract.model import SoftwarePackage, PackageHistory, PackageUpdate, PackageSuggestion, \
|
||||||
SuggestionPriority
|
SuggestionPriority
|
||||||
from bauh.api.abstract.view import MessageType
|
from bauh.api.abstract.view import MessageType
|
||||||
from bauh.api.constants import HOME_PATH
|
|
||||||
from bauh.commons.html import bold
|
from bauh.commons.html import bold
|
||||||
from bauh.commons.system import SystemProcess, new_subprocess, ProcessHandler, run_cmd, SimpleProcess
|
from bauh.commons.system import SystemProcess, new_subprocess, ProcessHandler, run_cmd, SimpleProcess
|
||||||
from bauh.gems.appimage import query, INSTALLATION_PATH, LOCAL_PATH, SUGGESTIONS_FILE
|
from bauh.gems.appimage import query, INSTALLATION_PATH, LOCAL_PATH, SUGGESTIONS_FILE
|
||||||
from bauh.gems.appimage.config import read_config
|
from bauh.gems.appimage.config import read_config
|
||||||
from bauh.gems.appimage.model import AppImage
|
from bauh.gems.appimage.model import AppImage
|
||||||
from bauh.gems.appimage.query import FIND_APPS_BY_NAME, FIND_APPS_BY_NAME_ONLY_NAME
|
|
||||||
from bauh.gems.appimage.worker import DatabaseUpdater
|
from bauh.gems.appimage.worker import DatabaseUpdater
|
||||||
|
|
||||||
|
HOME_PATH = str(Path.home())
|
||||||
DB_APPS_PATH = '{}/{}'.format(HOME_PATH, '.local/share/bauh/appimage/apps.db')
|
DB_APPS_PATH = '{}/{}'.format(HOME_PATH, '.local/share/bauh/appimage/apps.db')
|
||||||
DB_RELEASES_PATH = '{}/{}'.format(HOME_PATH, '.local/share/bauh/appimage/releases.db')
|
DB_RELEASES_PATH = '{}/{}'.format(HOME_PATH, '.local/share/bauh/appimage/releases.db')
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from bauh.api.constants import CACHE_PATH, HOME_PATH, CONFIG_PATH
|
from bauh.api.constants import CACHE_PATH, CONFIG_PATH
|
||||||
|
|
||||||
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
BUILD_DIR = '/tmp/bauh/aur'
|
BUILD_DIR = '/tmp/bauh/aur'
|
||||||
@@ -8,7 +9,7 @@ ARCH_CACHE_PATH = CACHE_PATH + '/arch'
|
|||||||
CATEGORIES_CACHE_DIR = ARCH_CACHE_PATH + '/categories'
|
CATEGORIES_CACHE_DIR = ARCH_CACHE_PATH + '/categories'
|
||||||
CATEGORIES_FILE_PATH = CATEGORIES_CACHE_DIR + '/aur.txt'
|
CATEGORIES_FILE_PATH = CATEGORIES_CACHE_DIR + '/aur.txt'
|
||||||
URL_CATEGORIES_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/aur/categories.txt'
|
URL_CATEGORIES_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/aur/categories.txt'
|
||||||
CONFIG_DIR = '{}/.config/bauh/arch'.format(HOME_PATH)
|
CONFIG_DIR = '{}/.config/bauh/arch'.format(Path.home())
|
||||||
CUSTOM_MAKEPKG_FILE = '{}/makepkg.conf'.format(CONFIG_DIR)
|
CUSTOM_MAKEPKG_FILE = '{}/makepkg.conf'.format(CONFIG_DIR)
|
||||||
AUR_INDEX_FILE = '{}/aur.txt'.format(BUILD_DIR)
|
AUR_INDEX_FILE = '{}/aur.txt'.format(BUILD_DIR)
|
||||||
CONFIG_FILE = '{}/arch.yml'.format(CONFIG_PATH)
|
CONFIG_FILE = '{}/arch.yml'.format(CONFIG_PATH)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from bauh.api.constants import HOME_PATH, DESKTOP_ENTRIES_DIR, CONFIG_PATH
|
from bauh.api.constants import DESKTOP_ENTRIES_DIR, CONFIG_PATH
|
||||||
|
|
||||||
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
WEB_PATH = '{}/.local/share/bauh/web'.format(Path.home())
|
WEB_PATH = '{}/.local/share/bauh/web'.format(Path.home())
|
||||||
@@ -13,7 +13,7 @@ NODE_BIN_PATH = '{}/bin/node'.format(NODE_DIR_PATH)
|
|||||||
NPM_BIN_PATH = '{}/bin/npm'.format(NODE_DIR_PATH)
|
NPM_BIN_PATH = '{}/bin/npm'.format(NODE_DIR_PATH)
|
||||||
NODE_MODULES_PATH = '{}/node_modules'.format(ENV_PATH)
|
NODE_MODULES_PATH = '{}/node_modules'.format(ENV_PATH)
|
||||||
NATIVEFIER_BIN_PATH = '{}/.bin/nativefier'.format(NODE_MODULES_PATH)
|
NATIVEFIER_BIN_PATH = '{}/.bin/nativefier'.format(NODE_MODULES_PATH)
|
||||||
ELECTRON_PATH = '{}/.cache/electron'.format(HOME_PATH)
|
ELECTRON_PATH = '{}/.cache/electron'.format(Path.home())
|
||||||
ELECTRON_DOWNLOAD_URL = 'https://github.com/electron/electron/releases/download/v{version}/electron-v{version}-linux-{arch}.zip'
|
ELECTRON_DOWNLOAD_URL = 'https://github.com/electron/electron/releases/download/v{version}/electron-v{version}-linux-{arch}.zip'
|
||||||
ELECTRON_SHA256_URL = 'https://github.com/electron/electron/releases/download/v{version}/SHASUMS256.txt'
|
ELECTRON_SHA256_URL = 'https://github.com/electron/electron/releases/download/v{version}/SHASUMS256.txt'
|
||||||
URL_ENVIRONMENT_SETTINGS = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/web/environment.yml'
|
URL_ENVIRONMENT_SETTINGS = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/web/environment.yml'
|
||||||
|
|||||||
@@ -137,10 +137,10 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
return description
|
return description
|
||||||
|
|
||||||
def _get_fix_for(self, url_no_protocol: str) -> str:
|
def _get_fix_for(self, url_no_protocol: str) -> str:
|
||||||
try:
|
fix_url = URL_FIX_PATTERN.format(url=url_no_protocol)
|
||||||
fix_url = URL_FIX_PATTERN.format(url=url_no_protocol)
|
|
||||||
res = self.http_client.get(fix_url)
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = self.http_client.get(fix_url, session=False)
|
||||||
if res:
|
if res:
|
||||||
return res.text
|
return res.text
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -156,7 +156,7 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
headers = {'Accept-language': self._get_lang_header(), 'User-Agent': UA_CHROME}
|
headers = {'Accept-language': self._get_lang_header(), 'User-Agent': UA_CHROME}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
url_res = self.http_client.get(url, headers=headers, ignore_ssl=True, single_call=True)
|
url_res = self.http_client.get(url, headers=headers, ignore_ssl=True, single_call=True, session=False)
|
||||||
|
|
||||||
if url_res:
|
if url_res:
|
||||||
return BeautifulSoup(url_res.text, 'lxml', parse_only=SoupStrainer('head'))
|
return BeautifulSoup(url_res.text, 'lxml', parse_only=SoupStrainer('head'))
|
||||||
@@ -529,11 +529,11 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
|
|
||||||
def _download_suggestion_icon(self, pkg: WebApplication, app_dir: str) -> Tuple[str, bytes]:
|
def _download_suggestion_icon(self, pkg: WebApplication, app_dir: str) -> Tuple[str, bytes]:
|
||||||
try:
|
try:
|
||||||
if self.http_client.exists(pkg.icon_url):
|
if self.http_client.exists(pkg.icon_url, session=False):
|
||||||
icon_path = '{}/{}'.format(app_dir, pkg.icon_url.split('/')[-1])
|
icon_path = '{}/{}'.format(app_dir, pkg.icon_url.split('/')[-1])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
res = self.http_client.get(pkg.icon_url)
|
res = self.http_client.get(pkg.icon_url, session=False)
|
||||||
if not res:
|
if not res:
|
||||||
self.logger.info('Could not download the icon {}'.format(pkg.icon_url))
|
self.logger.info('Could not download the icon {}'.format(pkg.icon_url))
|
||||||
else:
|
else:
|
||||||
@@ -756,7 +756,7 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
if not app.description:
|
if not app.description:
|
||||||
app.description = self._get_app_description(app.url, soup)
|
app.description = self._get_app_description(app.url, soup)
|
||||||
|
|
||||||
find_url = not app.icon_url or (app.icon_url and not self.http_client.exists(app.icon_url))
|
find_url = not app.icon_url or (app.icon_url and not self.http_client.exists(app.icon_url, session=False))
|
||||||
|
|
||||||
if find_url:
|
if find_url:
|
||||||
app.icon_url = self._get_app_icon_url(app.url, soup)
|
app.icon_url = self._get_app_icon_url(app.url, soup)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class SuggestionsDownloader:
|
|||||||
def download(self) -> dict:
|
def download(self) -> dict:
|
||||||
self.logger.info("Reading suggestions from {}".format(URL_SUGGESTIONS))
|
self.logger.info("Reading suggestions from {}".format(URL_SUGGESTIONS))
|
||||||
try:
|
try:
|
||||||
suggestions = self.http_client.get_yaml(URL_SUGGESTIONS)
|
suggestions = self.http_client.get_yaml(URL_SUGGESTIONS, session=False)
|
||||||
|
|
||||||
if suggestions:
|
if suggestions:
|
||||||
self.logger.info("{} suggestions successfully read".format(len(suggestions)))
|
self.logger.info("{} suggestions successfully read".format(len(suggestions)))
|
||||||
|
|||||||
@@ -171,4 +171,5 @@ files=Dateien
|
|||||||
all_files=Alle Dateien
|
all_files=Alle Dateien
|
||||||
file_chooser.title=Dateiauswahl
|
file_chooser.title=Dateiauswahl
|
||||||
message.file.not_exist=Datei existiert nicht
|
message.file.not_exist=Datei existiert nicht
|
||||||
message.file.not_exist.body=Die Datei {} scheint nicht zu existieren
|
message.file.not_exist.body=Die Datei {} scheint nicht zu existieren
|
||||||
|
development=Entwicklung
|
||||||
@@ -175,4 +175,5 @@ files=files
|
|||||||
all_files=all files
|
all_files=all files
|
||||||
file_chooser.title=File selector
|
file_chooser.title=File selector
|
||||||
message.file.not_exist=File does not exist
|
message.file.not_exist=File does not exist
|
||||||
message.file.not_exist.body=The file {} seems not to exist
|
message.file.not_exist.body=The file {} seems not to exist
|
||||||
|
development=development
|
||||||
@@ -172,4 +172,5 @@ files=files
|
|||||||
all_files=tutti i files
|
all_files=tutti i files
|
||||||
file_chooser.title=Selettore file
|
file_chooser.title=Selettore file
|
||||||
message.file.not_exist=File non esiste
|
message.file.not_exist=File non esiste
|
||||||
message.file.not_exist.body=Il file {} sembra non esistere
|
message.file.not_exist.body=Il file {} sembra non esistere
|
||||||
|
development=sviluppo
|
||||||
@@ -19,7 +19,10 @@ class I18n(dict):
|
|||||||
return self.current.__getitem__(item)
|
return self.current.__getitem__(item)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
if self.default:
|
if self.default:
|
||||||
return self.default.__getitem__(item)
|
try:
|
||||||
|
return self.default.__getitem__(item)
|
||||||
|
except KeyError:
|
||||||
|
return item
|
||||||
else:
|
else:
|
||||||
return item
|
return item
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user