mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-07 04:44:15 +02:00
[wgem] filling preset app options
This commit is contained in:
@@ -11,6 +11,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- bauh relies on [NodeJS](https://nodejs.org/en/), [Electron](https://electronjs.org/) and [nativefier](https://github.com/jiahaog/nativefier) to install the Web applications, but there is no need to have them installed on your system. Bauh will create its own installation environment with these technologies in **~/.local/share/bauh/web/env**.
|
- bauh relies on [NodeJS](https://nodejs.org/en/), [Electron](https://electronjs.org/) and [nativefier](https://github.com/jiahaog/nativefier) to install the Web applications, but there is no need to have them installed on your system. Bauh will create its own installation environment with these technologies in **~/.local/share/bauh/web/env**.
|
||||||
- requires only **python-beautifulsoup4** and **python-lxml** to be enabled
|
- requires only **python-beautifulsoup4** and **python-lxml** to be enabled
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- AppImage:
|
||||||
|
- cleaning the downloaded database files when **--reset** is passed as parameter
|
||||||
|
|
||||||
|
|
||||||
## [0.7.4] 2019-12-09
|
## [0.7.4] 2019-12-09
|
||||||
### Improvements
|
### Improvements
|
||||||
|
|||||||
@@ -73,6 +73,5 @@ class HttpClient:
|
|||||||
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) -> bool:
|
||||||
res = self.session.get(url=url, allow_redirects=True, ignore_ssl=True)
|
res = self.session.head(url=url, allow_redirects=True, verify=False, timeout=5)
|
||||||
return res.status_code == 200
|
return res.status_code == 200
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from bauh.api.http import HttpClient
|
|||||||
|
|
||||||
def is_available(client: HttpClient, logger: logging.Logger) -> bool:
|
def is_available(client: HttpClient, logger: logging.Logger) -> bool:
|
||||||
try:
|
try:
|
||||||
client.get('https://google.com')
|
client.exists('https://google.com')
|
||||||
return True
|
return True
|
||||||
except requests.exceptions.ConnectionError:
|
except requests.exceptions.ConnectionError:
|
||||||
if logger:
|
if logger:
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import glob
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
@@ -10,6 +11,8 @@ from pathlib import Path
|
|||||||
from threading import Lock
|
from threading import Lock
|
||||||
from typing import Set, Type, List
|
from typing import Set, Type, List
|
||||||
|
|
||||||
|
from colorama import Fore
|
||||||
|
|
||||||
from bauh.api.abstract.context import ApplicationContext
|
from bauh.api.abstract.context import ApplicationContext
|
||||||
from bauh.api.abstract.controller import SoftwareManager, SearchResult
|
from bauh.api.abstract.controller import SoftwareManager, SearchResult
|
||||||
from bauh.api.abstract.disk import DiskCacheLoader
|
from bauh.api.abstract.disk import DiskCacheLoader
|
||||||
@@ -19,7 +22,7 @@ from bauh.api.abstract.view import MessageType
|
|||||||
from bauh.api.constants import HOME_PATH
|
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, suggestions
|
from bauh.gems.appimage import query, INSTALLATION_PATH, suggestions, LOCAL_PATH
|
||||||
from bauh.gems.appimage.model import AppImage
|
from bauh.gems.appimage.model import AppImage
|
||||||
from bauh.gems.appimage.worker import DatabaseUpdater
|
from bauh.gems.appimage.worker import DatabaseUpdater
|
||||||
|
|
||||||
@@ -446,3 +449,13 @@ class AppImageManager(SoftwareManager):
|
|||||||
return [pkg.url_screenshot]
|
return [pkg.url_screenshot]
|
||||||
|
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
def clear_data(self):
|
||||||
|
for f in glob.glob('{}/*.db'.format(LOCAL_PATH)):
|
||||||
|
try:
|
||||||
|
print('[bauh][appimage] Deleting {}'.format(f))
|
||||||
|
os.remove(f)
|
||||||
|
print('{}[bauh][appimage] {} deleted{}'.format(Fore.YELLOW, f, Fore.RESET))
|
||||||
|
except:
|
||||||
|
print('{}[bauh][appimage] An exception has happened when deleting {}{}'.format(Fore.RED, Fore.RESET))
|
||||||
|
traceback.print_exc()
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from threading import Thread
|
|||||||
import requests
|
import requests
|
||||||
|
|
||||||
from bauh.api.http import HttpClient
|
from bauh.api.http import HttpClient
|
||||||
|
from bauh.commons import internet
|
||||||
from bauh.gems.appimage import LOCAL_PATH
|
from bauh.gems.appimage import LOCAL_PATH
|
||||||
|
|
||||||
|
|
||||||
@@ -73,7 +74,8 @@ class DatabaseUpdater(Thread):
|
|||||||
if self.enabled:
|
if self.enabled:
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
self._download_databases()
|
if internet.is_available(self.http_client, self.logger):
|
||||||
|
self._download_databases()
|
||||||
except requests.exceptions.ConnectionError:
|
except requests.exceptions.ConnectionError:
|
||||||
self.logger.warning('The internet connection seems to be off.')
|
self.logger.warning('The internet connection seems to be off.')
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ from bauh.api.abstract.model import SoftwarePackage, PackageAction, PackageSugge
|
|||||||
from bauh.api.abstract.view import MessageType, MultipleSelectComponent, InputOption, SingleSelectComponent, \
|
from bauh.api.abstract.view import MessageType, MultipleSelectComponent, InputOption, SingleSelectComponent, \
|
||||||
SelectViewType, TextInputComponent, FormComponent, FileChooserComponent
|
SelectViewType, TextInputComponent, FormComponent, FileChooserComponent
|
||||||
from bauh.api.constants import DESKTOP_ENTRIES_DIR
|
from bauh.api.constants import DESKTOP_ENTRIES_DIR
|
||||||
from bauh.commons import resource
|
from bauh.commons import resource, internet
|
||||||
from bauh.commons.html import bold
|
from bauh.commons.html import bold
|
||||||
from bauh.commons.system import ProcessHandler, get_dir_size, get_human_size_str
|
from bauh.commons.system import ProcessHandler, get_dir_size, get_human_size_str
|
||||||
from bauh.gems.web import INSTALLED_PATH, nativefier, DESKTOP_ENTRY_PATH_PATTERN, URL_FIX_PATTERN, ENV_PATH, UA_CHROME, \
|
from bauh.gems.web import INSTALLED_PATH, nativefier, DESKTOP_ENTRY_PATH_PATTERN, URL_FIX_PATTERN, ENV_PATH, UA_CHROME, \
|
||||||
@@ -108,6 +108,19 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
if icon_url:
|
if icon_url:
|
||||||
return icon_url
|
return icon_url
|
||||||
|
|
||||||
|
def _get_app_description(self, url: str, soup: "BeautifulSoup") -> str:
|
||||||
|
description = None
|
||||||
|
desc_tag = soup.head.find('meta', attrs={'name': 'description'})
|
||||||
|
|
||||||
|
if desc_tag:
|
||||||
|
description = desc_tag.get('content')
|
||||||
|
|
||||||
|
if not description:
|
||||||
|
desc_tag = soup.find('title')
|
||||||
|
description = desc_tag.text if desc_tag else url
|
||||||
|
|
||||||
|
return description
|
||||||
|
|
||||||
def _get_fix_for(self, url_no_protocol: str) -> str:
|
def _get_fix_for(self, url_no_protocol: str) -> str:
|
||||||
res = self.http_client.get(URL_FIX_PATTERN.format(url=url_no_protocol))
|
res = self.http_client.get(URL_FIX_PATTERN.format(url=url_no_protocol))
|
||||||
|
|
||||||
@@ -120,7 +133,7 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
def serialize_to_disk(self, pkg: SoftwarePackage, icon_bytes: bytes, only_icon: bool):
|
def serialize_to_disk(self, pkg: SoftwarePackage, icon_bytes: bytes, only_icon: bool):
|
||||||
super(WebApplicationManager, self).serialize_to_disk(pkg=pkg, icon_bytes=None, only_icon=False)
|
super(WebApplicationManager, self).serialize_to_disk(pkg=pkg, icon_bytes=None, only_icon=False)
|
||||||
|
|
||||||
def _map_url(self, url: str) -> BeautifulSoup:
|
def _map_url(self, url: str) -> "BeautifulSoup":
|
||||||
url_res = self.http_client.get(url,
|
url_res = self.http_client.get(url,
|
||||||
headers={'Accept-language': self._get_lang_header(), 'User-Agent': UA_CHROME},
|
headers={'Accept-language': self._get_lang_header(), 'User-Agent': UA_CHROME},
|
||||||
ignore_ssl=True, single_call=True)
|
ignore_ssl=True, single_call=True)
|
||||||
@@ -147,10 +160,7 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
|
|
||||||
if soup:
|
if soup:
|
||||||
name = self._get_app_name(url_no_protocol, soup)
|
name = self._get_app_name(url_no_protocol, soup)
|
||||||
|
desc = self._get_app_description(url, soup)
|
||||||
desc_tag = soup.head.find('meta', attrs={'name': 'description'})
|
|
||||||
desc = desc_tag.get('content') if desc_tag else words
|
|
||||||
|
|
||||||
icon_url = self._get_app_icon_url(url, soup)
|
icon_url = self._get_app_icon_url(url, soup)
|
||||||
|
|
||||||
app = WebApplication(url=url, name=name, description=desc, icon_url=icon_url)
|
app = WebApplication(url=url, name=name, description=desc, icon_url=icon_url)
|
||||||
@@ -259,14 +269,32 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
cat_ops = [InputOption(label=self.i18n['web.install.option.category.none'].capitalize(), value=0)]
|
cat_ops = [InputOption(label=self.i18n['web.install.option.category.none'].capitalize(), value=0)]
|
||||||
cat_ops.extend([InputOption(label=self.i18n[c.lower()].capitalize(), value=c) for c in self.context.default_categories])
|
cat_ops.extend([InputOption(label=self.i18n[c.lower()].capitalize(), value=c) for c in self.context.default_categories])
|
||||||
|
|
||||||
inp_cat = SingleSelectComponent(label=self.i18n['category'], type_=SelectViewType.COMBO, options=cat_ops, default_option=cat_ops[0])
|
def_cat = cat_ops[0]
|
||||||
|
|
||||||
|
if app.categories:
|
||||||
|
for opt in cat_ops:
|
||||||
|
if opt.value == app.categories[0]:
|
||||||
|
def_cat = opt
|
||||||
|
break
|
||||||
|
|
||||||
|
inp_cat = SingleSelectComponent(label=self.i18n['category'], type_=SelectViewType.COMBO, options=cat_ops, default_option=def_cat)
|
||||||
|
|
||||||
tray_op_off = InputOption(id_='tray_off', label=self.i18n['web.install.option.tray.off.label'], value=0, tooltip=self.i18n['web.install.option.tray.off.tip'])
|
tray_op_off = InputOption(id_='tray_off', label=self.i18n['web.install.option.tray.off.label'], value=0, tooltip=self.i18n['web.install.option.tray.off.tip'])
|
||||||
tray_op_default = InputOption(id_='tray_def', label=self.i18n['web.install.option.tray.default.label'], value='--tray', tooltip=self.i18n['web.install.option.tray.default.tip'])
|
tray_op_default = InputOption(id_='tray_def', label=self.i18n['web.install.option.tray.default.label'], value='--tray', tooltip=self.i18n['web.install.option.tray.default.tip'])
|
||||||
tray_op_min = InputOption(id_='tray_min', label=self.i18n['web.install.option.tray.min.label'], value='--tray=start-in-tray', tooltip=self.i18n['web.install.option.tray.min.tip'])
|
tray_op_min = InputOption(id_='tray_min', label=self.i18n['web.install.option.tray.min.label'], value='--tray=start-in-tray', tooltip=self.i18n['web.install.option.tray.min.tip'])
|
||||||
|
|
||||||
|
tray_opts = [tray_op_off, tray_op_default, tray_op_min]
|
||||||
|
def_tray_opt = None
|
||||||
|
|
||||||
|
if app.preset_options:
|
||||||
|
for opt in tray_opts:
|
||||||
|
if opt.id in app.preset_options:
|
||||||
|
def_tray_opt = opt
|
||||||
|
break
|
||||||
|
|
||||||
inp_tray = SingleSelectComponent(type_=SelectViewType.COMBO,
|
inp_tray = SingleSelectComponent(type_=SelectViewType.COMBO,
|
||||||
options=[tray_op_off, tray_op_default, tray_op_min],
|
options=tray_opts,
|
||||||
|
default_option=def_tray_opt,
|
||||||
label=self.i18n['web.install.option.tray.label'])
|
label=self.i18n['web.install.option.tray.label'])
|
||||||
|
|
||||||
icon_chooser = FileChooserComponent(allowed_extensions={'png'}, label=self.i18n['web.install.option.icon.label'])
|
icon_chooser = FileChooserComponent(allowed_extensions={'png'}, label=self.i18n['web.install.option.icon.label'])
|
||||||
@@ -282,7 +310,15 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
op_insecure = InputOption(id_='insecure', label=self.i18n['web.install.option.insecure.label'], value="--insecure", tooltip=self.i18n['web.install.option.insecure.tip'])
|
op_insecure = InputOption(id_='insecure', label=self.i18n['web.install.option.insecure.label'], value="--insecure", tooltip=self.i18n['web.install.option.insecure.tip'])
|
||||||
op_igcert = InputOption(id_='ignore_certs', label=self.i18n['web.install.option.ignore_certificate.label'], value="--ignore-certificate", tooltip=self.i18n['web.install.option.ignore_certificate.tip'])
|
op_igcert = InputOption(id_='ignore_certs', label=self.i18n['web.install.option.ignore_certificate.label'], value="--ignore-certificate", tooltip=self.i18n['web.install.option.ignore_certificate.tip'])
|
||||||
|
|
||||||
check_options = MultipleSelectComponent(options=[op_single, op_allow_urls, op_max, op_fs, op_nframe, op_ncache, op_insecure, op_igcert], default_options={op_single}, label=self.i18n['web.install.options.advanced'].capitalize())
|
adv_opts = [op_single, op_allow_urls, op_max, op_fs, op_nframe, op_ncache, op_insecure, op_igcert]
|
||||||
|
def_adv_opts = {op_single}
|
||||||
|
|
||||||
|
if app.preset_options:
|
||||||
|
for opt in adv_opts:
|
||||||
|
if opt.id in app.preset_options:
|
||||||
|
def_adv_opts.add(opt)
|
||||||
|
|
||||||
|
check_options = MultipleSelectComponent(options=adv_opts, default_options=def_adv_opts, label=self.i18n['web.install.options.advanced'].capitalize())
|
||||||
|
|
||||||
res = watcher.request_confirmation(title=self.i18n['web.install.options_dialog.title'],
|
res = watcher.request_confirmation(title=self.i18n['web.install.options_dialog.title'],
|
||||||
body=None,
|
body=None,
|
||||||
@@ -496,14 +532,7 @@ class WebApplicationManager(SoftwareManager):
|
|||||||
app.name = self._get_app_name(app.url, soup)
|
app.name = self._get_app_name(app.url, soup)
|
||||||
|
|
||||||
if not app.description:
|
if not app.description:
|
||||||
desc_tag = soup.head.find('meta', attrs={'name': 'description'})
|
app.description = self._get_app_description(app.url, soup)
|
||||||
|
|
||||||
if desc_tag:
|
|
||||||
app.description = desc_tag.get('content')
|
|
||||||
|
|
||||||
if not app.description:
|
|
||||||
desc_tag = soup.find('title')
|
|
||||||
app.description = desc_tag.text if desc_tag else app.url
|
|
||||||
|
|
||||||
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))
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class WebApplication(SoftwarePackage):
|
|||||||
self.installation_dir = installation_dir
|
self.installation_dir = installation_dir
|
||||||
self.desktop_entry = desktop_entry
|
self.desktop_entry = desktop_entry
|
||||||
self.set_custom_icon(custom_icon)
|
self.set_custom_icon(custom_icon)
|
||||||
self.preset_categories = preset_options
|
self.preset_options = preset_options
|
||||||
|
|
||||||
def has_history(self):
|
def has_history(self):
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
gem.web.info=It allows to install Web applications on the system through they addresses ( URLs )
|
gem.web.info=It allows to install Web applications on the system through they addresses ( URLs )
|
||||||
|
gem.web.install.warning=This app it is not officially distributed by its domain owner
|
||||||
web.environment.install=Installing {}
|
web.environment.install=Installing {}
|
||||||
web.waiting.env_updater=Updating environment
|
web.waiting.env_updater=Updating environment
|
||||||
web.env.checking=Checking the Web installation environment
|
web.env.checking=Checking the Web installation environment
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
gem.web.info=Permite instalar aplicações Web no seu sistema através dos seus endereços ( URLs )
|
gem.web.info=Permite instalar aplicações Web no seu sistema através dos seus endereços ( URLs )
|
||||||
|
gem.web.install.warning=Esse aplicativo não é oficialmente distribuído pelo proprietário do domínio
|
||||||
web.environment.nativefier=Instalando {}
|
web.environment.nativefier=Instalando {}
|
||||||
web.waiting.env_updater=Atualizando ambiente
|
web.waiting.env_updater=Atualizando ambiente
|
||||||
web.env.checking=Verificando o ambiente de instalação Web
|
web.env.checking=Verificando o ambiente de instalação Web
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ whatsapp:
|
|||||||
priority: 3
|
priority: 3
|
||||||
url: https://web.whatsapp.com
|
url: https://web.whatsapp.com
|
||||||
category: Network
|
category: Network
|
||||||
|
options:
|
||||||
|
- allow_urls
|
||||||
|
- tray_min
|
||||||
|
|
||||||
telegram:
|
telegram:
|
||||||
name: Telegram
|
name: Telegram
|
||||||
@@ -28,6 +31,7 @@ telegram:
|
|||||||
url: https://web.telegram.org
|
url: https://web.telegram.org
|
||||||
category: Network
|
category: Network
|
||||||
options:
|
options:
|
||||||
|
- allow_urls
|
||||||
- tray_min
|
- tray_min
|
||||||
|
|
||||||
slack:
|
slack:
|
||||||
@@ -35,6 +39,8 @@ slack:
|
|||||||
priority: 3
|
priority: 3
|
||||||
url: https://slack.com
|
url: https://slack.com
|
||||||
category: Network
|
category: Network
|
||||||
|
- allow_urls
|
||||||
|
- tray_min
|
||||||
|
|
||||||
|
|
||||||
office:
|
office:
|
||||||
@@ -79,6 +85,7 @@ ms_outlook:
|
|||||||
category: Network
|
category: Network
|
||||||
options:
|
options:
|
||||||
- allow_urls
|
- allow_urls
|
||||||
|
- tray_min
|
||||||
|
|
||||||
ms_drive:
|
ms_drive:
|
||||||
name: Microsoft One Drive
|
name: Microsoft One Drive
|
||||||
@@ -110,6 +117,7 @@ google-keep:
|
|||||||
category: Utility
|
category: Utility
|
||||||
options:
|
options:
|
||||||
- allow_urls
|
- allow_urls
|
||||||
|
- tray_min
|
||||||
|
|
||||||
google-cal:
|
google-cal:
|
||||||
name: Google Calendar
|
name: Google Calendar
|
||||||
@@ -119,6 +127,7 @@ google-cal:
|
|||||||
category: Utility
|
category: Utility
|
||||||
options:
|
options:
|
||||||
- allow_urls
|
- allow_urls
|
||||||
|
- tray_min
|
||||||
|
|
||||||
google-sheets:
|
google-sheets:
|
||||||
name: Google Sheets
|
name: Google Sheets
|
||||||
@@ -154,6 +163,7 @@ google-hangouts:
|
|||||||
category: Network
|
category: Network
|
||||||
options:
|
options:
|
||||||
- allow_urls
|
- allow_urls
|
||||||
|
- tray_min
|
||||||
|
|
||||||
gmail:
|
gmail:
|
||||||
name: GMail
|
name: GMail
|
||||||
@@ -163,6 +173,7 @@ gmail:
|
|||||||
category: Network
|
category: Network
|
||||||
options:
|
options:
|
||||||
- allow_urls
|
- allow_urls
|
||||||
|
- tray_min
|
||||||
|
|
||||||
mega:
|
mega:
|
||||||
name: Mega
|
name: Mega
|
||||||
|
|||||||
Reference in New Issue
Block a user