mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-08 13:14:17 +02:00
AUR bearhub: fix stale source cache collision (pkgrel=10)
Use tag-specific tarball name bearhub-0.10.7-bearhub.6.tar.gz so makepkg and AUR helpers do not reuse an outdated bearhub-0.10.7.tar.gz from cache. Ignore makepkg artifacts under packaging/aur/.
This commit is contained in:
@@ -1,29 +0,0 @@
|
||||
import os
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
from bauh.api.paths import CONFIG_DIR, TEMP_DIR, CACHE_DIR, BINARIES_DIR, SHARED_FILES_DIR
|
||||
from bauh.commons import resource
|
||||
|
||||
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
APPIMAGE_SHARED_DIR = f'{SHARED_FILES_DIR}/appimage'
|
||||
INSTALLATION_DIR = f'{APPIMAGE_SHARED_DIR}/installed'
|
||||
CONFIG_FILE = f'{CONFIG_DIR}/appimage.yml'
|
||||
APPIMAGE_CONFIG_DIR = f'{CONFIG_DIR}/appimage'
|
||||
UPDATES_IGNORED_FILE = f'{APPIMAGE_CONFIG_DIR}/updates_ignored.txt'
|
||||
SYMLINKS_DIR = BINARIES_DIR
|
||||
URL_COMPRESSED_DATABASES = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/dbs.tar.gz'
|
||||
APPIMAGE_CACHE_DIR = f'{CACHE_DIR}/appimage'
|
||||
DATABASE_APPS_FILE = f'{APPIMAGE_CACHE_DIR}/apps.db'
|
||||
DATABASE_RELEASES_FILE = f'{APPIMAGE_CACHE_DIR}/releases.db'
|
||||
DATABASES_TS_FILE = f'{APPIMAGE_CACHE_DIR}/dbs.ts'
|
||||
DOWNLOAD_DIR = f'{TEMP_DIR}/appimage/download'
|
||||
|
||||
|
||||
def get_icon_path() -> str:
|
||||
return resource.get_path('img/appimage.svg', ROOT_DIR)
|
||||
|
||||
|
||||
def get_default_manual_installation_file_dir() -> Optional[str]:
|
||||
default_path = f'{Path.home()}/Downloads'
|
||||
return default_path if os.path.isdir(default_path) else None
|
||||
@@ -1,18 +0,0 @@
|
||||
from bauh.commons.config import YAMLConfigManager
|
||||
from bauh.gems.appimage import CONFIG_FILE
|
||||
|
||||
|
||||
class AppImageConfigManager(YAMLConfigManager):
|
||||
|
||||
def __init__(self):
|
||||
super(AppImageConfigManager, self).__init__(config_file_path=CONFIG_FILE)
|
||||
|
||||
def get_default_config(self) -> dict:
|
||||
return {
|
||||
'database': {
|
||||
'expiration': 60
|
||||
},
|
||||
'suggestions': {
|
||||
'expiration': 24
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,181 +0,0 @@
|
||||
import re
|
||||
from io import StringIO
|
||||
from re import Pattern
|
||||
from typing import Optional, Iterable, Tuple
|
||||
|
||||
from bauh.api.abstract.model import SoftwarePackage, CustomSoftwareAction
|
||||
from bauh.commons import resource
|
||||
from bauh.gems.appimage import ROOT_DIR, INSTALLATION_DIR
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
class AppImage(SoftwarePackage):
|
||||
|
||||
__actions_local_installation: Optional[Tuple[CustomSoftwareAction, ...]] = None
|
||||
__cached_attrs: Optional[Tuple[str, ...]] = None
|
||||
__re_many_spaces: Optional[Pattern] = None
|
||||
|
||||
@classmethod
|
||||
def actions_local_installation(cls) -> Tuple[CustomSoftwareAction, ...]:
|
||||
if cls.__actions_local_installation is None:
|
||||
cls.__actions_local_installation = (CustomSoftwareAction(i18n_label_key='appimage.custom_action.manual_update',
|
||||
i18n_status_key='appimage.custom_action.manual_update.status',
|
||||
i18n_description_key='appimage.custom_action.manual_update.desc',
|
||||
manager_method='update_file',
|
||||
requires_root=False,
|
||||
icon_path=resource.get_path('img/refresh.svg', ROOT_DIR),
|
||||
requires_confirmation=False),)
|
||||
|
||||
return cls.__actions_local_installation
|
||||
|
||||
@classmethod
|
||||
def cached_attrs(cls) -> Tuple[str, ...]:
|
||||
if cls.__cached_attrs is None:
|
||||
cls.__cached_attrs = ('name', 'description', 'version', 'url_download', 'author', 'license', 'source',
|
||||
'icon_path', 'repository', 'categories', 'imported', 'install_dir',
|
||||
'symlink')
|
||||
|
||||
return cls.__cached_attrs
|
||||
|
||||
@classmethod
|
||||
def re_many_spaces(cls) -> Pattern:
|
||||
if cls.__re_many_spaces is None:
|
||||
cls.__re_many_spaces = re.compile(r'\s+')
|
||||
|
||||
return cls.__re_many_spaces
|
||||
|
||||
def __init__(self, name: str = None, description: str = None, repository: str = None, source: str = None, version: str = None,
|
||||
url_download: str = None, url_icon: str = None, url_screenshot: str = None, license: str = None, author: str = None,
|
||||
categories=None, icon_path: str = None, installed: bool = False,
|
||||
url_download_latest_version: str = None, local_file_path: str = None, imported: bool = False,
|
||||
i18n: I18n = None, install_dir: str = None, updates_ignored: bool = False,
|
||||
symlink: str = None, manual_update: bool = False, github: str = None, **kwargs):
|
||||
super(AppImage, self).__init__(id=name, name=name, version=version, latest_version=version,
|
||||
icon_url=url_icon, license=license, description=description,
|
||||
installed=installed)
|
||||
self.source = source
|
||||
|
||||
github_url = f"https://github.com/{github}" if github and not github.startswith("https://") else None
|
||||
self.repository = repository if repository else (github_url if github_url else repository)
|
||||
self.categories = (categories.split(',') if isinstance(categories, str) else categories) if categories else None
|
||||
self.url_download = url_download
|
||||
self.icon_path = icon_path
|
||||
self.url_screenshot = url_screenshot
|
||||
self.author = author
|
||||
self.url_download_latest_version = url_download_latest_version
|
||||
self.local_file_path = local_file_path
|
||||
self.imported = imported
|
||||
self.i18n = i18n
|
||||
self.install_dir = install_dir
|
||||
self.updates_ignored = updates_ignored
|
||||
self.symlink = symlink
|
||||
self.manual_update = manual_update # True when the user is manually installing/upgrading an AppImage file
|
||||
|
||||
def __repr__(self):
|
||||
return f"{self.__class__.__name__} (name={self.name}, repository={self.repository})"
|
||||
|
||||
def can_be_installed(self):
|
||||
return not self.installed and self.url_download
|
||||
|
||||
def has_history(self):
|
||||
return self.installed and not self.imported
|
||||
|
||||
def has_info(self):
|
||||
return self.installed if self.imported else True
|
||||
|
||||
def can_be_downgraded(self):
|
||||
return self.installed and not self.imported
|
||||
|
||||
def get_type(self):
|
||||
return 'AppImage'
|
||||
|
||||
def get_default_icon_path(self):
|
||||
return self.get_type_icon_path()
|
||||
|
||||
def get_type_icon_path(self):
|
||||
return resource.get_path('img/appimage.svg', ROOT_DIR)
|
||||
|
||||
def is_application(self):
|
||||
return True
|
||||
|
||||
def get_data_to_cache(self) -> dict:
|
||||
data = {}
|
||||
|
||||
for a in self.cached_attrs():
|
||||
val = getattr(self, a)
|
||||
if val:
|
||||
data[a] = val
|
||||
|
||||
return data
|
||||
|
||||
def fill_cached_data(self, data: dict):
|
||||
for a in self.cached_attrs():
|
||||
val = data.get(a)
|
||||
|
||||
if val:
|
||||
setattr(self, a, val)
|
||||
|
||||
def can_be_run(self) -> bool:
|
||||
return self.installed
|
||||
|
||||
def get_publisher(self) -> str:
|
||||
return self.author
|
||||
|
||||
def get_disk_cache_path(self) -> str:
|
||||
if self.install_dir:
|
||||
return self.install_dir
|
||||
elif self.name:
|
||||
return f'{INSTALLATION_DIR}/{self.name.lower()}'
|
||||
|
||||
def get_disk_icon_path(self):
|
||||
return self.icon_path
|
||||
|
||||
def has_screenshots(self):
|
||||
return not self.installed and self.url_screenshot
|
||||
|
||||
def get_name_tooltip(self) -> str:
|
||||
if self.name and self.imported:
|
||||
return '{} ({})'.format(self.name, self.i18n['imported'])
|
||||
|
||||
return self.name
|
||||
|
||||
def get_custom_actions(self) -> Optional[Iterable[CustomSoftwareAction]]:
|
||||
if self.installed and self.imported:
|
||||
return self.actions_local_installation()
|
||||
|
||||
def supports_backup(self) -> bool:
|
||||
return False
|
||||
|
||||
def supports_ignored_updates(self) -> bool:
|
||||
return self.installed and not self.imported
|
||||
|
||||
def is_update_ignored(self) -> bool:
|
||||
return self.updates_ignored
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, AppImage):
|
||||
return self.name == other.name and self.local_file_path == other.local_file_path
|
||||
|
||||
def get_clean_name(self) -> Optional[str]:
|
||||
if self.name:
|
||||
return self.re_many_spaces().sub('-', self.name.lower().strip())
|
||||
|
||||
def to_desktop_entry(self) -> str:
|
||||
de = StringIO()
|
||||
de.write("[Desktop Entry]\nType=Application\nName={}\n".format(self.name))
|
||||
|
||||
if self.description:
|
||||
de.write("Comment={}\n".format(self.description.replace('\n', ' ')))
|
||||
|
||||
if self.install_dir and self.local_file_path:
|
||||
de.write('Exec="{}/{}"\n'.format(self.install_dir, self.local_file_path.split('/')[-1]))
|
||||
|
||||
if self.icon_path:
|
||||
de.write('Icon={}\n'.format(self.icon_path))
|
||||
|
||||
if self.categories:
|
||||
de.write('Categories={};\n'.format(';'.join((c for c in self.categories if c.lower() != 'imported'))))
|
||||
|
||||
de.write('Terminal=false')
|
||||
de.seek(0)
|
||||
return de.read()
|
||||
@@ -1,12 +0,0 @@
|
||||
APP_ATTRS = ('name', 'description', 'repository', 'source', 'version', 'url_download', 'url_icon',
|
||||
'url_screenshot', 'license', 'author', 'categories')
|
||||
RELEASE_ATTRS = ('version', 'url_download', 'published_at')
|
||||
|
||||
|
||||
SEARCH_APPS_BY_NAME_OR_DESCRIPTION = f"SELECT {','.join(APP_ATTRS)} FROM apps" + \
|
||||
" WHERE lower(name) LIKE '%{}%' or lower(description) LIKE '%{}%'"
|
||||
FIND_APP_ID_BY_REPO_AND_NAME = "SELECT id FROM apps WHERE lower(repository) = '{}' and lower(name) = '{}'"
|
||||
FIND_APPS_BY_NAME = "SELECT name, repository, version, url_download FROM apps WHERE lower(name) IN ({})"
|
||||
FIND_APPS_BY_NAME_ONLY_NAME = "SELECT name FROM apps WHERE lower(name) IN ({})"
|
||||
FIND_APPS_BY_NAME_FULL = "SELECT {} FROM apps".format(','.join(APP_ATTRS)) + " WHERE lower(name) IN ({})"
|
||||
FIND_RELEASES_BY_APP_ID = "SELECT {} FROM releases".format(','.join(RELEASE_ATTRS)) + " WHERE app_id = {}"
|
||||
@@ -1,335 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="23.909061"
|
||||
id="svg3832"
|
||||
version="1.1"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"
|
||||
sodipodi:docname="appimage.svg">
|
||||
<defs
|
||||
id="defs3834">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3308-4-6-931-761-0"
|
||||
id="linearGradient2975"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="24.3125"
|
||||
y1="22.96875"
|
||||
x2="24.3125"
|
||||
y2="41.03125" />
|
||||
<linearGradient
|
||||
id="linearGradient3308-4-6-931-761-0">
|
||||
<stop
|
||||
id="stop2919-2"
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop2921-76"
|
||||
style="stop-color:#ffffff;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4222"
|
||||
id="linearGradient2979"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0,0.3704967,-0.3617496,0,33.508315,6.1670925)"
|
||||
x1="7.6485429"
|
||||
y1="26.437023"
|
||||
x2="41.861729"
|
||||
y2="26.437023" />
|
||||
<linearGradient
|
||||
id="linearGradient4222">
|
||||
<stop
|
||||
id="stop4224"
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop4226"
|
||||
style="stop-color:#ffffff;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3308-4-6-931-761"
|
||||
id="linearGradient2982"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(0,0.9999987)"
|
||||
x1="23.99999"
|
||||
y1="4.999989"
|
||||
x2="23.99999"
|
||||
y2="43" />
|
||||
<linearGradient
|
||||
id="linearGradient3308-4-6-931-761">
|
||||
<stop
|
||||
id="stop2919"
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop2921"
|
||||
style="stop-color:#ffffff;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3575"
|
||||
id="radialGradient2985"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0,1.0262008,-1.6561124,9.4072203e-4,-56.097482,-45.332325)"
|
||||
cx="48.42384"
|
||||
cy="-48.027504"
|
||||
fx="48.42384"
|
||||
fy="-48.027504"
|
||||
r="38.212933" />
|
||||
<linearGradient
|
||||
id="linearGradient3575">
|
||||
<stop
|
||||
id="stop3577"
|
||||
style="stop-color:#fafafa;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop3579"
|
||||
style="stop-color:#e6e6e6;stop-opacity:1"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3993"
|
||||
id="radialGradient2990"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0,2.0478765,-2.7410544,-8.6412258e-8,47.161382,-8.837436)"
|
||||
cx="9.3330879"
|
||||
cy="8.4497671"
|
||||
fx="9.3330879"
|
||||
fy="8.4497671"
|
||||
r="19.99999" />
|
||||
<linearGradient
|
||||
id="linearGradient3993">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#a3c0d0;stop-opacity:1"
|
||||
id="stop3995" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#427da1;stop-opacity:1"
|
||||
id="stop4001" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2508"
|
||||
id="linearGradient2992"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(0,0.9674382)"
|
||||
x1="14.048676"
|
||||
y1="44.137306"
|
||||
x2="14.048676"
|
||||
y2="4.0000005" />
|
||||
<linearGradient
|
||||
id="linearGradient2508">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#2e4a5a;stop-opacity:1"
|
||||
id="stop2510" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#6e8796;stop-opacity:1"
|
||||
id="stop2512" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
cx="4.9929786"
|
||||
cy="43.5"
|
||||
r="2.5"
|
||||
fx="4.9929786"
|
||||
fy="43.5"
|
||||
id="radialGradient2873-966-168"
|
||||
xlink:href="#linearGradient3688-166-749"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.003784,0,0,1.4,27.98813,-17.4)" />
|
||||
<linearGradient
|
||||
id="linearGradient3688-166-749">
|
||||
<stop
|
||||
id="stop2883"
|
||||
style="stop-color:#181818;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop2885"
|
||||
style="stop-color:#181818;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
cx="4.9929786"
|
||||
cy="43.5"
|
||||
r="2.5"
|
||||
fx="4.9929786"
|
||||
fy="43.5"
|
||||
id="radialGradient2875-742-326"
|
||||
xlink:href="#linearGradient3688-464-309"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.003784,0,0,1.4,-20.01187,-104.4)" />
|
||||
<linearGradient
|
||||
id="linearGradient3688-464-309">
|
||||
<stop
|
||||
id="stop2889"
|
||||
style="stop-color:#181818;stop-opacity:1"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop2891"
|
||||
style="stop-color:#181818;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="25.058096"
|
||||
y1="47.027729"
|
||||
x2="25.058096"
|
||||
y2="39.999443"
|
||||
id="linearGradient2877-634-617"
|
||||
xlink:href="#linearGradient3702-501-757"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient3702-501-757">
|
||||
<stop
|
||||
id="stop2895"
|
||||
style="stop-color:#181818;stop-opacity:0"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop2897"
|
||||
style="stop-color:#181818;stop-opacity:1"
|
||||
offset="0.5" />
|
||||
<stop
|
||||
id="stop2899"
|
||||
style="stop-color:#181818;stop-opacity:0"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.4375"
|
||||
inkscape:cx="612.29775"
|
||||
inkscape:cy="-202.44753"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="1360"
|
||||
inkscape:window-height="703"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
showborder="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<metadata
|
||||
id="metadata3837">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-2,-22.090907)">
|
||||
<g
|
||||
id="g881"
|
||||
transform="matrix(0.54545433,0,0,0.58268555,0.90909135,19.196452)">
|
||||
<g
|
||||
transform="matrix(1.1,0,0,0.4444449,-2.4000022,25.11107)"
|
||||
id="g2036"
|
||||
style="display:inline">
|
||||
<g
|
||||
transform="matrix(1.052632,0,0,1.285713,-1.263158,-13.42854)"
|
||||
id="g3712"
|
||||
style="opacity:0.4">
|
||||
<rect
|
||||
width="5"
|
||||
height="7"
|
||||
x="38"
|
||||
y="40"
|
||||
id="rect2801"
|
||||
style="fill:url(#radialGradient2873-966-168);fill-opacity:1;stroke:none" />
|
||||
<rect
|
||||
width="5"
|
||||
height="7"
|
||||
x="-10"
|
||||
y="-47"
|
||||
transform="scale(-1)"
|
||||
id="rect3696"
|
||||
style="fill:url(#radialGradient2875-742-326);fill-opacity:1;stroke:none" />
|
||||
<rect
|
||||
width="28"
|
||||
height="7.0000005"
|
||||
x="10"
|
||||
y="40"
|
||||
id="rect3700"
|
||||
style="fill:url(#linearGradient2877-634-617);fill-opacity:1;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
width="39"
|
||||
height="39"
|
||||
rx="2.2322156"
|
||||
ry="2.2322156"
|
||||
x="4.5"
|
||||
y="5.4674392"
|
||||
id="rect5505"
|
||||
style="fill:url(#radialGradient2990);fill-opacity:1;stroke:url(#linearGradient2992);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
d="m 21,6.9687498 a 2.0165107,2.0165107 0 0 0 -2.03125,2.03125 V 12.96875 H 17.8125 a 2.0165107,2.0165107 0 0 0 -1.5,3.375 l 5.0625,5.75 c -0.06312,0.110777 -0.178724,0.246032 -0.21875,0.34375 -0.195898,0.478256 -0.25,0.83653 -0.25,1.21875 v 0.125 L 20.8125,23.6875 C 20.534322,23.409323 20.213169,23.162739 19.71875,22.96875 19.47154,22.87176 19.185456,22.791748 18.75,22.8125 c -0.435456,0.02075 -1.054055,0.210302 -1.46875,0.625 L 15.75,24.96875 c -0.414689,0.414689 -0.604245,1.033294 -0.625,1.46875 -0.02075,0.435456 0.05925,0.721537 0.15625,0.96875 C 15.475241,27.900677 15.721817,28.221821 16,28.5 l 0.09375,0.09375 h -0.125 c -0.382218,0 -0.740493,0.0541 -1.21875,0.25 -0.239128,0.09795 -0.538285,0.214988 -0.84375,0.53125 -0.305465,0.316262 -0.625,0.914788 -0.625,1.53125 v 2.1875 c 0,0.616465 0.319536,1.214989 0.625,1.53125 0.305464,0.316261 0.604622,0.433301 0.84375,0.53125 0.478256,0.195898 0.83653,0.25 1.21875,0.25 h 0.125 L 16,35.5 c -0.278175,0.278176 -0.52476,0.599329 -0.71875,1.09375 -0.09699,0.24721 -0.177003,0.533292 -0.15625,0.96875 0.02075,0.435458 0.210304,1.054058 0.625,1.46875 l 1.53125,1.53125 c 0.414691,0.414697 1.033292,0.604245 1.46875,0.625 0.435458,0.02076 0.721537,-0.05926 0.96875,-0.15625 0.494425,-0.19399 0.81557,-0.440568 1.09375,-0.71875 l 0.09375,-0.09375 v 0.125 c 0,0.38222 0.0541,0.740495 0.25,1.21875 0.09795,0.239127 0.214989,0.538285 0.53125,0.84375 0.316261,0.305465 0.914783,0.625 1.53125,0.625 h 2.1875 c 0.616466,0 1.214989,-0.319534 1.53125,-0.625 0.316261,-0.305466 0.433302,-0.604622 0.53125,-0.84375 0.195896,-0.478255 0.25,-0.836532 0.25,-1.21875 v -0.125 l 0.09375,0.09375 c 0.278176,0.278175 0.599329,0.52476 1.09375,0.71875 0.24721,0.09699 0.533292,0.177003 0.96875,0.15625 0.435458,-0.02075 1.054058,-0.210304 1.46875,-0.625 L 32.875,39.03125 C 33.289697,38.616559 33.479245,37.997958 33.5,37.5625 33.52076,37.127042 33.44074,36.840963 33.34375,36.59375 33.14976,36.099325 32.903182,35.77818 32.625,35.5 l -0.09375,-0.09375 h 0.125 c 0.38222,0 0.740494,-0.0541 1.21875,-0.25 0.239128,-0.09795 0.538286,-0.214988 0.84375,-0.53125 0.305464,-0.316262 0.625,-0.914787 0.625,-1.53125 v -2.1875 c 0,-0.61646 -0.319535,-1.214987 -0.625,-1.53125 -0.305465,-0.316263 -0.604621,-0.433301 -0.84375,-0.53125 -0.478257,-0.195898 -0.836532,-0.25 -1.21875,-0.25 h -0.125 L 32.625,28.5 c 0.278177,-0.278177 0.52476,-0.599329 0.71875,-1.09375 C 33.44074,27.15904 33.520753,26.872957 33.5,26.4375 33.47925,26.002043 33.289697,25.383443 32.875,24.96875 L 31.34375,23.4375 c -0.414688,-0.414694 -1.03329,-0.604245 -1.46875,-0.625 -0.43546,-0.02076 -0.721537,0.05925 -0.96875,0.15625 -0.494426,0.193991 -0.815572,0.44057 -1.09375,0.71875 l -0.09375,0.09375 v -0.125 c 0,-0.382218 -0.0541,-0.740493 -0.25,-1.21875 -0.09112,-0.22245 -0.228127,-0.500183 -0.5,-0.78125 l 4.71875,-5.3125 a 2.0165107,2.0165107 0 0 0 -1.5,-3.375 H 29.03125 V 8.9999998 A 2.0165107,2.0165107 0 0 0 27,6.9687498 Z M 24.3125,31.25 c 0.427097,0 0.75,0.322904 0.75,0.75 0,0.427096 -0.322903,0.75 -0.75,0.75 -0.427094,0 -0.75,-0.322906 -0.75,-0.75 0,-0.427094 0.322906,-0.75 0.75,-0.75 z"
|
||||
id="path4294-1"
|
||||
style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00178742;marker:none;enable-background:accumulate"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 20.90625,8.0312498 a 0.96385067,0.96385067 0 0 0 -0.875,0.96875 V 14.03125 H 17.8125 A 0.96385067,0.96385067 0 0 0 17.09375,15.625 l 5.78125,6.53125 c -0.158814,0.0616 -0.341836,0.0951 -0.4375,0.1875 -0.169161,0.163386 -0.252971,0.323419 -0.3125,0.46875 -0.119058,0.290663 -0.15625,0.566746 -0.15625,0.84375 V 25.3125 C 21.718163,25.40233 21.485871,25.509772 21.25,25.625 l -1.1875,-1.1875 c -0.199651,-0.19965 -0.421433,-0.352095 -0.71875,-0.46875 -0.148659,-0.05833 -0.329673,-0.104846 -0.5625,-0.09375 -0.232827,0.0111 -0.53583,0.09833 -0.75,0.3125 L 16.5,25.71875 c -0.214168,0.214168 -0.301403,0.517173 -0.3125,0.75 -0.0111,0.232827 0.03542,0.41384 0.09375,0.5625 0.116655,0.297321 0.269096,0.519099 0.46875,0.71875 l 1.1875,1.1875 c -0.115228,0.235871 -0.222668,0.468163 -0.3125,0.71875 h -1.65625 c -0.277003,0 -0.553087,0.03719 -0.84375,0.15625 -0.145332,0.05953 -0.305363,0.143338 -0.46875,0.3125 -0.163387,0.169162 -0.3125,0.46403 -0.3125,0.78125 v 2.1875 c 0,0.317221 0.149114,0.612089 0.3125,0.78125 0.163386,0.169161 0.323419,0.252971 0.46875,0.3125 0.290663,0.119058 0.566746,0.15625 0.84375,0.15625 H 17.625 c 0.08983,0.250587 0.197272,0.482879 0.3125,0.71875 L 16.75,36.25 c -0.199649,0.19965 -0.352095,0.421432 -0.46875,0.71875 -0.05833,0.148659 -0.104846,0.329672 -0.09375,0.5625 0.0111,0.232828 0.09833,0.535831 0.3125,0.75 l 1.53125,1.53125 c 0.214168,0.214172 0.517172,0.301403 0.75,0.3125 0.232828,0.0111 0.41384,-0.03542 0.5625,-0.09375 0.29732,-0.116655 0.519098,-0.269096 0.71875,-0.46875 L 21.25,38.375 c 0.235871,0.115228 0.468164,0.222668 0.71875,0.3125 v 1.65625 c 0,0.277003 0.03719,0.553087 0.15625,0.84375 0.05953,0.145331 0.143339,0.305364 0.3125,0.46875 0.169161,0.163386 0.464028,0.3125 0.78125,0.3125 h 2.1875 c 0.317221,0 0.612089,-0.149113 0.78125,-0.3125 0.169161,-0.163387 0.252971,-0.323419 0.3125,-0.46875 0.119057,-0.290663 0.15625,-0.566748 0.15625,-0.84375 V 38.6875 c 0.250586,-0.08983 0.482879,-0.197272 0.71875,-0.3125 l 1.1875,1.1875 c 0.19965,0.199649 0.421432,0.352095 0.71875,0.46875 0.148659,0.05833 0.329672,0.104846 0.5625,0.09375 0.232828,-0.0111 0.535831,-0.09833 0.75,-0.3125 L 32.125,38.28125 c 0.214172,-0.214168 0.301403,-0.517172 0.3125,-0.75 0.0111,-0.232828 -0.03542,-0.41384 -0.09375,-0.5625 C 32.227095,36.67143 32.074654,36.449652 31.875,36.25 L 30.6875,35.0625 C 30.802728,34.82663 30.910168,34.594337 31,34.34375 h 1.65625 c 0.277004,0 0.553087,-0.03719 0.84375,-0.15625 0.145332,-0.05953 0.305364,-0.143339 0.46875,-0.3125 0.163386,-0.169161 0.3125,-0.46403 0.3125,-0.78125 v -2.1875 c 0,-0.317219 -0.149114,-0.612088 -0.3125,-0.78125 C 33.805364,29.955838 33.645332,29.872029 33.5,29.8125 33.209336,29.693442 32.933253,29.65625 32.65625,29.65625 H 31 C 30.91017,29.405663 30.802728,29.17337 30.6875,28.9375 L 31.875,27.75 c 0.19965,-0.19965 0.352095,-0.421432 0.46875,-0.71875 0.05833,-0.148659 0.104846,-0.329672 0.09375,-0.5625 -0.0111,-0.232828 -0.09833,-0.535831 -0.3125,-0.75 L 30.59375,24.1875 c -0.214167,-0.21417 -0.517171,-0.301403 -0.75,-0.3125 -0.232829,-0.0111 -0.41384,0.03542 -0.5625,0.09375 -0.29732,0.116656 -0.519099,0.269097 -0.71875,0.46875 L 27.375,25.625 c -0.235871,-0.115228 -0.468163,-0.222668 -0.71875,-0.3125 v -1.65625 c 0,-0.277003 -0.03719,-0.553087 -0.15625,-0.84375 -0.05953,-0.145332 -0.143338,-0.305363 -0.3125,-0.46875 -0.169162,-0.163387 -0.46403,-0.3125 -0.78125,-0.3125 H 25.25 L 30.90625,15.625 A 0.96385067,0.96385067 0 0 0 30.1875,14.03125 H 27.96875 V 8.9999998 A 0.96385067,0.96385067 0 0 0 27,8.0312498 h -6 a 0.96385067,0.96385067 0 0 0 -0.09375,0 z M 24.3125,30.1875 c 1.002113,0 1.8125,0.810388 1.8125,1.8125 0,1.002112 -0.810387,1.8125 -1.8125,1.8125 C 23.31039,33.8125 22.5,33.002111 22.5,32 c 0,-1.002111 0.81039,-1.8125 1.8125,-1.8125 z"
|
||||
id="path4294"
|
||||
style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00178742;marker:none;enable-background:accumulate"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="M 21,8.9999996 V 15 H 17.8125 L 24,22 30.1875,15 H 27 V 8.9999996 Z M 23.21875,23 c -0.172892,0 -0.28125,0.294922 -0.28125,0.65625 V 25.9375 C 22.24145,26.095996 21.585954,26.379869 21,26.75 l -1.625,-1.625 c -0.255498,-0.255497 -0.533998,-0.372253 -0.65625,-0.25 l -1.53125,1.53125 c -0.122254,0.122254 -0.0055,0.400753 0.25,0.65625 l 1.625,1.625 c -0.37013,0.585953 -0.654003,1.24145 -0.8125,1.9375 h -2.28125 c -0.361328,0 -0.65625,0.108357 -0.65625,0.28125 v 2.1875 c 0,0.172892 0.294922,0.28125 0.65625,0.28125 H 18.25 c 0.158497,0.69605 0.44237,1.351546 0.8125,1.9375 l -1.625,1.625 c -0.255497,0.255498 -0.372254,0.533997 -0.25,0.65625 l 1.53125,1.53125 c 0.122252,0.122254 0.400752,0.0055 0.65625,-0.25 L 21,37.25 c 0.585954,0.37013 1.24145,0.654002 1.9375,0.8125 v 2.28125 C 22.9375,40.705077 23.045858,41 23.21875,41 h 2.1875 c 0.172893,0 0.28125,-0.294924 0.28125,-0.65625 V 38.0625 c 0.69605,-0.158498 1.351546,-0.44237 1.9375,-0.8125 l 1.625,1.625 c 0.255498,0.255497 0.533997,0.372254 0.65625,0.25 l 1.53125,-1.53125 c 0.122254,-0.122252 0.0055,-0.400752 -0.25,-0.65625 l -1.625,-1.625 c 0.370129,-0.585954 0.654003,-1.24145 0.8125,-1.9375 h 2.28125 c 0.361329,0 0.65625,-0.108358 0.65625,-0.28125 v -2.1875 c 0,-0.172893 -0.294921,-0.28125 -0.65625,-0.28125 H 30.375 c -0.158497,-0.69605 -0.442371,-1.351547 -0.8125,-1.9375 l 1.625,-1.625 c 0.255497,-0.255497 0.372254,-0.533997 0.25,-0.65625 L 29.90625,24.875 C 29.783997,24.752745 29.505498,24.8695 29.25,25.125 L 27.625,26.75 C 27.039046,26.379869 26.38355,26.095996 25.6875,25.9375 V 23.65625 C 25.6875,23.294922 25.579143,23 25.40625,23 Z m 1.09375,6.21875 c 1.528616,0 2.78125,1.252635 2.78125,2.78125 0,1.528615 -1.252634,2.78125 -2.78125,2.78125 -1.528614,0 -2.78125,-1.252635 -2.78125,-2.78125 0,-1.528615 1.252636,-2.78125 2.78125,-2.78125 z"
|
||||
id="path2317"
|
||||
style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient2985);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00178742;marker:none;enable-background:accumulate"
|
||||
inkscape:connector-curvature="0" />
|
||||
<rect
|
||||
width="36.999985"
|
||||
height="37.000011"
|
||||
rx="1.365193"
|
||||
ry="1.365193"
|
||||
x="5.4999981"
|
||||
y="6.4999886"
|
||||
id="rect6741"
|
||||
style="opacity:0.4;fill:none;stroke:url(#linearGradient2982);stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
d="M 28.926376,15.466668 24,21.177578 18.963089,15.5 H 21.5 V 9.4999996 h 5 V 15.5 l 2.426376,-0.03333 z"
|
||||
id="path2777"
|
||||
style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient2979);stroke-width:0.99829447;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 23.4375,23.46875 c -0.01166,0.05381 -0.03125,0.100205 -0.03125,0.1875 v 2.28125 a 0.48185467,0.48185467 0 0 1 -0.375,0.46875 c -0.638467,0.145384 -1.238423,0.407111 -1.78125,0.75 a 0.48185467,0.48185467 0 0 1 -0.59375,-0.0625 l -1.625,-1.625 C 18.9779,25.4154 18.9477,25.40242 18.90625,25.375 l -1.21875,1.21875 c 0.02742,0.04145 0.0404,0.07165 0.09375,0.125 l 1.625,1.625 a 0.48185467,0.48185467 0 0 1 0.0625,0.59375 c -0.342888,0.542826 -0.604615,1.142782 -0.75,1.78125 a 0.48185467,0.48185467 0 0 1 -0.46875,0.375 h -2.28125 c -0.08729,0 -0.133695,0.01959 -0.1875,0.03125 v 1.75 c 0.05381,0.01166 0.100205,0.03125 0.1875,0.03125 H 18.25 a 0.48185467,0.48185467 0 0 1 0.46875,0.375 c 0.145385,0.638468 0.407112,1.238423 0.75,1.78125 a 0.48185467,0.48185467 0 0 1 -0.0625,0.59375 l -1.625,1.625 c -0.05335,0.05335 -0.06633,0.08355 -0.09375,0.125 l 1.21875,1.21875 c 0.04145,-0.02742 0.07165,-0.0404 0.125,-0.09375 l 1.625,-1.625 A 0.48185467,0.48185467 0 0 1 21.25,36.84375 c 0.542827,0.342888 1.142781,0.604614 1.78125,0.75 a 0.48185467,0.48185467 0 0 1 0.375,0.46875 v 2.28125 c 0,0.08729 0.01959,0.133695 0.03125,0.1875 h 1.75 c 0.01166,-0.0538 0.03125,-0.100206 0.03125,-0.1875 V 38.0625 a 0.48185467,0.48185467 0 0 1 0.375,-0.46875 c 0.638469,-0.145386 1.238423,-0.407112 1.78125,-0.75 a 0.48185467,0.48185467 0 0 1 0.59375,0.0625 l 1.625,1.625 c 0.05335,0.05335 0.08355,0.06633 0.125,0.09375 l 1.21875,-1.21875 c -0.02742,-0.04145 -0.0404,-0.07165 -0.09375,-0.125 l -1.625,-1.625 a 0.48185467,0.48185467 0 0 1 -0.0625,-0.59375 c 0.342888,-0.542828 0.604615,-1.142783 0.75,-1.78125 a 0.48185467,0.48185467 0 0 1 0.46875,-0.375 h 2.28125 c 0.08729,0 0.133695,-0.01959 0.1875,-0.03125 v -1.75 c -0.0538,-0.01166 -0.100204,-0.03125 -0.1875,-0.03125 H 30.375 a 0.48185467,0.48185467 0 0 1 -0.46875,-0.375 c -0.145385,-0.638467 -0.407113,-1.238424 -0.75,-1.78125 a 0.48185467,0.48185467 0 0 1 0.0625,-0.59375 l 1.625,-1.625 c 0.05335,-0.05335 0.06633,-0.08355 0.09375,-0.125 L 29.71875,25.375 c -0.04145,0.02742 -0.07165,0.0404 -0.125,0.09375 l -1.625,1.625 a 0.48185467,0.48185467 0 0 1 -0.59375,0.0625 c -0.542827,-0.342889 -1.142783,-0.604616 -1.78125,-0.75 a 0.48185467,0.48185467 0 0 1 -0.375,-0.46875 v -2.28125 c 0,-0.0873 -0.01959,-0.133695 -0.03125,-0.1875 z m 0.875,5.28125 c 1.791829,0 3.25,1.458172 3.25,3.25 0,1.791828 -1.458171,3.25 -3.25,3.25 -1.791827,0 -3.25,-1.458172 -3.25,-3.25 0,-1.791828 1.458173,-3.25 3.25,-3.25 z"
|
||||
id="path4243"
|
||||
style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient2975);stroke-width:1;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 22 KiB |
@@ -1,128 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="Capa_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 511.99998 512"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="refresh.svg"
|
||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
|
||||
id="metadata45"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs43" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="739"
|
||||
id="namedview41"
|
||||
showgrid="false"
|
||||
showborder="true"
|
||||
inkscape:zoom="0.48437083"
|
||||
inkscape:cx="133.71431"
|
||||
inkscape:cy="289.92474"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Capa_1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:document-rotation="0" />
|
||||
<g
|
||||
id="g8"
|
||||
transform="matrix(1.0938971,0,0,1.0217723,-10.489433,7.0809411)"
|
||||
style="fill:#3991e9;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<g
|
||||
id="g6"
|
||||
style="fill:#3991e9;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<path
|
||||
d="m 55.323,203.641 c 15.664,0 29.813,-9.405 35.872,-23.854 25.017,-59.604 83.842,-101.61 152.42,-101.61 37.797,0 72.449,12.955 100.23,34.442 l -21.775,3.371 c -7.438,1.153 -13.224,7.054 -14.232,14.512 -1.01,7.454 3.008,14.686 9.867,17.768 l 119.746,53.872 c 5.249,2.357 11.33,1.904 16.168,-1.205 4.83,-3.114 7.764,-8.458 7.796,-14.208 l 0.621,-131.943 c 0.042,-7.506 -4.851,-14.144 -12.024,-16.332 -7.185,-2.188 -14.947,0.589 -19.104,6.837 L 414.403,70.096 C 370.398,26.778 310.1,0 243.615,0 142.806,0 56.133,61.562 19.167,149.06 c -5.134,12.128 -3.84,26.015 3.429,36.987 7.269,10.976 19.556,17.594 32.727,17.594 z"
|
||||
id="path2"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#3991e9;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
<path
|
||||
d="m 464.635,301.184 c -7.27,-10.977 -19.558,-17.594 -32.728,-17.594 -15.664,0 -29.813,9.405 -35.872,23.854 -25.018,59.604 -83.843,101.61 -152.42,101.61 -37.798,0 -72.45,-12.955 -100.232,-34.442 l 21.776,-3.369 c 7.437,-1.153 13.223,-7.055 14.233,-14.514 1.009,-7.453 -3.008,-14.686 -9.867,-17.768 L 49.779,285.089 c -5.25,-2.356 -11.33,-1.905 -16.169,1.205 -4.829,3.114 -7.764,8.458 -7.795,14.207 l -0.622,131.943 c -0.042,7.506 4.85,14.144 12.024,16.332 7.185,2.188 14.948,-0.59 19.104,-6.839 l 16.505,-24.805 c 44.004,43.32 104.303,70.098 170.788,70.098 100.811,0 187.481,-61.561 224.446,-149.059 5.137,-12.128 3.843,-26.014 -3.425,-36.987 z"
|
||||
id="path4"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#3991e9;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g10"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g12"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g14"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g16"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g18"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g20"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g22"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g24"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g26"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g28"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g30"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g32"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g34"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g36"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
<g
|
||||
id="g38"
|
||||
transform="translate(-15.027876,-464.19647)">
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.5 KiB |
@@ -1,54 +0,0 @@
|
||||
appimage.config.database.expiration=Database expiration
|
||||
appimage.config.database.expiration.tip=It defines the period (in minutes) in which the database will be considered up to date during the initialization process. Use 0 if you always want to update it.
|
||||
appimage.config.suggestions.expiration=Suggestions expiration
|
||||
appimage.config.suggestions.expiration.tip=It defines the period (in hours) in which the suggestions stored in disc will be considered up to date. Use 0 if you always want to update them.
|
||||
appimage.custom_action.install_file=Install AppImage file
|
||||
appimage.custom_action.install_file.desc=Installs an AppImage file on the system
|
||||
appimage.custom_action.install_file.details=AppImage installation details
|
||||
appimage.custom_action.install_file.invalid_file=You must define a valid AppImage file
|
||||
appimage.custom_action.install_file.invalid_name=You must define a name for the application
|
||||
appimage.custom_action.install_file.status=Installing AppImage file
|
||||
appimage.custom_action.manual_update=Upgrade file
|
||||
appimage.custom_action.manual_update.desc=Replaces the installed AppImage file by another one
|
||||
appimage.custom_action.manual_update.details=AppImage upgrade details
|
||||
appimage.custom_action.manual_update.status=Upgrading
|
||||
appimage.custom_action.self_install=Install Bearhub
|
||||
appimage.custom_action.self_install.desc=Installs Bearhub on the system and adds its icons to the menu
|
||||
appimage.custom_action.self_install.status=Installing Bearhub
|
||||
appimage.custom_action.update_db=Update database
|
||||
appimage.custom_action.update_db.desc=Downloads updated files from the AppImage applications database
|
||||
appimage.custom_action.update_db.status=Updating database
|
||||
appimage.downgrade.first_version={} és a la seva primera versió publicada
|
||||
appimage.downgrade.impossible.body={} té només una versió publicada.
|
||||
appimage.downgrade.impossible.title=No s’ha pogut revertir la versió
|
||||
appimage.downgrade.install_version=No s’ha pogut instal·lar la versió {} ({})
|
||||
appimage.downgrade.unknown_version.body=No s’ha pogut identificar la versió actual de {} a l’historial de versions
|
||||
appimage.download.error=No s’ha pogut baixar el fitxer {}. El servidor del fitxer pot estar inactiu.
|
||||
appimage.download.no_url=No download URL associated with the app {app}
|
||||
appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {}
|
||||
appimage.history.0_version=versió
|
||||
appimage.history.1_published_at=data
|
||||
appimage.history.2_url_download=URL del fitxer
|
||||
appimage.info.icon_path=icona
|
||||
appimage.info.imported.false=No
|
||||
appimage.info.imported.true=Yes
|
||||
appimage.info.install_dir=Installation directory
|
||||
appimage.info.repository=Repositori
|
||||
appimage.info.symlink=Symlink
|
||||
appimage.info.url_download=URL del fitxer
|
||||
appimage.install.appimagelauncher.error={appimgl} no permet la instal·lació de {app}. Desinstal·leu {appimgl}, reinicieu el sistema i torneu a provar d’instal·lar {app}.
|
||||
appimage.install.desktop_entry=S’està creant una drecera del menú
|
||||
appimage.install.extract=S’està extraient el contingut de {}
|
||||
appimage.install.imported.rename_error=It was not possible to move the file {} to {}
|
||||
appimage.install.permission=S’està concedint el permís d’execució a {}
|
||||
appimage.update_database.deleting_old=Removing old files
|
||||
appimage.update_database.downloading=Downloading database files
|
||||
appimage.update_database.uncompressing=Uncompressing files
|
||||
appimage.upgrade.failed=It was not possible to upgrade the following applications: {apps}
|
||||
appimage.task.db_update=Actualització de bases de dades
|
||||
appimage.task.db_update.checking=Checking for updates
|
||||
appimage.task.symlink_check=Checking symlinks
|
||||
appimage.uninstall.error.remove_folder=No s’ha pogut suprimir el directori d’instal·lació de l’aplicació {}
|
||||
appimage.warning.missing_db_files={appimage} database files were not found. Some actions will not work properly.
|
||||
gem.appimage.info=Aplicacions publicades a https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,54 +0,0 @@
|
||||
appimage.config.database.expiration=Ablauf der Datenbank
|
||||
appimage.config.database.expiration.tip=Er definiert den Zeitraum (in Minuten), in dem die Datenbank während des Initialisierungsprozesses als aktuell angesehen wird. Verwenden Sie 0, wenn Sie sie immer aktualisieren wollen.
|
||||
appimage.config.suggestions.expiration=Ablauf der Vorschläge
|
||||
appimage.config.suggestions.expiration.tip=Er definiert den Zeitraum (in Stunden), in dem die, auf dem Datenträger gespeicherten, Vorschläge als aktuell angesehen werden. Verwenden Sie 0, wenn Sie sie immer aktualisieren wollen.
|
||||
appimage.custom_action.install_file=AppImage-Datei installieren
|
||||
appimage.custom_action.install_file.desc=Installiert eine AppImage-Datei auf dem System
|
||||
appimage.custom_action.install_file.details=Details zur AppImage-Installation
|
||||
appimage.custom_action.install_file.invalid_file=Sie müssen eine gültige AppImage-Datei angeben
|
||||
appimage.custom_action.install_file.invalid_name=Sie müssen einen Namen für die Anwendung festlegen
|
||||
appimage.custom_action.install_file.status=Installation der AppImage-Datei
|
||||
appimage.custom_action.manual_update=Datei upgraden
|
||||
appimage.custom_action.manual_update.desc=Ersetzt die installierte AppImage-Datei durch eine andere
|
||||
appimage.custom_action.manual_update.details=Details zum AppImage-Upgrade
|
||||
appimage.custom_action.manual_update.status=Upgrade von
|
||||
appimage.custom_action.self_install=Bearhub installieren
|
||||
appimage.custom_action.self_install.desc=Installiert Bearhub auf dem System und fügt seine Symbole in das Menü ein
|
||||
appimage.custom_action.self_install.status=Installation von Bearhub
|
||||
appimage.custom_action.update_db=Datenbank aktualisieren
|
||||
appimage.custom_action.update_db.desc=Lädt aktualisierte Dateien aus der AppImage-Anwendungsdatenbank herunter
|
||||
appimage.custom_action.update_db.status=Aktualisierung der Datenbank
|
||||
appimage.downgrade.first_version={} ist in der ersten veröffentlichten Version
|
||||
appimage.downgrade.impossible.body={} hat nur eine veröffentliche Version
|
||||
appimage.downgrade.impossible.title=Downgrade nicht möglich
|
||||
appimage.downgrade.install_version=Die Installation der Version {} ({}) war nicht möglich
|
||||
appimage.downgrade.unknown_version.body={} aktuelle Version wurde im Versionsverlauf nicht gefunden
|
||||
appimage.download.error=Es war nicht möglich, die Datei {} herunterzuladen. Der Dateiserver kann ausgefallen sein.
|
||||
appimage.download.no_url=Keine Download-URL für die Anwendung {app} zugeordnet
|
||||
appimage.error.uninstall_current_version=Es war nicht möglich, die aktuelle Version von {} zu deinstallieren.
|
||||
appimage.history.0_version=Version
|
||||
appimage.history.1_published_at=Datum
|
||||
appimage.history.2_url_download=Datei-URL
|
||||
appimage.info.icon_path=Symbol
|
||||
appimage.info.imported.false=Nein
|
||||
appimage.info.imported.true=Ja
|
||||
appimage.info.install_dir=Installationsverzeichnis
|
||||
appimage.info.repository=Repository
|
||||
appimage.info.symlink=Symlink
|
||||
appimage.info.url_download=Datei-URL
|
||||
appimage.install.appimagelauncher.error={appimgl} lässt nicht zu, dass {app} installiert wird. Deinstallieren Sie {appimgl}, starten Sie Ihr System neu und versuchen Sie erneut, {app} zu installieren.
|
||||
appimage.install.desktop_entry=Ein Tastenkürzel für das Menü festlegen
|
||||
appimage.install.extract=Extrahieren des Inhalts von {}
|
||||
appimage.install.imported.rename_error=Es war nicht möglich, die Datei {} nach {} zu verschieben
|
||||
appimage.install.permission=Erteilung der Ausführungsberechtigung für {}
|
||||
appimage.update_database.deleting_old=Entfernen von alten Dateien
|
||||
appimage.update_database.downloading=Herunterladen von Datenbankdateien
|
||||
appimage.update_database.uncompressing=Dekomprimierung von Dateien
|
||||
appimage.upgrade.failed=Es war nicht möglich, die folgenden Anwendungen upzugraden: {Anwendungen}
|
||||
appimage.task.db_update=Aktualisierung der Datenbanken
|
||||
appimage.task.db_update.checking=Überprüfung auf Aktualisierungen
|
||||
appimage.task.symlink_check=Überprüfung der Symlinks
|
||||
appimage.uninstall.error.remove_folder=Das Installationsverzeichnis der Anwendung konnte nicht entfernt werden {}
|
||||
appimage.warning.missing_db_files={appimage} Datenbankdateien wurden nicht gefunden. Einige Aktionen werden nicht richtig funktionieren.
|
||||
gem.appimage.info=Anwendungen veröffentlicht auf https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,54 +0,0 @@
|
||||
appimage.config.database.expiration=Database expiration
|
||||
appimage.config.database.expiration.tip=It defines the period (in minutes) in which the database will be considered up to date during the initialization process. Use 0 if you always want to update it.
|
||||
appimage.config.suggestions.expiration=Suggestions expiration
|
||||
appimage.config.suggestions.expiration.tip=It defines the period (in hours) in which the suggestions stored in disc will be considered up to date. Use 0 if you always want to update them.
|
||||
appimage.custom_action.install_file=Install AppImage file
|
||||
appimage.custom_action.install_file.desc=Installs an AppImage file on the system
|
||||
appimage.custom_action.install_file.details=AppImage installation details
|
||||
appimage.custom_action.install_file.invalid_file=You must define a valid AppImage file
|
||||
appimage.custom_action.install_file.invalid_name=You must define a name for the application
|
||||
appimage.custom_action.install_file.status=Installing AppImage file
|
||||
appimage.custom_action.manual_update=Upgrade file
|
||||
appimage.custom_action.manual_update.desc=Replaces the installed AppImage file by another one
|
||||
appimage.custom_action.manual_update.details=AppImage upgrade details
|
||||
appimage.custom_action.manual_update.status=Upgrading
|
||||
appimage.custom_action.self_install=Install Bearhub
|
||||
appimage.custom_action.self_install.desc=Installs Bearhub on the system and adds its icons to the menu
|
||||
appimage.custom_action.self_install.status=Installing Bearhub
|
||||
appimage.custom_action.update_db=Update database
|
||||
appimage.custom_action.update_db.desc=Downloads updated files from the AppImage applications database
|
||||
appimage.custom_action.update_db.status=Updating database
|
||||
appimage.downgrade.first_version={} is in its first published version
|
||||
appimage.downgrade.impossible.body={} has only one published version.
|
||||
appimage.downgrade.impossible.title=Impossible to downgrade
|
||||
appimage.downgrade.install_version=It was not possible to install the version {} ({})
|
||||
appimage.downgrade.unknown_version.body={} current version was not found in its release history
|
||||
appimage.download.error=It was not possible to download the file {}. The file server can be down.
|
||||
appimage.download.no_url=No download URL associated with the app {app}
|
||||
appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {}
|
||||
appimage.history.0_version=version
|
||||
appimage.history.1_published_at=date
|
||||
appimage.history.2_url_download=File URL
|
||||
appimage.info.icon_path=icon
|
||||
appimage.info.imported.false=No
|
||||
appimage.info.imported.true=Yes
|
||||
appimage.info.install_dir=Installation directory
|
||||
appimage.info.repository=Repository
|
||||
appimage.info.symlink=Symlink
|
||||
appimage.info.url_download=File URL
|
||||
appimage.install.appimagelauncher.error={appimgl} is not allowing {app} to be installed. Uninstall {appimgl}, reboot your system and try to install {app} again.
|
||||
appimage.install.desktop_entry=Generating a menu shortcut
|
||||
appimage.install.extract=Extracting the content from {}
|
||||
appimage.install.imported.rename_error=It was not possible to move the file {} to {}
|
||||
appimage.install.permission=Giving execution permission to {}
|
||||
appimage.update_database.deleting_old=Removing old files
|
||||
appimage.update_database.downloading=Downloading database files
|
||||
appimage.update_database.uncompressing=Uncompressing files
|
||||
appimage.upgrade.failed=It was not possible to upgrade the following applications: {apps}
|
||||
appimage.task.db_update=Updating databases
|
||||
appimage.task.db_update.checking=Checking for updates
|
||||
appimage.task.symlink_check=Checking symlinks
|
||||
appimage.uninstall.error.remove_folder=Could not remove the application installation directory {}
|
||||
appimage.warning.missing_db_files={appimage} database files were not found. Some actions will not work properly.
|
||||
gem.appimage.info=Applications published at https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,54 +0,0 @@
|
||||
appimage.config.database.expiration=Expiración de la base de datos
|
||||
appimage.config.database.expiration.tip=Define el período (en minutos) en el que la base de datos será considerada actualizada durante el proceso de inicialización. Use 0 si siempre desea actualizarla.
|
||||
appimage.config.suggestions.expiration=Expiración de sugerencias
|
||||
appimage.config.suggestions.expiration.tip=Define el período (en horas) en el que la sugerencias almacenadas en disco seran consideradas actualizadas. Use 0 si desea siempre actualizarlas.
|
||||
appimage.custom_action.install_file=Instalar archivo AppImage
|
||||
appimage.custom_action.install_file.desc=Instala un archivo AppImage en el sistema
|
||||
appimage.custom_action.install_file.details=Detalles de instalación de AppImage
|
||||
appimage.custom_action.install_file.invalid_file=Debe definir un archivo AppImage válido
|
||||
appimage.custom_action.install_file.invalid_name=Debe definir un nombre para la aplicación
|
||||
appimage.custom_action.install_file.status=Instalando archivo AppImage
|
||||
appimage.custom_action.manual_update=Actualizar archivo
|
||||
appimage.custom_action.manual_update.desc=Reemplaza el archivo AppImage instalado por otro
|
||||
appimage.custom_action.manual_update.details=Detalles de actualización de AppImage
|
||||
appimage.custom_action.manual_update.status=Actualizando
|
||||
appimage.custom_action.self_install=Instalar Bearhub
|
||||
appimage.custom_action.self_install.desc=Instala Bearhub en el sistema y agrega sus íconos al menú
|
||||
appimage.custom_action.self_install.status=Instalando Bearhub
|
||||
appimage.custom_action.update_db=Actualizar base de datos
|
||||
appimage.custom_action.update_db.desc=Descarga archivos actualizados de la base de datos de aplicaciones AppImage
|
||||
appimage.custom_action.update_db.status=Actualizando base de datos
|
||||
appimage.downgrade.first_version={} está en su primera versión publicada
|
||||
appimage.downgrade.impossible.body={} solo tiene una versión publicada.
|
||||
appimage.downgrade.impossible.title=Imposible revertir la versión
|
||||
appimage.downgrade.install_version=No fue posible instalar la versión {} ({})
|
||||
appimage.downgrade.unknown_version.body=No fue posible identificar la versión actual de {} en su historial de versiones
|
||||
appimage.download.error=No fue posible descargar el archivo {}. El servidor del archivo puede estar inactivo.
|
||||
appimage.download.no_url=No hay URL de descarga asociada a la aplicación {app}
|
||||
appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {}
|
||||
appimage.history.0_version=versión
|
||||
appimage.history.1_published_at=fecha
|
||||
appimage.history.2_url_download=URL del archivo
|
||||
appimage.info.icon_path=icono
|
||||
appimage.info.imported.false=No
|
||||
appimage.info.imported.true=Sí
|
||||
appimage.info.install_dir=Directorio de instalación
|
||||
appimage.info.repository=Repositorio
|
||||
appimage.info.symlink=Link simbólico
|
||||
appimage.info.url_download=URL del archivo
|
||||
appimage.install.appimagelauncher.error={appimgl} no permite la instalación de {app}. Desinstale {appimgl}, reinicie su sistema e intente instalar {app} nuevamente.
|
||||
appimage.install.desktop_entry=Creando un atajo en el menú
|
||||
appimage.install.extract=Extrayendo el contenido de {}
|
||||
appimage.install.imported.rename_error=No fue posible mover el archivo {} a {}
|
||||
appimage.install.permission=Concediendo permiso de ejecución a {}
|
||||
appimage.update_database.deleting_old=Eliminando archivos antiguos
|
||||
appimage.update_database.downloading=Descargando archivos de la base de datos
|
||||
appimage.update_database.uncompressing=Descomprindo archivos
|
||||
appimage.upgrade.failed=No fue posible actualizar las siguientes aplicaciones: {apps}
|
||||
appimage.task.db_update=Actualizando base de datos
|
||||
appimage.task.db_update.checking=Buscando actualizaciones
|
||||
appimage.task.symlink_check=Verificando links simbólicos
|
||||
appimage.uninstall.error.remove_folder=No se pudo eliminar el directorio de instalación de la aplicación {}
|
||||
appimage.warning.missing_db_files=No se encontraron archivos de la base de datos {appimage}. Algunas acciones no funcionarán correctamente.
|
||||
gem.appimage.info=Aplicativos publicados en https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,55 +0,0 @@
|
||||
appimage.config.database.expiration=Database expiration
|
||||
appimage.config.database.expiration.tip=It defines the period (in minutes) in which the database will be considered up to date during the initialization process. Use 0 if you always want to update it.
|
||||
appimage.config.suggestions.expiration=Suggestions expiration
|
||||
appimage.config.suggestions.expiration.tip=It defines the period (in hours) in which the suggestions stored in disc will be considered up to date. Use 0 if you always want to update them
|
||||
appimage.custom_action.install_file=Installer fichier AppImage
|
||||
appimage.custom_action.install_file.desc=Installs an AppImage file on the system
|
||||
appimage.custom_action.install_file.details=Détails d'installation d'AppImage
|
||||
appimage.custom_action.install_file.invalid_file=Vous devez définir un fichier AppImage valide
|
||||
appimage.custom_action.install_file.invalid_name=Vous devez choisir un nom à l'application
|
||||
appimage.custom_action.install_file.status=Installation du fichier AppImage
|
||||
appimage.custom_action.manual_update=Mettre fichier à jour
|
||||
appimage.custom_action.manual_update.desc=Replaces the installed AppImage file by another one
|
||||
appimage.custom_action.manual_update.details=Détails de mise à jour
|
||||
appimage.custom_action.manual_update.status=Mise à jour
|
||||
appimage.custom_action.self_install=Install Bearhub
|
||||
appimage.custom_action.self_install.desc=Installs Bearhub on the system and adds its icons to the menu
|
||||
appimage.custom_action.self_install.status=Installing Bearhub
|
||||
appimage.custom_action.update_db=Update database
|
||||
appimage.custom_action.update_db.desc=Downloads updated files from the AppImage applications database
|
||||
appimage.custom_action.update_db.status=Updating database
|
||||
appimage.downgrade.first_version={} est à sa première version publiée
|
||||
appimage.downgrade.impossible.body={} a une seule version publiée.
|
||||
appimage.downgrade.impossible.title=Impossible à downgrader
|
||||
appimage.downgrade.install_version=Installer la version {} ({}) était impossible
|
||||
appimage.downgrade.unknown_version.body=Impossible d'identifier la version actuelle de {} dans son historique de versions
|
||||
appimage.download.error=It was not possible to download the file {}. The file server can be down.
|
||||
appimage.download.no_url=No download URL associated with the app {app}
|
||||
appimage.error.uninstall_current_version=Impossible de désinstaller la version actuelle de {}
|
||||
appimage.history.0_version=version
|
||||
appimage.history.1_published_at=date
|
||||
appimage.history.2_url_download=URL du fichier
|
||||
appimage.info.icon_path=icône
|
||||
appimage.info.imported.false=Non
|
||||
appimage.info.imported.true=Oui
|
||||
appimage.info.install_dir=Répertoire d'installation
|
||||
appimage.info.repository=Dépôt
|
||||
appimage.info.symlink=Symlink
|
||||
appimage.info.url_download=URL du fichier
|
||||
appimage.install.appimagelauncher.error={appimgl} n'autorise pas {app} à être installé. Désinstallez {appimgl}, redemarrez, puis essayez d'installer {app} de nouveau.
|
||||
appimage.install.desktop_entry=Generation d'un raccourci de menu
|
||||
appimage.install.download.error=Échec du téléchargement du fichier {}. Le serveur peut être indisponible.
|
||||
appimage.install.extract=Extractiion du contenu de {}
|
||||
appimage.install.imported.rename_error=Impossible de déplacer {} vers {}
|
||||
appimage.install.permission={} est maintenant exécutable
|
||||
appimage.update_database.deleting_old=Removing old files
|
||||
appimage.update_database.downloading=Downloading database files
|
||||
appimage.update_database.uncompressing=Uncompressing files
|
||||
appimage.upgrade.failed=It was not possible to upgrade the following applications: {apps}
|
||||
appimage.task.db_update=Mise à jour des bases de données
|
||||
appimage.task.db_update.checking=Checking for updates
|
||||
appimage.task.symlink_check=Verification des symlinks
|
||||
appimage.uninstall.error.remove_folder=Impossible de supprimer le répertoire d'installation {}
|
||||
appimage.warning.missing_db_files={appimage} database files were not found. Some actions will not work properly.
|
||||
gem.appimage.info=Applications publiées à https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,55 +0,0 @@
|
||||
appimage.config.database.expiration=Database expiration
|
||||
appimage.config.database.expiration.tip=It defines the period (in minutes) in which the database will be considered up to date during the initialization process. Use 0 if you always want to update it.
|
||||
appimage.config.suggestions.expiration=Suggestions expiration
|
||||
appimage.config.suggestions.expiration.tip=It defines the period (in hours) in which the suggestions stored in disc will be considered up to date. Use 0 if you always want to update them.
|
||||
appimage.custom_action.install_file=Install AppImage file
|
||||
appimage.custom_action.install_file.desc=Installs an AppImage file on the system
|
||||
appimage.custom_action.install_file.details=AppImage installation details
|
||||
appimage.custom_action.install_file.invalid_file=You must define a valid AppImage file
|
||||
appimage.custom_action.install_file.invalid_name=You must define a name for the application
|
||||
appimage.custom_action.install_file.status=Installing AppImage file
|
||||
appimage.custom_action.manual_update=Upgrade file
|
||||
appimage.custom_action.manual_update.desc=Replaces the installed AppImage file by another one
|
||||
appimage.custom_action.manual_update.details=AppImage upgrade details
|
||||
appimage.custom_action.manual_update.status=Upgrading
|
||||
appimage.custom_action.self_install=Install Bearhub
|
||||
appimage.custom_action.self_install.desc=Installs Bearhub on the system and adds its icons to the menu
|
||||
appimage.custom_action.self_install.status=Installing Bearhub
|
||||
appimage.custom_action.update_db=Update database
|
||||
appimage.custom_action.update_db.desc=Downloads updated files from the AppImage applications database
|
||||
appimage.custom_action.update_db.status=Updating database
|
||||
appimage.downgrade.first_version={} è nella sua prima versione pubblicata
|
||||
appimage.downgrade.impossible.body={} ha solo una versione pubblicata.
|
||||
appimage.downgrade.impossible.title=Impossibile eseguire il downgrade
|
||||
appimage.downgrade.install_version=Non è stato possibile installare la versione {} ({})
|
||||
appimage.downgrade.unknown_version.body=Non è stato possibile identificare la {} versione corrente nella sua cronologia delle versioni
|
||||
appimage.download.error=It was not possible to download the file {}. The file server can be down.
|
||||
appimage.download.no_url=No download URL associated with the app {app}
|
||||
appimage.error.uninstall_current_version=Non è stato possibile disinstallare la versione corrente di {}
|
||||
appimage.history.0_version=versione
|
||||
appimage.history.1_published_at=data
|
||||
appimage.history.2_url_download=File URL
|
||||
appimage.info.icon_path=icona
|
||||
appimage.info.imported.false=No
|
||||
appimage.info.imported.true=Yes
|
||||
appimage.info.install_dir=Installation directory
|
||||
appimage.info.repository=Deposito
|
||||
appimage.info.symlink=Symlink
|
||||
appimage.info.url_download=File URL
|
||||
appimage.install.appimagelauncher.error={appimgl} non consente l'installazione di {app}. Disinstallare {appimgl}, riavviare il sistema e provare a installare nuovamente {app}.
|
||||
appimage.install.desktop_entry=Genera un collegamento al menu
|
||||
appimage.install.download.error=Non è stato possibile scaricare il file {}. Il file server può essere inattivo.
|
||||
appimage.install.extract=Estrarre il contenuto da {}
|
||||
appimage.install.imported.rename_error=It was not possible to move the file {} to {}
|
||||
appimage.install.permission=Gdare il permesso di esecuzione a {}
|
||||
appimage.update_database.deleting_old=Removing old files
|
||||
appimage.update_database.downloading=Downloading database files
|
||||
appimage.update_database.uncompressing=Uncompressing files
|
||||
appimage.upgrade.failed=It was not possible to upgrade the following applications: {apps}
|
||||
appimage.task.db_update=Aggiornamento dei database
|
||||
appimage.task.db_update.checking=Checking for updates
|
||||
appimage.task.symlink_check=Checking symlinks
|
||||
appimage.uninstall.error.remove_folder=Impossibile rimuovere la directory di installazione dell'applicazione {}
|
||||
appimage.warning.missing_db_files={appimage} database files were not found. Some actions will not work properly.
|
||||
gem.appimage.info=Applicazioni pubblicate su https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,54 +0,0 @@
|
||||
appimage.config.database.expiration=Expiração do banco de dados
|
||||
appimage.config.database.expiration.tip=Define o período (em minutos) no qual o banco de dados será considerado atualizado durante o processo de inicialização. Use 0 se quiser que ele sempre seja atualizado.
|
||||
appimage.config.suggestions.expiration=Expiração das sugestões
|
||||
appimage.config.suggestions.expiration.tip=Define o período (em horas) no qual as sugestões armazenadas em disco serão consideradas atualizadas. Use 0 se quiser que elas sempre sejam atualizadas.
|
||||
appimage.custom_action.install_file=Instalar arquivo AppImage
|
||||
appimage.custom_action.install_file.desc=Instala um arquivo AppImage no sistema
|
||||
appimage.custom_action.install_file.details=Detalhes de instalação de AppImage
|
||||
appimage.custom_action.install_file.invalid_file=Você precisa definir um arquivo AppImage válido
|
||||
appimage.custom_action.install_file.invalid_name=Você precisa definir um nome para o aplicativo
|
||||
appimage.custom_action.install_file.status=Instalando arquivo AppImage
|
||||
appimage.custom_action.manual_update=Atualizar arquivo
|
||||
appimage.custom_action.manual_update.desc=Subsitui o arquivo AppImage instalado por outro
|
||||
appimage.custom_action.manual_update.details=Detalhes de atualização de AppImage
|
||||
appimage.custom_action.manual_update.status=Atualizando
|
||||
appimage.custom_action.self_install=Instalar o Bearhub
|
||||
appimage.custom_action.self_install.desc=Instala o Bearhub no sistema e adiciona os ícones no menu
|
||||
appimage.custom_action.self_install.status=Instalando o Bearhub
|
||||
appimage.custom_action.update_db=Atualizar banco de dados
|
||||
appimage.custom_action.update_db.desc=Baixa arquivos atualizados da base de dados de aplicações AppImage
|
||||
appimage.custom_action.update_db.status=Atualizando banco de dados
|
||||
appimage.downgrade.first_version={} se encontra em sua primeira versão publicada
|
||||
appimage.downgrade.impossible.body={} tem somente uma versão publicada.
|
||||
appimage.downgrade.impossible.title=Impossível reverter a versão
|
||||
appimage.downgrade.install_version=Não foi possivel instalar a versão {} ({})
|
||||
appimage.downgrade.unknown_version.body=Não foi possível identificar a versão atual de {} no seu histórico de versões
|
||||
appimage.download.error=Não foi possível baixar o arquivo {}. O servidor do arquivo pode estar fora do ar.
|
||||
appimage.download.no_url=Nenhuma URL de download associada ao aplicativo {app}
|
||||
appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {}
|
||||
appimage.history.0_version=versão
|
||||
appimage.history.1_published_at=data
|
||||
appimage.history.2_url_download=URL do arquivo
|
||||
appimage.info.icon_path=ícone
|
||||
appimage.info.imported.false=Não
|
||||
appimage.info.imported.true=Sim
|
||||
appimage.info.install_dir=Diretório de instalação
|
||||
appimage.info.repository=Repositório
|
||||
appimage.info.symlink=Link simbólico
|
||||
appimage.info.url_download=URL do arquivo
|
||||
appimage.install.appimagelauncher.error={appimgl} não está permitindo que o {app} seja instalado. Desinstale o {appimgl}, reinicie o sistema e tente instalar o {app} novamente.
|
||||
appimage.install.desktop_entry=Criando um atalho no menu
|
||||
appimage.install.extract=Extraindo o conteúdo de {}
|
||||
appimage.install.imported.rename_error=Não foi possível mover o arquivo {} para {}
|
||||
appimage.install.permission=Concedendo permissão de execução para {}
|
||||
appimage.update_database.deleting_old=Removendo arquicos antigos
|
||||
appimage.update_database.downloading=Baixando arquivos do banco de dados
|
||||
appimage.update_database.uncompressing=Descomprimindo arquivos
|
||||
appimage.upgrade.failed=Não foi possível atualizar as seguintes aplicações: {apps}
|
||||
appimage.task.db_update=Atualizando base de dados
|
||||
appimage.task.db_update.checking=Checando atualizações
|
||||
appimage.task.symlink_check=Verificando links simbólicos
|
||||
appimage.uninstall.error.remove_folder=Não foi possível remover o diretóri ode instalação do aplicativo {}
|
||||
appimage.warning.missing_db_files=Arquivos do banco de dados {appimage} não foram encontrados. Algumas ações não funcionarão corretamente.
|
||||
gem.appimage.info=Aplicativos publicados em https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,54 +0,0 @@
|
||||
appimage.config.database.expiration=Срок действия базы данных
|
||||
appimage.config.database.expiration.tip=IОпределяет период (в минутах), в течение которого база данных будет считаться актуальной в процессе инициализации. Используйте 0, если вы хотите обновлять ее всегда.
|
||||
appimage.config.suggestions.expiration=Срок действия предложений
|
||||
appimage.config.suggestions.expiration.tip=Определяет период (в часах), в течение которого предложения, хранящиеся на диске, будут считаться актуальными. Используйте 0, если вы хотите обновлять их всегда.
|
||||
appimage.custom_action.install_file=Установить файл AppImage
|
||||
appimage.custom_action.install_file.desc=Устанавливает файл AppImage в систему
|
||||
appimage.custom_action.install_file.details=Детали установки
|
||||
appimage.custom_action.install_file.invalid_file=Вы должны определить допустимый файл AppImage
|
||||
appimage.custom_action.install_file.invalid_name=Вы должны определить имя для приложения
|
||||
appimage.custom_action.install_file.status=Установка файла AppImage
|
||||
appimage.custom_action.manual_update=Обновить файл
|
||||
appimage.custom_action.manual_update.desc=Заменяет установленный файл AppImage на другой
|
||||
appimage.custom_action.manual_update.details=Детали обновления
|
||||
appimage.custom_action.manual_update.status=Обновляется...
|
||||
appimage.custom_action.self_install=Установить Bearhub
|
||||
appimage.custom_action.self_install.desc=Устанавливает программу Bearhub в систему и добавляет ее иконки в меню
|
||||
appimage.custom_action.self_install.status=Установка Bearhub
|
||||
appimage.custom_action.update_db=Обновление базы данных
|
||||
appimage.custom_action.update_db.desc=Загрузка обновленных файлов из базы данных приложений AppImage
|
||||
appimage.custom_action.update_db.status=Обновление базы данных
|
||||
appimage.downgrade.first_version={} первая опубликованная версия
|
||||
appimage.downgrade.impossible.body={} имеет только одну опубликованную версию
|
||||
appimage.downgrade.impossible.title=Не удалось понизить версию
|
||||
appimage.downgrade.install_version=Не удалось установить версию {} ({})
|
||||
appimage.downgrade.unknown_version.body=Не удалось определить текущую версию {} в истории версий
|
||||
appimage.download.error=Не удалось загрузить файл {}. Файловый сервер не отвечает
|
||||
appimage.download.no_url=Нет URL-адреса загрузки, связанного с приложением {app}
|
||||
appimage.error.uninstall_current_version=Не удалось удалить текущую версию {}
|
||||
appimage.history.0_version=версия
|
||||
appimage.history.1_published_at=дата
|
||||
appimage.history.2_url_download=URL Файла
|
||||
appimage.info.icon_path=Значок
|
||||
appimage.info.imported.false=Нет
|
||||
appimage.info.imported.true=Да
|
||||
appimage.info.install_dir=Директория установки
|
||||
appimage.info.repository=Pепозиторий
|
||||
appimage.info.symlink=Символическая ссылка
|
||||
appimage.info.url_download=URL Файла
|
||||
appimage.install.appimagelauncher.error={appimgl} не позволяет установить {app} . Удалите {appimgl}, перезагрузите ваш компьютер и попробуйте снова установить {app}.
|
||||
appimage.install.desktop_entry=Создать ярлык в меню
|
||||
appimage.install.extract=Извлечь содержимое из {}
|
||||
appimage.install.imported.rename_error=Не удалось переместить файл {} в {}
|
||||
appimage.install.permission=Установить права на выполнение для {}
|
||||
appimage.update_database.deleting_old=Удаление старых файлов
|
||||
appimage.update_database.downloading=Загрузка файлов базы данных
|
||||
appimage.update_database.uncompressing=Распаковка файлов
|
||||
appimage.upgrade.failed=Не удалось обновить следующие приложения: {apps}
|
||||
appimage.task.db_update=Обновление базы данных
|
||||
appimage.task.db_update.checking=Проверка обновлений
|
||||
appimage.task.symlink_check=Проверка cимволических ссылок
|
||||
appimage.uninstall.error.remove_folder=Не удалось удалить каталог приложения {}
|
||||
appimage.warning.missing_db_files={appimage} файлы базы данных не найдены. Некоторые действия будут работать некорректно.
|
||||
gem.appimage.info=Приложения, опубликованные на https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,54 +0,0 @@
|
||||
appimage.config.database.expiration=Database expiration
|
||||
appimage.config.database.expiration.tip=It defines the period (in minutes) in which the database will be considered up to date during the initialization process. Use 0 if you always want to update it.
|
||||
appimage.config.suggestions.expiration=Suggestions expiration
|
||||
appimage.config.suggestions.expiration.tip=It defines the period (in hours) in which the suggestions stored in disc will be considered up to date. Use 0 if you always want to update them.
|
||||
appimage.custom_action.install_file=AppImage dosyasını yükle
|
||||
appimage.custom_action.install_file.desc=Installs an AppImage file on the system
|
||||
appimage.custom_action.install_file.details=Kurulum detayları
|
||||
appimage.custom_action.install_file.invalid_file=Geçerli bir AppImage dosyası tanımlamanız gerekir
|
||||
appimage.custom_action.install_file.invalid_name=Uygulama için bir ad tanımlamanız gerekir
|
||||
appimage.custom_action.install_file.status=AppImage dosyası yükleniyor
|
||||
appimage.custom_action.manual_update=Yükseltme dosyası
|
||||
appimage.custom_action.manual_update.desc=Replaces the installed AppImage file by another one
|
||||
appimage.custom_action.manual_update.details=Yükseltme ayrıntıları
|
||||
appimage.custom_action.manual_update.status=Yükseltiliyor
|
||||
appimage.custom_action.self_install=Install Bearhub
|
||||
appimage.custom_action.self_install.desc=Installs Bearhub on the system and adds its icons to the menu
|
||||
appimage.custom_action.self_install.status=Installing Bearhub
|
||||
appimage.custom_action.update_db=Update database
|
||||
appimage.custom_action.update_db.desc=Downloads updated files from the AppImage applications database
|
||||
appimage.custom_action.update_db.status=Updating database
|
||||
appimage.downgrade.first_version={} ilk yayınlanmış versiyonunda
|
||||
appimage.downgrade.impossible.body={} yalnızca bir yayınlanmış sürümüne sahip.
|
||||
appimage.downgrade.impossible.title=Sürüm düşürmek imkansız
|
||||
appimage.downgrade.install_version={} ({}) sürümünü kurmak mümkün değildi
|
||||
appimage.downgrade.unknown_version.body=Sürüm geçmişinde {} mevcut sürümü tanımlamak mümkün değildi
|
||||
appimage.download.error={} dosyası indirilemedi. Dosya sunucusu kapalı olabilir.
|
||||
appimage.download.no_url=No download URL associated with the app {app}
|
||||
appimage.error.uninstall_current_version={} mevcut sürümünü kaldırmak mümkün değildi
|
||||
appimage.history.0_version=sürüm
|
||||
appimage.history.1_published_at=tarih
|
||||
appimage.history.2_url_download=Dosya Bağlantısı
|
||||
appimage.info.icon_path=simge
|
||||
appimage.info.imported.false=Hayır
|
||||
appimage.info.imported.true=Evet
|
||||
appimage.info.install_dir=Kurulum dizini
|
||||
appimage.info.repository=Depo
|
||||
appimage.info.symlink=Symlink
|
||||
appimage.info.url_download=Dosya Bağlantısı
|
||||
appimage.install.appimagelauncher.error={appimgl}, {app} uygulamasının yüklenmesine izin vermiyor. {appimgl} yazılımını kaldırın, sisteminizi yeniden başlatın ve {app} yazılımını tekrar yüklemeyi deneyin.
|
||||
appimage.install.desktop_entry=Bir menü kısayolu oluşturuluyor
|
||||
appimage.install.extract={} 'den içerik ayıklanıyor
|
||||
appimage.install.imported.rename_error={} dosyasını {} klasörüne taşımak mümkün değildi
|
||||
appimage.install.permission={} için yürütme izni veriliyor
|
||||
appimage.update_database.deleting_old=Removing old files
|
||||
appimage.update_database.downloading=Downloading database files
|
||||
appimage.update_database.uncompressing=Uncompressing files
|
||||
appimage.upgrade.failed=It was not possible to upgrade the following applications: {apps}
|
||||
appimage.task.db_update=Veritabanları güncelleniyor
|
||||
appimage.task.db_update.checking=Checking for updates
|
||||
appimage.task.symlink_check=Checking symlinks
|
||||
appimage.uninstall.error.remove_folder={} uygulama kurulum dizini kaldırılamadı
|
||||
appimage.warning.missing_db_files={appimage} database files were not found. Some actions will not work properly.
|
||||
gem.appimage.info=https://appimage.github.io/ adresinde yayınlanan uygulamalar
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,54 +0,0 @@
|
||||
appimage.config.database.expiration=数据库过期时间
|
||||
appimage.config.database.expiration.tip=定义初始化过程中数据库被视为最新的期限(以分钟为单位)。如果您希望始终更新,请使用 0。
|
||||
appimage.config.suggestions.expiration=建议过期时间
|
||||
appimage.config.suggestions.expiration.tip=定义存储在磁盘中的建议被视为最新的期限(以小时为单位)。如果您希望始终更新它们,请使用 0。
|
||||
appimage.custom_action.install_file=安装 AppImage 文件
|
||||
appimage.custom_action.install_file.desc=在系统上安装 AppImage 文件
|
||||
appimage.custom_action.install_file.details=AppImage 安装详情
|
||||
appimage.custom_action.install_file.invalid_file=必须定义有效的 AppImage 文件
|
||||
appimage.custom_action.install_file.invalid_name=必须为应用程序定义名称
|
||||
appimage.custom_action.install_file.status=正在安装 AppImage 文件
|
||||
appimage.custom_action.manual_update=升级文件
|
||||
appimage.custom_action.manual_update.desc=使用另一个文件替换已安装的 AppImage 文件
|
||||
appimage.custom_action.manual_update.details=AppImage 升级详情
|
||||
appimage.custom_action.manual_update.status=正在升级
|
||||
appimage.custom_action.self_install=安装 Bearhub
|
||||
appimage.custom_action.self_install.desc=在系统上安装 Bearhub 并将其图标添加到菜单
|
||||
appimage.custom_action.self_install.status=正在安装 Bearhub
|
||||
appimage.custom_action.update_db=更新数据库
|
||||
appimage.custom_action.update_db.desc=从 AppImage 应用程序数据库下载更新的文件
|
||||
appimage.custom_action.update_db.status=正在更新数据库
|
||||
appimage.downgrade.first_version={} 正在使用其首个发布版本
|
||||
appimage.downgrade.impossible.body={} 只有一个已发布的版本。
|
||||
appimage.downgrade.impossible.title=无法降级
|
||||
appimage.downgrade.install_version=无法安装版本 {} ({})
|
||||
appimage.downgrade.unknown_version.body={} 当前版本在其发布历史中未找到
|
||||
appimage.download.error=无法下载文件 {}. 文件服务器可能已关闭。
|
||||
appimage.download.no_url=未关联与应用程序 {app} 相关的下载 URL
|
||||
appimage.error.uninstall_current_version=无法卸载当前版本的 {}
|
||||
appimage.history.0_version=版本
|
||||
appimage.history.1_published_at=发布日期
|
||||
appimage.history.2_url_download=文件 URL
|
||||
appimage.info.icon_path=图标路径
|
||||
appimage.info.imported.false=否
|
||||
appimage.info.imported.true=是
|
||||
appimage.info.install_dir=安装目录
|
||||
appimage.info.repository=仓库
|
||||
appimage.info.symlink=符号链接
|
||||
appimage.info.url_download=文件 URL
|
||||
appimage.install.appimagelauncher.error={appimgl} 不允许安装 {app}。卸载 {appimgl},重新启动系统,然后尝试重新安装 {app}。
|
||||
appimage.install.desktop_entry=生成菜单快捷方式
|
||||
appimage.install.extract=从 {} 中提取内容
|
||||
appimage.install.imported.rename_error=无法将文件 {} 移动到 {}
|
||||
appimage.install.permission=赋予执行权限给 {}
|
||||
appimage.update_database.deleting_old=正在删除旧文件
|
||||
appimage.update_database.downloading=正在下载数据库文件
|
||||
appimage.update_database.uncompressing=正在解压文件
|
||||
appimage.upgrade.failed=无法升级以下应用程序:{apps}
|
||||
appimage.task.db_update=正在更新数据库
|
||||
appimage.task.db_update.checking=正在检查更新
|
||||
appimage.task.symlink_check=正在检查符号链接
|
||||
appimage.uninstall.error.remove_folder=无法删除应用程序安装目录 {}
|
||||
appimage.warning.missing_db_files={appimage} 数据库文件未找到。某些操作将无法正常工作。
|
||||
gem.appimage.info=在 https://appimage.github.io/ 上发布的应用程序
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,48 +0,0 @@
|
||||
import os
|
||||
import re
|
||||
from typing import Optional
|
||||
|
||||
RE_DESKTOP_EXEC = re.compile(r'(\n?\s*\w*Exec\s*=(.+))')
|
||||
RE_MANY_SPACES = re.compile(r'\s+')
|
||||
|
||||
|
||||
def find_appimage_file(folder: str) -> Optional[str]:
|
||||
for r, d, files in os.walk(folder):
|
||||
for f in files:
|
||||
if f.lower().endswith('.appimage'):
|
||||
return f'{folder}/{f}'
|
||||
|
||||
|
||||
def replace_desktop_entry_exec_command(desktop_entry: str, appname: str, file_path: str) -> str:
|
||||
execs = RE_DESKTOP_EXEC.findall(desktop_entry)
|
||||
|
||||
if not execs:
|
||||
return desktop_entry
|
||||
|
||||
final_entry = desktop_entry
|
||||
treated_name = appname.strip().lower()
|
||||
|
||||
for exec_groups in execs:
|
||||
full_match = exec_groups[0]
|
||||
|
||||
if full_match.strip().startswith("TryExec"): # TryExec cause issues in some DE to display the app icon
|
||||
final_entry = final_entry.replace(full_match, "")
|
||||
continue
|
||||
|
||||
cmd = RE_MANY_SPACES.sub(' ', exec_groups[1].strip())
|
||||
if cmd:
|
||||
words = cmd.split(' ')
|
||||
changed = False
|
||||
|
||||
for idx in range(len(words)):
|
||||
if words[idx].lower() == treated_name:
|
||||
words[idx] = f'"{file_path}"'
|
||||
changed = True
|
||||
break
|
||||
|
||||
if not changed:
|
||||
words = [f'"{file_path}"']
|
||||
|
||||
final_entry = final_entry.replace(full_match, full_match.replace(exec_groups[1], ' '.join(words)))
|
||||
|
||||
return final_entry
|
||||
@@ -1,484 +0,0 @@
|
||||
import glob
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import tarfile
|
||||
import time
|
||||
import traceback
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from pathlib import Path
|
||||
from threading import Thread
|
||||
from typing import Optional, Generator
|
||||
|
||||
import requests
|
||||
|
||||
from bauh.api.abstract.handler import TaskManager, ProcessWatcher
|
||||
from bauh.api.http import HttpClient
|
||||
from bauh.commons.boot import CreateConfigFile
|
||||
from bauh.commons.html import bold
|
||||
from bauh.gems.appimage import get_icon_path, INSTALLATION_DIR, SYMLINKS_DIR, util, DATABASES_TS_FILE, \
|
||||
APPIMAGE_CACHE_DIR, DATABASE_APPS_FILE, DATABASE_RELEASES_FILE, URL_COMPRESSED_DATABASES
|
||||
from bauh.gems.appimage.model import AppImage
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
class DatabaseUpdater(Thread):
|
||||
COMPRESS_FILE_PATH = f'{APPIMAGE_CACHE_DIR}/db.tar.gz'
|
||||
|
||||
def __init__(self, i18n: I18n, http_client: HttpClient, logger: logging.Logger, taskman: TaskManager,
|
||||
watcher: Optional[ProcessWatcher] = None, appimage_config: Optional[dict] = None, create_config: Optional[CreateConfigFile] = None):
|
||||
super(DatabaseUpdater, self).__init__(daemon=True)
|
||||
self.http_client = http_client
|
||||
self.logger = logger
|
||||
self.i18n = i18n
|
||||
self.taskman = taskman
|
||||
self.watcher = watcher
|
||||
self.task_id = 'appim_db'
|
||||
self.config = appimage_config
|
||||
self.create_config = create_config
|
||||
self.taskman.register_task(self.task_id, self.i18n['appimage.task.db_update'], get_icon_path())
|
||||
|
||||
def should_update(self, appimage_config: dict) -> bool:
|
||||
ti = time.time()
|
||||
|
||||
try:
|
||||
db_exp = int(appimage_config['database']['expiration'])
|
||||
except ValueError:
|
||||
self.logger.error("Could not parse settings property 'database.expiration': {}".format(appimage_config['database']['expiration']))
|
||||
return True
|
||||
|
||||
if db_exp <= 0:
|
||||
self.logger.info("No expiration time configured for the AppImage database")
|
||||
return True
|
||||
|
||||
files = {*glob.glob(f'{APPIMAGE_CACHE_DIR}/*')}
|
||||
|
||||
if not files:
|
||||
self.logger.warning(f'No database files on {APPIMAGE_CACHE_DIR}')
|
||||
return True
|
||||
|
||||
if DATABASES_TS_FILE not in files:
|
||||
self.logger.warning("No database timestamp file found ({})".format(DATABASES_TS_FILE))
|
||||
return True
|
||||
|
||||
if DATABASE_APPS_FILE not in files:
|
||||
self.logger.warning("Database file '{}' not found".format(DATABASE_APPS_FILE))
|
||||
return True
|
||||
|
||||
if DATABASE_RELEASES_FILE not in files:
|
||||
self.logger.warning("Database file '{}' not found".format(DATABASE_RELEASES_FILE))
|
||||
return True
|
||||
|
||||
with open(DATABASES_TS_FILE) as f:
|
||||
dbs_ts_str = f.read()
|
||||
|
||||
try:
|
||||
dbs_timestamp = datetime.fromtimestamp(float(dbs_ts_str), tz=timezone.utc)
|
||||
except Exception:
|
||||
self.logger.error('Could not parse the databases timestamp: {}'.format(dbs_ts_str))
|
||||
traceback.print_exc()
|
||||
return True
|
||||
|
||||
update = dbs_timestamp + timedelta(minutes=db_exp) <= datetime.now(timezone.utc)
|
||||
self.logger.info('Finished. Took {0:.2f} seconds'.format(time.time() - ti))
|
||||
return update
|
||||
|
||||
def _update_task_progress(self, progress: float, substatus: Optional[str] = None):
|
||||
self.taskman.update_progress(self.task_id, progress, substatus)
|
||||
|
||||
if self.watcher:
|
||||
self.watcher.change_substatus(substatus)
|
||||
|
||||
def download_databases(self) -> bool:
|
||||
self._update_task_progress(10, self.i18n['appimage.update_database.downloading'])
|
||||
self.logger.info('Retrieving AppImage databases')
|
||||
|
||||
database_timestamp = datetime.now(timezone.utc).timestamp()
|
||||
try:
|
||||
res = self.http_client.get(URL_COMPRESSED_DATABASES, session=False)
|
||||
except Exception as e:
|
||||
self.logger.error("An error ocurred while downloading the AppImage database: {}".format(e.__class__.__name__))
|
||||
res = None
|
||||
|
||||
if not res:
|
||||
self.logger.warning('Could not download the database file {}'.format(URL_COMPRESSED_DATABASES))
|
||||
return False
|
||||
|
||||
Path(APPIMAGE_CACHE_DIR).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
with open(self.COMPRESS_FILE_PATH, 'wb+') as f:
|
||||
f.write(res.content)
|
||||
|
||||
self.logger.info("Database file saved at {}".format(self.COMPRESS_FILE_PATH))
|
||||
|
||||
self._update_task_progress(50, self.i18n['appimage.update_database.deleting_old'])
|
||||
old_db_files = glob.glob(f'{APPIMAGE_CACHE_DIR}/*.db')
|
||||
|
||||
if old_db_files:
|
||||
self.logger.info('Deleting old database files')
|
||||
for f in old_db_files:
|
||||
os.remove(f)
|
||||
|
||||
self.logger.info('Old database files deleted')
|
||||
|
||||
self._update_task_progress(75, self.i18n['appimage.update_database.uncompressing'])
|
||||
self.logger.info('Uncompressing {}'.format(self.COMPRESS_FILE_PATH))
|
||||
|
||||
try:
|
||||
tf = tarfile.open(self.COMPRESS_FILE_PATH)
|
||||
tf.extractall(APPIMAGE_CACHE_DIR)
|
||||
self.logger.info('Successfully uncompressed file {}'.format(self.COMPRESS_FILE_PATH))
|
||||
except Exception:
|
||||
self.logger.error('Could not extract file {}'.format(self.COMPRESS_FILE_PATH))
|
||||
traceback.print_exc()
|
||||
return False
|
||||
finally:
|
||||
self.logger.info('Deleting {}'.format(self.COMPRESS_FILE_PATH))
|
||||
os.remove(self.COMPRESS_FILE_PATH)
|
||||
self.logger.info('File {} deleted'.format(self.COMPRESS_FILE_PATH))
|
||||
|
||||
self._update_task_progress(95)
|
||||
self.logger.info("Saving database timestamp {}".format(database_timestamp))
|
||||
|
||||
with open(DATABASES_TS_FILE, 'w+') as f:
|
||||
f.write(str(database_timestamp))
|
||||
|
||||
self.logger.info("Database timestamp saved")
|
||||
|
||||
return True
|
||||
|
||||
def run(self):
|
||||
ti = time.time()
|
||||
|
||||
if self.create_config:
|
||||
self.taskman.update_progress(self.task_id, 0, self.i18n['task.waiting_task'].format(bold(self.create_config.task_name)))
|
||||
self.create_config.join()
|
||||
self.config = self.create_config.config
|
||||
|
||||
self.taskman.update_progress(self.task_id, 1, self.i18n['appimage.task.db_update.checking'])
|
||||
|
||||
if self.should_update(self.config):
|
||||
self.download_databases()
|
||||
|
||||
self.taskman.update_progress(self.task_id, 100, None)
|
||||
self.taskman.finish_task(self.task_id)
|
||||
tf = time.time()
|
||||
self.logger.info("Finished. Took {0:.2f} seconds".format(tf - ti))
|
||||
|
||||
|
||||
class SymlinksVerifier(Thread):
|
||||
|
||||
def __init__(self, taskman: TaskManager, i18n: I18n, logger: logging.Logger):
|
||||
super(SymlinksVerifier, self).__init__(daemon=True)
|
||||
self.taskman = taskman
|
||||
self.i18n = i18n
|
||||
self.logger = logger
|
||||
self.task_id = 'appim_symlink_check'
|
||||
self.taskman.register_task(self.task_id, self.i18n['appimage.task.symlink_check'], get_icon_path())
|
||||
|
||||
@staticmethod
|
||||
def create_symlink(app: AppImage, file_path: str, logger: logging.Logger, watcher: ProcessWatcher = None):
|
||||
logger.info("Creating a symlink for '{}'".format(app.name))
|
||||
possible_names = (app.get_clean_name(), '{}-appimage'.format(app.get_clean_name()), app.name.lower(), '{}-appimage'.format(app.name.lower()))
|
||||
|
||||
if os.path.exists(SYMLINKS_DIR) and not os.path.isdir(SYMLINKS_DIR):
|
||||
logger.warning("'{}' is not a directory. It will not be possible to create a symlink for '{}'".format(SYMLINKS_DIR, app.name))
|
||||
return
|
||||
|
||||
available_system_dirs = (SYMLINKS_DIR, *(l for l in ('/usr/bin', '/usr/local/bin') if os.path.isdir(l)))
|
||||
|
||||
# checking if the link already exists:
|
||||
|
||||
available_name = None
|
||||
for name in possible_names:
|
||||
available_name = name
|
||||
for sysdir in available_system_dirs:
|
||||
if os.path.exists('{}/{}'.format(sysdir, name)):
|
||||
available_name = None
|
||||
break
|
||||
|
||||
if available_name:
|
||||
break
|
||||
|
||||
if not available_name:
|
||||
msg = "It was not possible to create a symlink for '{}' because the names {} are already available on the system".format(app.name,
|
||||
possible_names)
|
||||
logger.warning(msg)
|
||||
if watcher:
|
||||
watcher.print('[warning] {}'.format(msg))
|
||||
else:
|
||||
try:
|
||||
Path(SYMLINKS_DIR).mkdir(parents=True, exist_ok=True)
|
||||
except Exception:
|
||||
logger.error("Could not create symlink directory '{}'".format(SYMLINKS_DIR))
|
||||
return
|
||||
|
||||
symlink_path = '{}/{}'.format(SYMLINKS_DIR, available_name)
|
||||
|
||||
try:
|
||||
os.symlink(src=file_path, dst=symlink_path)
|
||||
app.symlink = symlink_path
|
||||
|
||||
msg = "symlink successfully created at {}".format(symlink_path)
|
||||
logger.info(msg)
|
||||
|
||||
if watcher:
|
||||
watcher.print(msg)
|
||||
except Exception:
|
||||
msg = "Could not create the symlink '{}'".format(symlink_path)
|
||||
logger.error(msg)
|
||||
|
||||
if watcher:
|
||||
watcher.print('[error] {}'.format(msg))
|
||||
|
||||
def run(self):
|
||||
if os.path.exists(INSTALLATION_DIR):
|
||||
installed_files = glob.glob(f'{INSTALLATION_DIR}/*/*.json')
|
||||
|
||||
if installed_files:
|
||||
self.logger.info("Checking installed AppImage files with no symlinks created")
|
||||
|
||||
progress_per_file = (1/len(installed_files)) * 100
|
||||
total_progress = 0
|
||||
for json_file in installed_files:
|
||||
with open(json_file) as f:
|
||||
try:
|
||||
data = json.loads(f.read())
|
||||
except Exception:
|
||||
self.logger.warning("Could not parse data from '{}'".format(json_file))
|
||||
data = None
|
||||
|
||||
if data and not data.get('symlink'):
|
||||
if not data.get('install_dir'):
|
||||
data['install_dir'] = '/'.join(json_file.split('/')[0:-1])
|
||||
|
||||
app = AppImage(**data, i18n=self.i18n)
|
||||
|
||||
file_path = util.find_appimage_file(app.install_dir)
|
||||
|
||||
if file_path:
|
||||
self.create_symlink(app, file_path, self.logger)
|
||||
data['symlink'] = app.symlink
|
||||
|
||||
# caching
|
||||
try:
|
||||
with open(json_file, 'w+') as f:
|
||||
f.write(json.dumps(data))
|
||||
except Exception:
|
||||
self.logger.warning("Could not update cached data on '{}'".format(json_file))
|
||||
traceback.print_exc()
|
||||
|
||||
else:
|
||||
self.logger.warning("No AppImage file found on installation dir '{}'".format(file_path))
|
||||
|
||||
total_progress += progress_per_file
|
||||
self.taskman.update_progress(self.task_id, total_progress, '')
|
||||
|
||||
self.taskman.update_progress(self.task_id, 100, '')
|
||||
self.taskman.finish_task(self.task_id)
|
||||
return
|
||||
|
||||
self.logger.info("No AppImage applications found. Aborting")
|
||||
self.taskman.update_progress(self.task_id, 100, '')
|
||||
self.taskman.finish_task(self.task_id)
|
||||
|
||||
|
||||
class AppImageSuggestionsDownloader(Thread):
|
||||
|
||||
def __init__(self, logger: logging.Logger, http_client: HttpClient, i18n: I18n, file_url: Optional[str],
|
||||
create_config: Optional[CreateConfigFile] = None, appimage_config: Optional[dict] = None,
|
||||
taskman: Optional[TaskManager] = None):
|
||||
super(AppImageSuggestionsDownloader, self).__init__(daemon=True)
|
||||
self.create_config = create_config
|
||||
self.logger = logger
|
||||
self.i18n = i18n
|
||||
self.http_client = http_client
|
||||
self.taskman = taskman
|
||||
self.config = appimage_config
|
||||
self.task_id = 'appim.suggestions'
|
||||
self._cached_file_path: Optional[str] = None
|
||||
self._cached_ts_file_path: Optional[str] = None
|
||||
|
||||
if file_url:
|
||||
self._file_url = file_url
|
||||
else:
|
||||
self._file_url = f'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/suggestions.txt'
|
||||
|
||||
@property
|
||||
def cached_file_path(self) -> str:
|
||||
if not self._cached_file_path:
|
||||
self._cached_file_path = f'{APPIMAGE_CACHE_DIR}/suggestions.txt'
|
||||
|
||||
return self._cached_file_path
|
||||
|
||||
@property
|
||||
def cached_ts_file_path(self) -> str:
|
||||
if not self._cached_ts_file_path:
|
||||
self._cached_ts_file_path = f'{APPIMAGE_CACHE_DIR}/suggestions.ts'
|
||||
|
||||
return self._cached_ts_file_path
|
||||
|
||||
def register_task(self):
|
||||
self.taskman.register_task(id_=self.task_id,
|
||||
label=self.i18n['task.download_suggestions'], icon_path=get_icon_path())
|
||||
|
||||
def is_custom_local_file_mapped(self) -> bool:
|
||||
return self._file_url and self._file_url.startswith('/')
|
||||
|
||||
def should_download(self, appimage_config: dict) -> bool:
|
||||
if not self._file_url:
|
||||
self.logger.error("No AppImage suggestions file URL defined")
|
||||
return False
|
||||
|
||||
if self.is_custom_local_file_mapped():
|
||||
return False
|
||||
|
||||
try:
|
||||
exp_hours = int(appimage_config['suggestions']['expiration'])
|
||||
except Exception:
|
||||
self.logger.error("An exception happened while trying to parse the AppImage 'suggestions.expiration'")
|
||||
traceback.print_exc()
|
||||
return True
|
||||
|
||||
if exp_hours <= 0:
|
||||
self.logger.info("The AppImage suggestions cache is disabled")
|
||||
return True
|
||||
|
||||
if not os.path.exists(self.cached_file_path):
|
||||
self.logger.info(f"File {self.cached_file_path} not found. It must be downloaded")
|
||||
return True
|
||||
|
||||
if not os.path.exists(self.cached_ts_file_path):
|
||||
self.logger.info(f"File {self.cached_ts_file_path} not found. The suggestions file must be downloaded.")
|
||||
return True
|
||||
|
||||
with open(self.cached_ts_file_path) as f:
|
||||
timestamp_str = f.read()
|
||||
|
||||
try:
|
||||
suggestions_timestamp = datetime.fromtimestamp(float(timestamp_str), tz=timezone.utc)
|
||||
except Exception:
|
||||
self.logger.error(f'Could not parse the cached AppImage suggestions timestamp: {timestamp_str}')
|
||||
traceback.print_exc()
|
||||
return True
|
||||
|
||||
update = suggestions_timestamp + timedelta(hours=exp_hours) <= datetime.now(timezone.utc)
|
||||
return update
|
||||
|
||||
def read(self) -> Generator[str, None, None]:
|
||||
if not self._file_url:
|
||||
self.logger.error("No AppImage suggestions file URL defined")
|
||||
yield from ()
|
||||
|
||||
self.logger.info("Checking if AppImage suggestions should be downloaded")
|
||||
if self.should_download(self.config):
|
||||
suggestions_timestamp = datetime.now(timezone.utc).timestamp()
|
||||
suggestions_str = self.download()
|
||||
|
||||
Thread(target=self.cache_suggestions, args=(suggestions_str, suggestions_timestamp), daemon=True).start()
|
||||
else:
|
||||
if self.is_custom_local_file_mapped():
|
||||
file_path, log_ref = self._file_url, 'local'
|
||||
else:
|
||||
file_path, log_ref = self.cached_file_path, 'cached'
|
||||
|
||||
self.logger.info(f"Reading {log_ref} AppImage suggestions from {file_path}")
|
||||
with open(file_path) as f:
|
||||
suggestions_str = f.read()
|
||||
|
||||
yield from self.map_suggestions(suggestions_str) if suggestions_str else ()
|
||||
|
||||
def cache_suggestions(self, text: str, timestamp: float):
|
||||
self.logger.info(f"Caching AppImage suggestions to {self.cached_file_path}")
|
||||
|
||||
cache_dir = os.path.dirname(self.cached_file_path)
|
||||
|
||||
try:
|
||||
Path(cache_dir).mkdir(parents=True, exist_ok=True)
|
||||
cache_dir_ok = True
|
||||
except OSError:
|
||||
self.logger.error(f"Could not create the caching directory {cache_dir}")
|
||||
traceback.print_exc()
|
||||
cache_dir_ok = False
|
||||
|
||||
if cache_dir_ok:
|
||||
try:
|
||||
with open(self.cached_file_path, 'w+') as f:
|
||||
f.write(text)
|
||||
except Exception:
|
||||
self.logger.error(f"An exception happened while writing AppImage suggestions to {self.cached_file_path}")
|
||||
traceback.print_exc()
|
||||
|
||||
try:
|
||||
with open(self.cached_ts_file_path, 'w+') as f:
|
||||
f.write(str(timestamp))
|
||||
except Exception:
|
||||
self.logger.error(f"An exception happened while writing the cached AppImage suggestions timestamp "
|
||||
f"to {self.cached_ts_file_path}")
|
||||
traceback.print_exc()
|
||||
|
||||
def download(self) -> Optional[str]:
|
||||
if not self._file_url:
|
||||
self.logger.error("No AppImage suggestions file URL defined")
|
||||
return
|
||||
|
||||
if self.is_custom_local_file_mapped():
|
||||
self.logger.warning("Local AppImage suggestions file mapped. Nothing will be downloaded")
|
||||
return
|
||||
|
||||
self.logger.info(f"Downloading AppImage suggestions from {self._file_url}")
|
||||
|
||||
try:
|
||||
res = self.http_client.get(self._file_url)
|
||||
except requests.exceptions.ConnectionError:
|
||||
self.logger.warning(f"Could not download suggestion from {self._file_url}")
|
||||
return
|
||||
|
||||
if not res:
|
||||
self.logger.warning(f"Could not download suggestion from {self._file_url}")
|
||||
return
|
||||
|
||||
if not res.text:
|
||||
self.logger.warning(f"No AppImage suggestion found in {self._file_url}")
|
||||
return
|
||||
|
||||
return res.text
|
||||
|
||||
def map_suggestions(self, text: str) -> Generator[str, None, None]:
|
||||
return (line for line in text.split('\n') if line)
|
||||
|
||||
def run(self):
|
||||
ti = time.time()
|
||||
|
||||
if not self.is_custom_local_file_mapped():
|
||||
if self.create_config:
|
||||
wait_msg = self.i18n['task.waiting_task'].format(bold(self.create_config.task_name))
|
||||
self.taskman.update_progress(self.task_id, 0, wait_msg)
|
||||
self.create_config.join()
|
||||
self.config = self.create_config.config
|
||||
|
||||
ti = time.time()
|
||||
self.taskman.update_progress(self.task_id, 1, None)
|
||||
|
||||
self.logger.info("Checking if AppImage suggestions should be downloaded")
|
||||
should_download = self.should_download(self.config)
|
||||
self.taskman.update_progress(self.task_id, 30, None)
|
||||
|
||||
try:
|
||||
if should_download:
|
||||
suggestions_timestamp = datetime.now(timezone.utc).timestamp()
|
||||
suggestions_str = self.download()
|
||||
self.taskman.update_progress(self.task_id, 70, None)
|
||||
|
||||
if suggestions_str:
|
||||
self.cache_suggestions(suggestions_str, suggestions_timestamp)
|
||||
else:
|
||||
self.logger.info("Cached AppImage suggestions are up-to-date")
|
||||
except Exception:
|
||||
self.logger.error("An unexpected exception happened while downloading AppImage suggestions")
|
||||
traceback.print_exc()
|
||||
|
||||
self.taskman.update_progress(self.task_id, 100, None)
|
||||
self.taskman.finish_task(self.task_id)
|
||||
tf = time.time()
|
||||
self.logger.info(f"Took {tf - ti:.9f} seconds to download suggestions")
|
||||
Reference in New Issue
Block a user