[wgem] filling preset app options

This commit is contained in:
Vinícius Moreira
2019-12-16 18:09:28 -03:00
parent 2cdd5b59f5
commit a602a583e3
10 changed files with 83 additions and 23 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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()

View File

@@ -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.')

View File

@@ -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))

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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