Compare commits

..

1 Commits

Author SHA1 Message Date
Chubby Granny Chaser
fc4043c2c4 Update scripts/postinstall.cjs
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2025-04-09 08:01:03 +01:00
72 changed files with 468 additions and 1006 deletions

View File

@@ -11,7 +11,6 @@ jobs:
strategy: strategy:
matrix: matrix:
os: [windows-latest, ubuntu-latest] os: [windows-latest, ubuntu-latest]
fail-fast: false
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
@@ -25,7 +24,7 @@ jobs:
node-version: 20.18.0 node-version: 20.18.0
- name: Install dependencies - name: Install dependencies
run: yarn --frozen-lockfile run: yarn
- name: Install Python - name: Install Python
uses: actions/setup-python@v5 uses: actions/setup-python@v5

View File

@@ -20,7 +20,7 @@ jobs:
node-version: 20.18.0 node-version: 20.18.0
- name: Install dependencies - name: Install dependencies
run: yarn --frozen-lockfile run: yarn
- name: Validate current commit (last commit) with commitlint - name: Validate current commit (last commit) with commitlint
run: npx commitlint --last --verbose run: npx commitlint --last --verbose

View File

@@ -26,7 +26,7 @@ jobs:
node-version: 20.18.0 node-version: 20.18.0
- name: Install dependencies - name: Install dependencies
run: yarn --frozen-lockfile run: yarn
- name: Install Python - name: Install Python
uses: actions/setup-python@v5 uses: actions/setup-python@v5

3
.gitignore vendored
View File

@@ -9,11 +9,10 @@ out
.vite .vite
ludusavi/ ludusavi/
hydra-python-rpc/ hydra-python-rpc/
aria2/
.python-version .python-version
# Sentry Config File # Sentry Config File
.env.sentry-build-plugin .env.sentry-build-plugin
*storybook.log *storybook.log
aria2/

View File

@@ -25,8 +25,7 @@
[![cs](https://img.shields.io/badge/lang-cs-purple)](./docs/README.cs.md) [![cs](https://img.shields.io/badge/lang-cs-purple)](./docs/README.cs.md)
[![da](https://img.shields.io/badge/lang-da-red)](./docs/README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](./docs/README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](./docs/README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](./docs/README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](./docs/README.et.md) [![ee](https://img.shields.io/badge/lang-et-blue.svg)](./docs/README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](./docs/README.tr.md)
![Hydra Catalogue](./docs/screenshot.png) ![Hydra Catalogue](./docs/screenshot.png)

0
binaries/7zz Executable file → Normal file
View File

0
binaries/7zzs Executable file → Normal file
View File

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](screenshot.png) ![Hydra Catalogue](screenshot.png)

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Katalog](screenshot.png) ![Hydra Katalog](screenshot.png)

View File

@@ -25,7 +25,6 @@
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md) [![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](screenshot.png) ![Hydra Catalogue](screenshot.png)

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Katalog](screenshot.png) ![Hydra Katalog](screenshot.png)

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](screenshot.png) ![Hydra Catalogue](screenshot.png)

View File

@@ -23,8 +23,7 @@
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md) [![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![ee](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Kataloog](screenshot.png) ![Hydra Kataloog](screenshot.png)

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Catalogue Hydra](screenshot.png) ![Catalogue Hydra](screenshot.png)

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](./screenshot.png) ![Hydra Catalogue](./screenshot.png)

View File

@@ -25,7 +25,6 @@
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md) [![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](screenshot.png) ![Hydra Catalogue](screenshot.png)

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](./screenshot.png) ![Hydra Catalogue](./screenshot.png)

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](./screenshot.png) ![Hydra Catalogue](./screenshot.png)

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](./screenshot.png) ![Hydra Catalogue](./screenshot.png)

View File

@@ -1,194 +0,0 @@
<br>
<div align="center">
[<img src="../resources/icon.png" width="144"/>](https://help.hydralauncher.gg)
<h1 align="center">Hydra Launcher</h1>
<p align="center">
<strong>Hydra, kendi gömülü BitTorrent istemcisine sahip bir oyun başlatıcısıdır.</strong>
</p>
[![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions)
[![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases)
[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md)
[![en](https://img.shields.io/badge/lang-en-red.svg)](../README.md)
[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md)
[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md)
[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md)
[![es](https://img.shields.io/badge/lang-es-red)](README.es.md)
[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md)
[![de](https://img.shields.io/badge/lang-de-black)](README.de.md)
[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md)
[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md)
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](screenshot.png)
</div>
## <a name="içindekiler"></a> İçindekiler
- [İçindekiler](#içindekiler)
- [Hakkında](#hakkında)
- [Özellikler](#özellikler)
- [Kurulum](#kurulum)
- [Katkıda bulunma](#katkıda-bulunma)
- [Telegram grubumuza katılın](#telegram-katıl)
- [Repoyu forklayın ve klonlayın](#repo-fork-klon)
- [Katkıda bulunabileceğin yollar](#katkı-yolları)
- [Proje yapısı](#proje-yapısı)
- [Kaynak kodundan derleme](#kaynak-kodundan-derleme)
- [Node.js'i yükleme](#nodejs-yükle)
- [Yarn'ı yükleme](#yarn-yükle)
- [Node bağımlılıklarını yükleme](#node-bağımlılık-yükle)
- [OpenSSL 1.1'i yükleme](#openssl-1-1-yükle)
- [Python 3.9'u yükleme](#python-3-9-yükle)
- [Python bağımlılıklarını yükleme](#python-bağımlılık-yükle)
- [Ortam değişkenleri](#ortam-değişkenleri)
- [Çalıştırma](#çalıştırma)
- [Derleme](#derleme)
- [BitTorrent istemcisini derleme](#bittorrent-istemci-derle)
- [Electron uygulamasını derleme](#electron-uygulama-derle)
- [Katkıda bulunanlar](#katkıda-bulunanlar)
- [Lisans](#lisans)
## <a name="hakkında"></a> Hakkında
**Hydra**, kendi gömülü **BitTorrent istemci**sine sahip bir **oyun başlatıcısı**dır.
<br>
Başlatıcı, torrent sistemini libtorrent kullanarak yöneten Python ve TypeScript (Electron) ile yazılmıştır.
## <a name="özellikler"></a> Özellikler
- Kendi gömülü BitTorrent istemcisi
- Oyun sayfasında How Long To Beat (HLTB) entegrasyonu
- İndirme yolu özelleştirmesi
- Windows ve Linux desteği
- Sürekli güncelleme
- Ve daha fazlası...
## <a name="kurulum"></a> Kurulum
Aşağıdaki adımları izleyerek Hydra'yı kurun:
1. Hydra'nın en son sürümünü [Releases](https://github.com/hydralauncher/hydra/releases/latest) sayfasından indirin.
- Hydra'yı Windows'a kurmak istiyorsanız sadece .exe dosyasını indirin.
- Hydra'yı Linux'a kurmak istiyorsanız .deb, .rpm veya .zip dosyasını indirin (kullandığınız Linux dağıtımına bağlı olarak).
2. İndirilen dosyayı çalıştırın.
3. Hydra'nın keyfini çıkarın!
## <a name="katkıda-bulunma"></a> Katkıda Bulunma
### <a name="telegram-katıl"></a> Telegram grubumuza katılın
Tartışmalarımızı [Telegram](https://t.me/hydralauncher) kanalımız üzerinde yürütüyoruz.
### <a name="repo-fork-klon"></a> Repoyu forklayın ve klonlayın
1. Depoyu fork'layın [(şimdi forklamak için tıklayın)](https://github.com/hydralauncher/hydra/fork)
2. Forkladığınız kodu klonlayın `git clone https://github.com/kullanıcı_adınız/hydra`
3. Yeni bir branch oluşturun
4. Commitlerinizi gönderin (push)
5. Yeni bir Pull Request gönderin
### <a name="katkı-yolları"></a> Katkıda bulunabileceğin yollar
- Çeviri: Hydra'nın mümkün olduğunca fazla kişiye ulaşmasını istiyoruz. Yeni dillere çeviri yapmak ya da mevcut dillere güncelleme ve iyileştirme yapmak için yardımcı olmaktan çekinmeyin.
- Kod: Hydra, Typescript, Electron ve biraz Python ile inşa edilmiştir. Katkıda bulunmak isterseniz, [Telegram](https://t.me/hydralauncher) kanalımıza katılın!
### <a name="proje-yapısı"></a> Proje yapısı
- torrent-client: Torrent indirmelerini yönetmek için libtorrent adlı bir Python kütüphanesini kullanıyoruz.
- src/renderer: Uygulamanın kullanıcı arayüzü burada bulunur.
- src/main: Uygulamanın tüm işleyişi ve iş mantığı bu bölümde bulunur.
## <a name="kaynak-kodundan-derleme"></a> Kaynak kodundan derleme
### <a name="nodejs-yükle"></a> Node.js'i yükleme
Makinenizde Node.js'in yüklü olduğundan emin olun. Yüklü değilse, [nodejs.org](https://nodejs.org/) adresinden indirip kurun.
### <a name="yarn-yükle"></a> Yarn'ı yükleme
Yarn, Node.js için bir paket yöneticisidir. Eğer Yarn'ı henüz kurmadıysanız, [yarnpkg.com](https://classic.yarnpkg.com/lang/en/docs/install/) adresindeki talimatları izleyerek kurabilirsiniz.
### <a name="node-bağımlılık-yükle"></a> Node bağımlılıklarını yükleme
Proje dizinine gidin ve Yarn kullanarak Node bağımlılıklarını yükleyin:
```bash
cd hydra
yarn
```
### <a name="openssl-1-1-yükle"></a> OpenSSL 1.1'i yükleme
Windows ortamlarında libtorrent tarafından gerekli olan [OpenSSL 1.1](https://slproweb.com/download/Win64OpenSSL-1_1_1w.exe)'i indirip yükleyin.
### <a name="python-3-9-yükle"></a> Python 3.9'u yükleme
Makinenizde Python 3.9'un yüklü olduğundan emin olun. Bunu [python.org](https://www.python.org/downloads/release/python-3913/) adresinden indirip kurarak yapabilirsiniz.
### <a name="python-bağımlılık-yükle"></a> Python bağımlılıklarını yükleme
Gerekli Python bağımlılıklarını pip kullanarak yükleyin:
```bash
pip install -r requirements.txt
```
## <a name="ortam-değişkenleri"></a> Ortam değişkenleri
Oyun simgelerini yüklemek için bir SteamGridDB API Anahtarına ihtiyacınız olacak.
Bu anahtara sahip olduktan sonra, `.env.example` dosyasını kopyalayabilir veya adını `.env` olarak değiştirebilir ve `STEAMGRIDDB_API_KEY` değerini buraya ekleyebilirsiniz.
## <a name="çalıştırma"></a> Çalıştırma
Tüm ayarları tamamladıktan sonra, hem Electron sürecini hem de bittorrent istemcisini başlatmak için aşağıdaki komutu çalıştırabilirsiniz:
```bash
yarn dev
```
## <a name="derleme"></a> Derleme
### <a name="bittorrent-istemci-derle"></a> BitTorrent istemcisini derleme
Bittorrent istemcisini aşağıdaki komutla derleyin:
```bash
python torrent-client/setup.py build
```
### <a name="electron-uygulama-derle"></a> Electron uygulamasını derleme
Electron uygulamasını aşağıdaki komutlarla derleyebilirsiniz:
Windows'ta:
```bash
yarn build:win
```
Linux'ta:
```bash
yarn build:linux
```
## <a name="katkıda-bulunanlar"></a> Katkıda bulunanlar
<a href="https://github.com/hydralauncher/hydra/graphs/contributors">
<img src="https://contrib.rocks/image?repo=hydralauncher/hydra" />
</a>
## <a name="lisans"></a> Lisans
Hydra, [MIT Lisansı](https://github.com/hydralauncher/hydra/blob/main/LICENSE) altında lisanlanmıştır.

View File

@@ -26,7 +26,6 @@
[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md)
[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md)
[![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md) [![et](https://img.shields.io/badge/lang-et-blue.svg)](README.et.md)
[![tr](https://img.shields.io/badge/lang-tr-red.svg)](README.tr.md)
![Hydra Catalogue](screenshot.png) ![Hydra Catalogue](screenshot.png)

View File

@@ -1,6 +1,6 @@
{ {
"name": "hydralauncher", "name": "hydralauncher",
"version": "3.4.3", "version": "3.4.0",
"description": "Hydra", "description": "Hydra",
"main": "./out/main/index.js", "main": "./out/main/index.js",
"author": "Los Broxas", "author": "Los Broxas",
@@ -53,7 +53,7 @@
"dexie": "^4.0.10", "dexie": "^4.0.10",
"diskusage": "^1.2.0", "diskusage": "^1.2.0",
"electron-log": "^5.2.4", "electron-log": "^5.2.4",
"electron-updater": "^6.6.2", "electron-updater": "^6.3.9",
"file-type": "^19.6.0", "file-type": "^19.6.0",
"i18next": "^23.11.2", "i18next": "^23.11.2",
"i18next-browser-languagedetector": "^7.2.1", "i18next-browser-languagedetector": "^7.2.1",
@@ -100,7 +100,7 @@
"@types/user-agents": "^1.0.4", "@types/user-agents": "^1.0.4",
"@vitejs/plugin-react": "^4.2.1", "@vitejs/plugin-react": "^4.2.1",
"electron": "^31.7.7", "electron": "^31.7.7",
"electron-builder": "^26.0.12", "electron-builder": "^25.1.8",
"electron-vite": "^2.3.0", "electron-vite": "^2.3.0",
"eslint": "^8.56.0", "eslint": "^8.56.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",

View File

@@ -1,48 +1,61 @@
import aria2p import aria2p
class HttpDownloader: class HttpDownloader:
def __init__(self): def __init__(self):
self.download = None self.download = None
self.aria2 = aria2p.API( self.aria2 = aria2p.API(
aria2p.Client( aria2p.Client(
host="http://localhost", host="http://localhost",
port=6800, port=6800,
secret="" secret=""
) )
) )
def start_download(self, url: str, save_path: str, header: str, out: str = None): def start_download(self, url: str, save_path: str, header: str, out: str = None, allow_multiple_connections: bool = False):
if self.download: if self.download:
self.aria2.resume([self.download]) self.aria2.resume([self.download])
else: else:
downloads = self.aria2.add(url, options={"header": header, "dir": save_path, "out": out}) options = {
"header": header,
self.download = downloads[0] "dir": save_path,
"out": out
def pause_download(self): }
if self.download:
self.aria2.pause([self.download])
def cancel_download(self):
if self.download:
self.aria2.remove([self.download])
self.download = None
def get_download_status(self): if allow_multiple_connections:
if self.download == None: options.update({
return None "split": "16",
"max-connection-per-server": "16",
"min-split-size": "1M"
})
downloads = self.aria2.add(url, options=options)
self.download = downloads[0]
def pause_download(self):
if self.download:
self.aria2.pause([self.download])
def cancel_download(self):
if self.download:
self.aria2.remove([self.download])
self.download = None
download = self.aria2.get_download(self.download.gid) def get_download_status(self):
if self.download == None:
return None
response = { download = self.aria2.get_download(self.download.gid)
'folderName': download.name,
'fileSize': download.total_length,
'progress': download.completed_length / download.total_length if download.total_length else 0,
'downloadSpeed': download.download_speed,
'numPeers': 0,
'numSeeds': 0,
'status': download.status,
'bytesDownloaded': download.completed_length,
}
return response response = {
'folderName': download.name,
'fileSize': download.total_length,
'progress': download.completed_length / download.total_length if download.total_length else 0,
'downloadSpeed': download.download_speed,
'numPeers': 0,
'numSeeds': 0,
'status': download.status,
'bytesDownloaded': download.completed_length,
}
return response

View File

@@ -35,7 +35,7 @@ if start_download_payload:
http_downloader = HttpDownloader() http_downloader = HttpDownloader()
downloads[initial_download['game_id']] = http_downloader downloads[initial_download['game_id']] = http_downloader
try: try:
http_downloader.start_download(initial_download['url'], initial_download['save_path'], initial_download.get('header'), initial_download.get('out')) http_downloader.start_download(initial_download['url'], initial_download['save_path'], initial_download.get('header'), initial_download.get("out"))
except Exception as e: except Exception as e:
print("Error starting http download", e) print("Error starting http download", e)
@@ -147,11 +147,11 @@ def action():
torrent_downloader.start_download(url, data['save_path']) torrent_downloader.start_download(url, data['save_path'])
else: else:
if existing_downloader and isinstance(existing_downloader, HttpDownloader): if existing_downloader and isinstance(existing_downloader, HttpDownloader):
existing_downloader.start_download(url, data['save_path'], data.get('header'), data.get('out')) existing_downloader.start_download(url, data['save_path'], data.get('header'), data.get('out'), data.get('allow_multiple_connections', False))
else: else:
http_downloader = HttpDownloader() http_downloader = HttpDownloader()
downloads[game_id] = http_downloader downloads[game_id] = http_downloader
http_downloader.start_download(url, data['save_path'], data.get('header'), data.get('out')) http_downloader.start_download(url, data['save_path'], data.get('header'), data.get('out'), data.get('allow_multiple_connections', False))
downloading_game_id = game_id downloading_game_id = game_id
@@ -182,3 +182,4 @@ def action():
if __name__ == "__main__": if __name__ == "__main__":
app.run(host="0.0.0.0", port=int(http_port)) app.run(host="0.0.0.0", port=int(http_port))

View File

@@ -123,3 +123,14 @@ const copyAria2 = () => {
copyAria2(); copyAria2();
downloadLudusavi(); downloadLudusavi();
if (process.platform !== "win32") {
const binariesPath = path.join(__dirname, "..", "binaries");
if (fs.existsSync(binariesPath)) {
const zzzPath = path.join(binariesPath, "7zz");
const zzzsPath = path.join(binariesPath, "7zzs");
if (fs.existsSync(zzzPath)) fs.chmodSync(zzzPath, 0o755);
if (fs.existsSync(zzzsPath)) fs.chmodSync(zzzsPath, 0o755);
}
}

View File

@@ -188,8 +188,8 @@
"reset_achievements_error": "فشل في إعادة تعيين الإنجازات", "reset_achievements_error": "فشل في إعادة تعيين الإنجازات",
"download_error_gofile_quota_exceeded": "لقد تجاوزت الحصة الشهرية لـ Gofile. يرجى الانتظار حتى إعادة تعيين الحصة.", "download_error_gofile_quota_exceeded": "لقد تجاوزت الحصة الشهرية لـ Gofile. يرجى الانتظار حتى إعادة تعيين الحصة.",
"download_error_real_debrid_account_not_authorized": "حساب Real-Debrid الخاص بك غير مصرح له بإجراء تنزيلات جديدة. يرجى مراجعة إعدادات الحساب والمحاولة مرة أخرى.", "download_error_real_debrid_account_not_authorized": "حساب Real-Debrid الخاص بك غير مصرح له بإجراء تنزيلات جديدة. يرجى مراجعة إعدادات الحساب والمحاولة مرة أخرى.",
"download_error_not_cached_on_real_debrid": "هذا التنزيل غير متوفر على Real-Debrid وجلب حالة التنزيل من Real-Debrid غير متاح حاليًا.", "download_error_not_cached_in_real_debrid": "هذا التنزيل غير متوفر على Real-Debrid وجلب حالة التنزيل من Real-Debrid غير متاح حاليًا.",
"download_error_not_cached_on_torbox": "هذا التنزيل غير متوفر على TorBox وجلب حالة التنزيل من TorBox غير متاح حاليًا.", "download_error_not_cached_in_torbox": "هذا التنزيل غير متوفر على Torbox وجلب حالة التنزيل من Torbox غير متاح حاليًا.",
"game_removed_from_favorites": "تمت إزالة اللعبة من المفضلة", "game_removed_from_favorites": "تمت إزالة اللعبة من المفضلة",
"game_added_to_favorites": "تمت إضافة اللعبة إلى المفضلة" "game_added_to_favorites": "تمت إضافة اللعبة إلى المفضلة"
}, },
@@ -330,7 +330,7 @@
"delete_theme_description": "سيؤدي هذا إلى حذف السمة {{theme}}", "delete_theme_description": "سيؤدي هذا إلى حذف السمة {{theme}}",
"cancel": "إلغاء", "cancel": "إلغاء",
"appearance": "المظهر", "appearance": "المظهر",
"enable_torbox": "تفعيل TorBox", "enable_torbox": "تفعيل Torbox",
"torbox_description": "TorBox هي خدمة seedbox متميزة تنافس أفضل الخوادم في السوق.", "torbox_description": "TorBox هي خدمة seedbox متميزة تنافس أفضل الخوادم في السوق.",
"torbox_account_linked": "تم ربط حساب TorBox", "torbox_account_linked": "تم ربط حساب TorBox",
"real_debrid_account_linked": "تم ربط حساب Real-Debrid", "real_debrid_account_linked": "تم ربط حساب Real-Debrid",

View File

@@ -44,21 +44,11 @@
"downloading_metadata": "Stahuji metadata: {{title}}…", "downloading_metadata": "Stahuji metadata: {{title}}…",
"downloading": "Stahuji {{title}}… ({{percentage}} staženo) - Odhadovaný čas {{eta}} - {{speed}}", "downloading": "Stahuji {{title}}… ({{percentage}} staženo) - Odhadovaný čas {{eta}} - {{speed}}",
"calculating_eta": "Stahuji {{title}}… ({{percentage}} staženo) - Počítám zbývající čas…", "calculating_eta": "Stahuji {{title}}… ({{percentage}} staženo) - Počítám zbývající čas…",
"checking_files": "Kontroluji soubory: {{title}}… ({{percentage}} ověřeno)", "checking_files": "Kontroluji soubory: {{title}}… ({{percentage}} ověřeno)"
"installing_common_redist": "{{log}}…",
"installation_complete": "Instalace dokončena",
"installation_complete_message": "Běžné redistribuovatelné komponenty byly úspěšně nainstalovány"
}, },
"catalogue": { "catalogue": {
"search": "Filtr…", "next_page": "Další strana",
"developers": "Vývojáři", "previous_page": "Předchozí strana"
"genres": "Žánry",
"tags": "Tagy",
"publishers": "Vydavatelé",
"download_sources": "Zdroje stahování",
"result_count": "Výsledky: {{resultCount}}",
"filter_count": "Dostupné: {{filterCount}}",
"clear_filters": "Vyčistit vybrané filtry: {{filterCount}}"
}, },
"game_details": { "game_details": {
"open_download_options": "Otevřít možnosti stahování", "open_download_options": "Otevřít možnosti stahování",
@@ -117,7 +107,6 @@
"open_download_location": "Zobrazit stažené soubory", "open_download_location": "Zobrazit stažené soubory",
"create_shortcut": "Vytvořit zástupce na ploše", "create_shortcut": "Vytvořit zástupce na ploše",
"remove_files": "Odebrat soubory", "remove_files": "Odebrat soubory",
"clear": "Vyčistit",
"remove_from_library_title": "Jste si jisti?", "remove_from_library_title": "Jste si jisti?",
"remove_from_library_description": "Tohle odstraní {{game}} z vaší knihovny", "remove_from_library_description": "Tohle odstraní {{game}} z vaší knihovny",
"options": "Možnosti", "options": "Možnosti",
@@ -171,9 +160,6 @@
"loading_save_preview": "Hledání uložených her...", "loading_save_preview": "Hledání uložených her...",
"wine_prefix": "Wine Prefix", "wine_prefix": "Wine Prefix",
"wine_prefix_description": "Wine Prefix použit pro spuštění této hry", "wine_prefix_description": "Wine Prefix použit pro spuštění této hry",
"launch_options": "Možnosti spuštění",
"launch_options_description": "Pokročilí uživatelé mohou zadat speciální parametry spuštění (experimentální funkce)",
"launch_options_placeholder": "Žádné parametery nebyly specifikovány",
"no_download_option_info": "Žádné informace nejsou dostupny", "no_download_option_info": "Žádné informace nejsou dostupny",
"backup_deletion_failed": "Nepovedlo se odstranit zálohu", "backup_deletion_failed": "Nepovedlo se odstranit zálohu",
"max_number_of_artifacts_reached": "Dosáhli jste maximálního počtu záloh pro tuto hru", "max_number_of_artifacts_reached": "Dosáhli jste maximálního počtu záloh pro tuto hru",
@@ -181,23 +167,7 @@
"manage_files_description": "Spravovat, které soubory budou zálohovány a obnoveny", "manage_files_description": "Spravovat, které soubory budou zálohovány a obnoveny",
"select_folder": "Vybrat složku", "select_folder": "Vybrat složku",
"backup_from": "Zálohy z {{date}}", "backup_from": "Zálohy z {{date}}",
"custom_backup_location_set": "Vlastní umístění záloh nastaveno", "custom_backup_location_set": "Vlastní umístění záloh nastaveno"
"automatic_backup_from": "Automatická záloha z {{date}}",
"enable_automatic_cloud_sync": "Povolit automatické zálohy v cloudu",
"no_directory_selected": "Žádná složka není zvolena",
"no_write_permission": "Nemohu stahovat do této složky. Klikni sem pro více informací.",
"reset_achievements": "Resetovat achievementy",
"reset_achievements_description": "Toto zresetuje všechny achievementy pro hru {{game}}",
"reset_achievements_title": "Jste si jisti?",
"reset_achievements_success": "Achievementy úspěšně resetovány",
"reset_achievements_error": "Nepodařilo se resetovat achievementy",
"download_error_gofile_quota_exceeded": "Překročili jste vaši měsíční GoFile kvótu. Prosím vyčkejte na resetování kvóty.",
"download_error_real_debrid_account_not_authorized": "Váš Real-Debrid účet není autorizován pro vytváření nových stahování. Prosím zkontrolujte nastavení vašeho účtu a zkuste to znovu.",
"download_error_not_cached_on_real_debrid": "Toto stahování není dostupné na Real-Debrid a získávání informací o stahování z Real-Debrid není zatím dostupné.",
"download_error_not_cached_on_torbox": "Toto stahování není dostupné na TorBox a získávání informací o stahování z TorBox není zatím dostupné.",
"game_removed_from_favorites": "Hra odebrána z oblíbených",
"game_added_to_favorites": "Hra přidána do oblíbených",
"automatically_extract_downloaded_files": "Automaticky rozbalit stažené soubory"
}, },
"activation": { "activation": {
"title": "Aktivovat hydru", "title": "Aktivovat hydru",
@@ -230,13 +200,7 @@
"queued": "V řadě", "queued": "V řadě",
"no_downloads_title": "Prázdno..", "no_downloads_title": "Prázdno..",
"no_downloads_description": "Ještě jsi zatím nic nestáhl přes Hydru, ale furt není pozdě začít.", "no_downloads_description": "Ještě jsi zatím nic nestáhl přes Hydru, ale furt není pozdě začít.",
"checking_files": "Kontroluji soubory…", "checking_files": "Kontroluji soubory…"
"seeding": "Seedování",
"stop_seeding": "Zastavování seedování",
"resume_seeding": "Obnovit seedování",
"options": "Spravovat",
"extract": "Rozbalit soubory",
"extracting": "Rozbalování souborů…"
}, },
"settings": { "settings": {
"downloads_path": "Umístění stahování", "downloads_path": "Umístění stahování",
@@ -297,65 +261,9 @@
"must_be_valid_url": "Zdroj musí být platký odkaz URL", "must_be_valid_url": "Zdroj musí být platký odkaz URL",
"blocked_users": "Zablokovaní uživatelé", "blocked_users": "Zablokovaní uživatelé",
"user_unblocked": "Uživatel byl odblokován", "user_unblocked": "Uživatel byl odblokován",
"enable_achievement_notifications": "Když je odemčen achievement", "enable_achievement_notifications": "Když je odemknut achievement",
"launch_minimized": "Spustit v minimalizovaném režimu", "launch_minimized": "Spustit v minimalizovaném režimu",
"disable_nsfw_alert": "Deaktivovat upozornění na nevhodný obsah", "disable_nsfw_alert": "Deaktivovat upozornění na nevhodný obsah"
"seed_after_download_complete": "Seedovat až skončí stahování",
"show_hidden_achievement_description": "Zobrazit popisy skrytých achievementů dříve, než jsou odemčeny",
"account": "Účet",
"no_users_blocked": "Nemáte žádného uživatele zablokovaného",
"subscription_active_until": "Vaše Hydra cloud předplatné je platné do {{date}}",
"manage_subscription": "Spravovat předplatné",
"update_email": "Změnit email",
"update_password": "Změnit heslo",
"current_email": "Současný email:",
"no_email_account": "Zatím nemáte nastavený email",
"account_data_updated_successfully": "Data vašeho účtu byly úspěšně upraveny",
"renew_subscription": "Obnovit předplatné Hydra Cloud",
"subscription_expired_at": "Vaše předplatné vypršelo {{date}}",
"no_subscription": "Užijte si Hydru v nejlepší možné podobě",
"become_subscriber": "Připojit se k předplatnému Hydra Cloud",
"subscription_renew_cancelled": "Automatické obnovování je zrušenu",
"subscription_renews_on": "Vaše předplatné se obnoví {{date}}",
"bill_sent_until": "Vaše příští faktura bude odeslána nejpozději do tohoto dne",
"no_themes": "Vypadá to že ještě nemáte žádné vzhledy, ale nebojte, klikněte sem pro vytvoření vašeho prvního mistrovského díla!",
"editor_tab_code": "Kód",
"editor_tab_info": "Info",
"editor_tab_save": "Uložit",
"web_store": "Webový obchod",
"clear_themes": "Vyčistit",
"create_theme": "Vytvořit",
"create_theme_modal_title": "Vytvořit vlastní vzhled",
"create_theme_modal_description": "Vytvořte si vlastní styl, abyste si mohli ozdobit Hydru",
"theme_name": "Název",
"insert_theme_name": "Vložte název vzhledu",
"set_theme": "Nastavit vzhled",
"unset_theme": "Zrušit vzhled",
"delete_theme": "Odstranit vzhled",
"edit_theme": "Upravit vzhled",
"delete_all_themes": "Smazat všechny vzhledy",
"delete_all_themes_description": "Toto smaže všechny vaše vzhledy",
"delete_theme_description": "Toto smaže vzhled {{theme}}",
"cancel": "Zrušit",
"appearance": "Vzhled",
"enable_torbox": "Povolit TorBox",
"torbox_description": "TorBox je prémiový seedbox server který se vyrovná i těm nejlepším seedbox serverům na trhu.",
"torbox_account_linked": "TorBox účet propojen",
"create_real_debrid_account": "Klikni sem pokud ještě nemáš Real-Debrid účet",
"create_torbox_account": "Klikni sem pokud ještě nemáš TorBox účet",
"real_debrid_account_linked": "Real-Debrid účet propojen",
"name_min_length": "Název vzhledu musí být minimálně 3 znaky dlouhý",
"import_theme": "Vložit vzhled",
"import_theme_description": "Chystáte se vložit vzhled {{theme}} z obchodu vzhledů",
"error_importing_theme": "Nastala chyba při vkládání vzhledu",
"theme_imported": "Vzhled úspěšně vložen",
"enable_friend_request_notifications": "Při obdržení žádosti o přátelství",
"enable_auto_install": "Automaticky stahovat aktualizace",
"common_redist": "Běžné redistribuovatelné komponenty",
"common_redist_description": "Běžné redistribuovatelné komponenty jsou potřeba pro spuštění určitých her. Je doporučeno je nainstalovat, aby se předešlo problémům.",
"install_common_redist": "Nainstalovat",
"installing_common_redist": "Instalování…",
"show_download_speed_in_megabytes": "Ukázat rychlost stahování v megabytech"
}, },
"notifications": { "notifications": {
"download_complete": "Stahování dokončeno", "download_complete": "Stahování dokončeno",
@@ -365,20 +273,14 @@
"repack_count_other": "{{count}} repacky přidány", "repack_count_other": "{{count}} repacky přidány",
"new_update_available": "Version {{version}} je dostupná", "new_update_available": "Version {{version}} je dostupná",
"restart_to_install_update": "Restartuj Hydru pro aktualizaci", "restart_to_install_update": "Restartuj Hydru pro aktualizaci",
"notification_achievement_unlocked_title": "Achievement pro {{game}} byl odemčen", "notification_achievement_unlocked_title": "Achievement pro {{game}} byl odemknut",
"notification_achievement_unlocked_body": "{{achievement}} a dalších {{count}} byly odemčeny", "notification_achievement_unlocked_body": "{{achievement}} a dalších {{count}} byly odemknuty"
"new_friend_request_description": "Obdrželi jste novou žádost o přátelství",
"new_friend_request_title": "Nová žádost o přátelství",
"extraction_complete": "Rozbalování dokončeno",
"game_extracted": "{{title}} úspěšně rozbaleno"
}, },
"system_tray": { "system_tray": {
"open": "Otevřít Hydru", "open": "Otevřít Hydru",
"quit": "Odejít" "quit": "Odejít"
}, },
"game_card": { "game_card": {
"available_one": "Dostupné",
"available_other": "Dostupné",
"no_downloads": "Žádné možnosti stahování nenalezeny" "no_downloads": "Žádné možnosti stahování nenalezeny"
}, },
"binary_not_found_modal": { "binary_not_found_modal": {
@@ -461,17 +363,7 @@
"your_friend_code": "Tvůj kód přítele:", "your_friend_code": "Tvůj kód přítele:",
"upload_banner": "Nahrát banner profilu", "upload_banner": "Nahrát banner profilu",
"uploading_banner": "Nahrávání banneru", "uploading_banner": "Nahrávání banneru",
"background_image_updated": "Obrázek pozadí byl změněn", "background_image_updated": "Obrázek pozadí byl změněn"
"stats": "Statistiky",
"achievements": "Achievementy",
"games": "Hry",
"top_percentile": "Top {{percentile}}%",
"ranking_updated_weekly": "Žebříčky jsou aktualizovány každý týden",
"playing": "Hraje {{game}}",
"achievements_unlocked": "Achievements odemčen",
"earned_points": "Získané body",
"show_achievements_on_profile": "Zobrazit vaše odemčené achievementy na profilu",
"show_points_on_profile": "Zobrazit vaše získané body na profilu"
}, },
"achievement": { "achievement": {
"achievement_unlocked": "Achievement odemčen", "achievement_unlocked": "Achievement odemčen",
@@ -481,12 +373,7 @@
"subscription_needed": "Je vyžadováno předplatné Hydra Cloud pro zobrazení tohoto obsahu", "subscription_needed": "Je vyžadováno předplatné Hydra Cloud pro zobrazení tohoto obsahu",
"new_achievements_unlocked": "Odemčeno {{achievementCount}} nových achievementů z {{gameCount}} her", "new_achievements_unlocked": "Odemčeno {{achievementCount}} nových achievementů z {{gameCount}} her",
"achievement_progress": "{{unlockedCount}}/{{totalCount}} achievementů", "achievement_progress": "{{unlockedCount}}/{{totalCount}} achievementů",
"achievements_unlocked_for_game": "Odemčeno {{achievementCount}} nových achievementů pro {{gameTitle}}", "achievements_unlocked_for_game": "Odemčeno {{achievementCount}} nových achievementů pro {{gameTitle}}"
"hidden_achievement_tooltip": "Toho je skrytý achievement",
"achievement_earn_points": "Získej {{points}} bodů tímto achievementem",
"earned_points": "Získané body",
"available_points": "Dostupné body:",
"how_to_earn_achievements_points": "Jak získat body achievementů?"
}, },
"hydra_cloud": { "hydra_cloud": {
"subscription_tour_title": "Předplatné Hydra Cloud", "subscription_tour_title": "Předplatné Hydra Cloud",
@@ -496,10 +383,6 @@
"animated_profile_picture": "Animované profilové obrázky", "animated_profile_picture": "Animované profilové obrázky",
"premium_support": "Prémiová podpora", "premium_support": "Prémiová podpora",
"show_and_compare_achievements": "Zobraz a porovnej achievementy s ostatními uživateli", "show_and_compare_achievements": "Zobraz a porovnej achievementy s ostatními uživateli",
"animated_profile_banner": "Animovaný banner na profilu", "animated_profile_banner": "Animovaný banner na profilu"
"hydra_cloud": "Hydra Cloud",
"hydra_cloud_feature_found": "Právě jste objevili funkci předplatného Hydra Cloud!",
"learn_more": "Zjistit více",
"debrid_description": "Stahovat až 4x rychleji s Nimbus"
} }
} }

View File

@@ -193,9 +193,8 @@
"reset_achievements_error": "Failed to reset achievements", "reset_achievements_error": "Failed to reset achievements",
"download_error_gofile_quota_exceeded": "You have exceeded your Gofile monthly quota. Please await the quota to reset.", "download_error_gofile_quota_exceeded": "You have exceeded your Gofile monthly quota. Please await the quota to reset.",
"download_error_real_debrid_account_not_authorized": "Your Real-Debrid account is not authorized to make new downloads. Please check your account settings and try again.", "download_error_real_debrid_account_not_authorized": "Your Real-Debrid account is not authorized to make new downloads. Please check your account settings and try again.",
"download_error_not_cached_on_real_debrid": "This download is not available on Real-Debrid and polling download status from Real-Debrid is not yet available.", "download_error_not_cached_in_real_debrid": "This download is not available on Real-Debrid and polling download status from Real-Debrid is not yet available.",
"download_error_not_cached_on_torbox": "This download is not available on TorBox and polling download status from TorBox is not yet available.", "download_error_not_cached_in_torbox": "This download is not available on Torbox and polling download status from Torbox is not yet available.",
"download_error_not_cached_on_hydra": "This download is not available on Nimbus.",
"game_removed_from_favorites": "Game removed from favorites", "game_removed_from_favorites": "Game removed from favorites",
"game_added_to_favorites": "Game added to favorites", "game_added_to_favorites": "Game added to favorites",
"automatically_extract_downloaded_files": "Automatically extract downloaded files" "automatically_extract_downloaded_files": "Automatically extract downloaded files"
@@ -339,7 +338,7 @@
"delete_theme_description": "This will delete the theme {{theme}}", "delete_theme_description": "This will delete the theme {{theme}}",
"cancel": "Cancel", "cancel": "Cancel",
"appearance": "Appearance", "appearance": "Appearance",
"enable_torbox": "Enable TorBox", "enable_torbox": "Enable Torbox",
"torbox_description": "TorBox is your premium seedbox service rivaling even the best servers on the market.", "torbox_description": "TorBox is your premium seedbox service rivaling even the best servers on the market.",
"torbox_account_linked": "TorBox account linked", "torbox_account_linked": "TorBox account linked",
"create_real_debrid_account": "Click here if you don't have a Real-Debrid account yet", "create_real_debrid_account": "Click here if you don't have a Real-Debrid account yet",
@@ -355,8 +354,7 @@
"common_redist": "Common redistributables", "common_redist": "Common redistributables",
"common_redist_description": "Common redistributables are required to run some games. Installing them is recommended to avoid issues.", "common_redist_description": "Common redistributables are required to run some games. Installing them is recommended to avoid issues.",
"install_common_redist": "Install", "install_common_redist": "Install",
"installing_common_redist": "Installing…", "installing_common_redist": "Installing…"
"show_download_speed_in_megabytes": "Show download speed in megabytes per second"
}, },
"notifications": { "notifications": {
"download_complete": "Download complete", "download_complete": "Download complete",
@@ -500,7 +498,6 @@
"animated_profile_banner": "Animated profile banner", "animated_profile_banner": "Animated profile banner",
"hydra_cloud": "Hydra Cloud", "hydra_cloud": "Hydra Cloud",
"hydra_cloud_feature_found": "You've just discovered a Hydra Cloud feature!", "hydra_cloud_feature_found": "You've just discovered a Hydra Cloud feature!",
"learn_more": "Learn More", "learn_more": "Learn More"
"debrid_description": "Download up to 4x faster with Nimbus"
} }
} }

View File

@@ -190,8 +190,8 @@
"reset_achievements_error": "Se produjo un error al reiniciar los logros", "reset_achievements_error": "Se produjo un error al reiniciar los logros",
"download_error_gofile_quota_exceeded": "Has excedido la cuota mensual de Gofile. Por favor espera a que se reinicie la cuota.", "download_error_gofile_quota_exceeded": "Has excedido la cuota mensual de Gofile. Por favor espera a que se reinicie la cuota.",
"download_error_real_debrid_account_not_authorized": "Tu cuenta de Real-Debrid no está autorizada para nueva descargas. Por favor, revisa los ajustes de tu cuenta e intenta de nuevo.", "download_error_real_debrid_account_not_authorized": "Tu cuenta de Real-Debrid no está autorizada para nueva descargas. Por favor, revisa los ajustes de tu cuenta e intenta de nuevo.",
"download_error_not_cached_on_real_debrid": "Esta descarga no está disponible en Real-Debrid y el estado de descarga del sondeo de Real-Debrid aún no está disponible.", "download_error_not_cached_in_real_debrid": "Esta descarga no está disponible en Real-Debrid y el estado de descarga del sondeo de Real-Debrid aún no está disponible.",
"download_error_not_cached_on_torbox": "Esta descarga no está disponible en TorBox y el estado de descarga del sondeo aún no está disponible.", "download_error_not_cached_in_torbox": "Esta descarga no está disponible en Torbox y el estado de descarga del sondeo aún no está disponible.",
"game_added_to_favorites": "Juego añadido a favoritos", "game_added_to_favorites": "Juego añadido a favoritos",
"game_removed_from_favorites": "Juego removido de favoritos" "game_removed_from_favorites": "Juego removido de favoritos"
}, },
@@ -326,7 +326,7 @@
"editor_tab_code": "Código", "editor_tab_code": "Código",
"editor_tab_info": "Info", "editor_tab_info": "Info",
"editor_tab_save": "Guardar", "editor_tab_save": "Guardar",
"enable_torbox": "Habilitar TorBox", "enable_torbox": "Habilitar Torbox",
"error_importing_theme": "Error al importar el tema", "error_importing_theme": "Error al importar el tema",
"import_theme": "Importar tema", "import_theme": "Importar tema",
"import_theme_description": "Vas a importar el tema {{theme}} desde la tienda de temas", "import_theme_description": "Vas a importar el tema {{theme}} desde la tienda de temas",

View File

@@ -182,9 +182,8 @@
"no_write_permission": "Não é possível baixar nesse diretório. Clique aqui para saber mais.", "no_write_permission": "Não é possível baixar nesse diretório. Clique aqui para saber mais.",
"download_error_gofile_quota_exceeded": "Você excedeu sua cota mensal do Gofile. Por favor, aguarde a cota resetar.", "download_error_gofile_quota_exceeded": "Você excedeu sua cota mensal do Gofile. Por favor, aguarde a cota resetar.",
"download_error_real_debrid_account_not_authorized": "Sua conta do Real-Debrid não está autorizada a fazer novos downloads. Por favor, verifique sua assinatura e tente novamente.", "download_error_real_debrid_account_not_authorized": "Sua conta do Real-Debrid não está autorizada a fazer novos downloads. Por favor, verifique sua assinatura e tente novamente.",
"download_error_not_cached_on_real_debrid": "Este download não está disponível no Real-Debrid e a verificação do status do download não está disponível.", "download_error_not_cached_in_real_debrid": "Este download não está disponível no Real-Debrid e a verificação do status do download não está disponível.",
"download_error_not_cached_on_torbox": "Este download não está disponível no TorBox e a verificação do status do download não está disponível.", "download_error_not_cached_in_torbox": "Este download não está disponível no Torbox e a verificação do status do download não está disponível.",
"download_error_not_cached_on_hydra": "Este download não está disponível no Nimbus.",
"game_removed_from_favorites": "Jogo removido dos favoritos", "game_removed_from_favorites": "Jogo removido dos favoritos",
"game_added_to_favorites": "Jogo adicionado aos favoritos", "game_added_to_favorites": "Jogo adicionado aos favoritos",
"automatically_extract_downloaded_files": "Extrair automaticamente os arquivos baixados" "automatically_extract_downloaded_files": "Extrair automaticamente os arquivos baixados"
@@ -326,7 +325,7 @@
"delete_theme_description": "Isso irá deletar o tema {{theme}}", "delete_theme_description": "Isso irá deletar o tema {{theme}}",
"cancel": "Cancelar", "cancel": "Cancelar",
"appearance": "Aparência", "appearance": "Aparência",
"enable_torbox": "Habilitar TorBox", "enable_torbox": "Habilitar Torbox",
"torbox_description": "TorBox é o seu serviço de seedbox premium que rivaliza até com os melhores servidores do mercado.", "torbox_description": "TorBox é o seu serviço de seedbox premium que rivaliza até com os melhores servidores do mercado.",
"torbox_account_linked": "Conta do TorBox vinculada", "torbox_account_linked": "Conta do TorBox vinculada",
"create_real_debrid_account": "Clique aqui se você ainda não tem uma conta do Real-Debrid", "create_real_debrid_account": "Clique aqui se você ainda não tem uma conta do Real-Debrid",
@@ -342,8 +341,7 @@
"common_redist": "Componentes recomendados", "common_redist": "Componentes recomendados",
"common_redist_description": "Componentes recomendados são necessários para executar alguns jogos. A instalação deles é recomendada para evitar problemas.", "common_redist_description": "Componentes recomendados são necessários para executar alguns jogos. A instalação deles é recomendada para evitar problemas.",
"install_common_redist": "Instalar", "install_common_redist": "Instalar",
"installing_common_redist": "Instalando…", "installing_common_redist": "Instalando…"
"show_download_speed_in_megabytes": "Exibir taxas de download em megabytes por segundo"
}, },
"notifications": { "notifications": {
"download_complete": "Download concluído", "download_complete": "Download concluído",
@@ -495,7 +493,6 @@
"animated_profile_banner": "Banner animado no perfil", "animated_profile_banner": "Banner animado no perfil",
"cloud_saving": "Saves de jogos em nuvem", "cloud_saving": "Saves de jogos em nuvem",
"hydra_cloud_feature_found": "Você descobriu uma funcionalidade Hydra Cloud!", "hydra_cloud_feature_found": "Você descobriu uma funcionalidade Hydra Cloud!",
"learn_more": "Saiba mais", "learn_more": "Saiba mais"
"debrid_description": "Baixe até 4x mais rápido com Nimbus"
} }
} }

View File

@@ -175,8 +175,8 @@
"no_write_permission": "Não é possível descarregar neste diretório. Clique aqui para saber mais.", "no_write_permission": "Não é possível descarregar neste diretório. Clique aqui para saber mais.",
"download_error_gofile_quota_exceeded": "Você excedeu sua cota mensal do Gofile. Por favor, aguarde o reset da cota.", "download_error_gofile_quota_exceeded": "Você excedeu sua cota mensal do Gofile. Por favor, aguarde o reset da cota.",
"download_error_real_debrid_account_not_authorized": "A sua conta do Real-Debrid não está autorizada a fazer novos downloads. Por favor, verifique a sua assinatura e tente novamente.", "download_error_real_debrid_account_not_authorized": "A sua conta do Real-Debrid não está autorizada a fazer novos downloads. Por favor, verifique a sua assinatura e tente novamente.",
"download_error_not_cached_on_real_debrid": "Este download não está disponível no Real-Debrid e a verificação do status do download não está disponível.", "download_error_not_cached_in_real_debrid": "Este download não está disponível no Real-Debrid e a verificação do status do download não está disponível.",
"download_error_not_cached_on_torbox": "Este download não está disponível no TorBox e a verificação do status do download não está disponível.", "download_error_not_cached_in_torbox": "Este download não está disponível no Torbox e a verificação do status do download não está disponível.",
"game_removed_from_favorites": "Jogo removido dos favoritos", "game_removed_from_favorites": "Jogo removido dos favoritos",
"game_added_to_favorites": "Jogo adicionado aos favoritos" "game_added_to_favorites": "Jogo adicionado aos favoritos"
}, },
@@ -321,7 +321,7 @@
"delete_theme_description": "Isto irá apagar o tema {{theme}}", "delete_theme_description": "Isto irá apagar o tema {{theme}}",
"cancel": "Cancelar", "cancel": "Cancelar",
"appearance": "Aparência", "appearance": "Aparência",
"enable_torbox": "Ativar TorBox", "enable_torbox": "Ativar Torbox",
"torbox_description": "TorBox é um serviço de seedbox premium sendo um dos melhores servidores do mercado.", "torbox_description": "TorBox é um serviço de seedbox premium sendo um dos melhores servidores do mercado.",
"torbox_account_linked": "Conta do TorBox associada", "torbox_account_linked": "Conta do TorBox associada",
"real_debrid_account_linked": "Conta Real-Debrid associada", "real_debrid_account_linked": "Conta Real-Debrid associada",

View File

@@ -44,10 +44,7 @@
"downloading_metadata": "Загрузка метаданных {{title}}…", "downloading_metadata": "Загрузка метаданных {{title}}…",
"downloading": "Загрузка {{title}}… ({{percentage}} завершено) - Окончание {{eta}} - {{speed}}", "downloading": "Загрузка {{title}}… ({{percentage}} завершено) - Окончание {{eta}} - {{speed}}",
"calculating_eta": "Загрузка {{title}}… ({{percentage}} завершено) - Подсчёт оставшегося времени…", "calculating_eta": "Загрузка {{title}}… ({{percentage}} завершено) - Подсчёт оставшегося времени…",
"checking_files": "Проверка файлов {{title}}… ({{percentage}} завершено)", "checking_files": "Проверка файлов {{title}}… ({{percentage}} завершено)"
"installing_common_redist": "{{log}}…",
"installation_complete": "Установка завершена",
"installation_complete_message": "Библиотеки успешно установлены"
}, },
"catalogue": { "catalogue": {
"search": "Фильтр…", "search": "Фильтр…",
@@ -193,11 +190,10 @@
"reset_achievements_error": "Не удалось сбросить достижения", "reset_achievements_error": "Не удалось сбросить достижения",
"download_error_gofile_quota_exceeded": "Вы превысили месячную квоту Gofile. Пожалуйста, подождите, пока квота не будет восстановлена.", "download_error_gofile_quota_exceeded": "Вы превысили месячную квоту Gofile. Пожалуйста, подождите, пока квота не будет восстановлена.",
"download_error_real_debrid_account_not_authorized": "Ваш аккаунт Real-Debrid не авторизован для осуществления новых загрузок. Пожалуйста, проверьте настройки учетной записи и повторите попытку.", "download_error_real_debrid_account_not_authorized": "Ваш аккаунт Real-Debrid не авторизован для осуществления новых загрузок. Пожалуйста, проверьте настройки учетной записи и повторите попытку.",
"download_error_not_cached_on_real_debrid": "Эта загрузка недоступна на Real-Debrid, и получение статуса загрузки с Real-Debrid пока недоступно.", "download_error_not_cached_in_real_debrid": "Эта загрузка недоступна на Real-Debrid, и получение статуса загрузки с Real-Debrid пока недоступно.",
"download_error_not_cached_on_torbox": "Эта загрузка недоступна на TorBox, и получить статус загрузки с TorBox пока невозможно.", "download_error_not_cached_in_torbox": "Эта загрузка недоступна на Torbox, и получить статус загрузки с Torbox пока невозможно.",
"game_added_to_favorites": "Игра добавлена в избранное", "game_added_to_favorites": "Игра добавлена в избранное",
"game_removed_from_favorites": "Игра удалена из избранного", "game_removed_from_favorites": "Игра удалена из избранного"
"automatically_extract_downloaded_files": "Автоматическая распаковка загруженных файлов"
}, },
"activation": { "activation": {
"title": "Активировать Hydra", "title": "Активировать Hydra",
@@ -234,9 +230,7 @@
"seeding": "Раздача", "seeding": "Раздача",
"stop_seeding": "Остановить раздачу", "stop_seeding": "Остановить раздачу",
"resume_seeding": "Продолжить раздачу", "resume_seeding": "Продолжить раздачу",
"options": "Управлять", "options": "Управлять"
"extract": "Распаковать файлы",
"extracting": "Распаковка файлов…"
}, },
"settings": { "settings": {
"downloads_path": "Путь загрузок", "downloads_path": "Путь загрузок",
@@ -338,7 +332,7 @@
"delete_theme_description": "Это приведет к удалению темы {{theme}}", "delete_theme_description": "Это приведет к удалению темы {{theme}}",
"cancel": "Отменить", "cancel": "Отменить",
"appearance": "Внешний вид", "appearance": "Внешний вид",
"enable_torbox": "Включить TorBox", "enable_torbox": "Включить Torbox",
"torbox_description": "TorBox - это ваш премиум-сервис, конкурирующий даже с лучшими серверами на рынке.", "torbox_description": "TorBox - это ваш премиум-сервис, конкурирующий даже с лучшими серверами на рынке.",
"torbox_account_linked": "Аккаунт TorBox привязан", "torbox_account_linked": "Аккаунт TorBox привязан",
"real_debrid_account_linked": "Аккаунт Real-Debrid привязан", "real_debrid_account_linked": "Аккаунт Real-Debrid привязан",
@@ -350,12 +344,7 @@
"error_importing_theme": "Ошибка при импорте темы", "error_importing_theme": "Ошибка при импорте темы",
"theme_imported": "Тема успешно импортирована", "theme_imported": "Тема успешно импортирована",
"enable_friend_request_notifications": "При получении запроса на добавление в друзья", "enable_friend_request_notifications": "При получении запроса на добавление в друзья",
"enable_auto_install": "Загружать обновления автоматически", "enable_auto_install": "Загружать обновления автоматически"
"common_redist": "Библиотеки",
"common_redist_description": "Для запуска некоторых игр требуются библиотеки. Во избежание проблем рекомендуется установить их.",
"install_common_redist": "Установить",
"installing_common_redist": "Установка…",
"show_download_speed_in_megabytes": "Показать скорость загрузки в мегабайтах в секунду"
}, },
"notifications": { "notifications": {
"download_complete": "Загрузка завершена", "download_complete": "Загрузка завершена",
@@ -368,9 +357,7 @@
"notification_achievement_unlocked_title": "Достижение разблокировано для {{game}}", "notification_achievement_unlocked_title": "Достижение разблокировано для {{game}}",
"notification_achievement_unlocked_body": "были разблокированы {{achievement}} и другие {{count}}", "notification_achievement_unlocked_body": "были разблокированы {{achievement}} и другие {{count}}",
"new_friend_request_title": "Новый запрос на добавление в друзья", "new_friend_request_title": "Новый запрос на добавление в друзья",
"new_friend_request_description": "Вы получили новый запрос на добавление в друзья", "new_friend_request_description": "Вы получили новый запрос на добавление в друзья"
"extraction_complete": "Распаковка завершена",
"game_extracted": "{{title}} успешно распакован"
}, },
"system_tray": { "system_tray": {
"open": "Открыть Hydra", "open": "Открыть Hydra",
@@ -499,7 +486,6 @@
"animated_profile_banner": "Анимированный баннер профиля", "animated_profile_banner": "Анимированный баннер профиля",
"hydra_cloud": "Hydra Cloud", "hydra_cloud": "Hydra Cloud",
"hydra_cloud_feature_found": "Вы только что открыли для себя функцию Hydra Cloud!", "hydra_cloud_feature_found": "Вы только что открыли для себя функцию Hydra Cloud!",
"learn_more": "Подробнее", "learn_more": "Подробнее"
"debrid_description": "Скачивайте в 4 раза быстрее с Nimbus"
} }
} }

View File

@@ -44,10 +44,7 @@
"downloading_metadata": "{{title}} meta verileri indiriliyor…", "downloading_metadata": "{{title}} meta verileri indiriliyor…",
"downloading": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Tamamlanma: {{eta}} - Hız: {{speed}}", "downloading": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Tamamlanma: {{eta}} - Hız: {{speed}}",
"calculating_eta": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Kalan süre hesaplanıyor…", "calculating_eta": "{{title}} indiriliyor… ({{percentage}} tamamlandı) - Kalan süre hesaplanıyor…",
"checking_files": "{{title}} dosyaları kontrol ediliyor… ({{percentage}} tamamlandı)", "checking_files": "{{title}} dosyaları kontrol ediliyor… ({{percentage}} tamamlandı)"
"installing_common_redist": "{{log}}…",
"installation_complete": "İndirme tamamlandı",
"installation_complete_message": "Genel bağımlılıklar başarıyla yüklendi."
}, },
"catalogue": { "catalogue": {
"search": "Filtrele…", "search": "Filtrele…",
@@ -193,11 +190,10 @@
"reset_achievements_error": "Başarımlar sıfırlanamadı", "reset_achievements_error": "Başarımlar sıfırlanamadı",
"download_error_gofile_quota_exceeded": "Gofile aylık kotanızı doldurdunuz. Kotanın yenilenmesini bekleyin.", "download_error_gofile_quota_exceeded": "Gofile aylık kotanızı doldurdunuz. Kotanın yenilenmesini bekleyin.",
"download_error_real_debrid_account_not_authorized": "Real-Debrid hesabınız yeni indirme işlemleri yapmak için yetkilendirilmemiş. Lütfen hesap ayarlarınızı kontrol edip tekrar deneyin.", "download_error_real_debrid_account_not_authorized": "Real-Debrid hesabınız yeni indirme işlemleri yapmak için yetkilendirilmemiş. Lütfen hesap ayarlarınızı kontrol edip tekrar deneyin.",
"download_error_not_cached_on_real_debrid": "Bu indirme Real-Debrid üzerinde mevcut değil ve Real-Debrid'den indirme durumu henüz sorgulanamıyor.", "download_error_not_cached_in_real_debrid": "Bu indirme Real-Debrid üzerinde mevcut değil ve Real-Debrid'den indirme durumu henüz sorgulanamıyor.",
"download_error_not_cached_on_torbox": "Bu indirme TorBox'ta mevcut değil ve TorBox'tan indirme durumu henüz sorgulanamıyor.", "download_error_not_cached_in_torbox": "Bu indirme Torbox'ta mevcut değil ve Torbox'tan indirme durumu henüz sorgulanamıyor.",
"game_removed_from_favorites": "Oyun favorilerden silindi", "game_removed_from_favorites": "Oyun favorilerden silindi",
"game_added_to_favorites": "Oyun favorilere eklendi", "game_added_to_favorites": "Oyun favorilere eklendi"
"automatically_extract_downloaded_files": "Yüklenmiş dosyaları otomatik olarak çıkart"
}, },
"activation": { "activation": {
"title": "Hydra'yı Aktive Et", "title": "Hydra'yı Aktive Et",
@@ -234,9 +230,7 @@
"seeding": "Paylaşılıyor", "seeding": "Paylaşılıyor",
"stop_seeding": "Paylaşımı durdur", "stop_seeding": "Paylaşımı durdur",
"resume_seeding": "Paylaşımı sürdür", "resume_seeding": "Paylaşımı sürdür",
"options": "Yönet", "options": "Yönet"
"extract": "Dosyaları çıkart",
"extracting": "Dosyalar çıkartılıyor…"
}, },
"settings": { "settings": {
"downloads_path": "İndirme yolu", "downloads_path": "İndirme yolu",
@@ -338,23 +332,15 @@
"delete_theme_description": "Bu {{theme}} temasını silecektir", "delete_theme_description": "Bu {{theme}} temasını silecektir",
"cancel": "İptal", "cancel": "İptal",
"appearance": "Görünüm", "appearance": "Görünüm",
"enable_torbox": "TorBox'u etkinleştir", "enable_torbox": "Torbox'u etkinleştir",
"torbox_description": "TorBox, piyasadaki en iyi sunucularla bile rekabet edebilen premium seedbox hizmetinizdir.", "torbox_description": "TorBox, piyasadaki en iyi sunucularla bile rekabet edebilen premium seedbox hizmetinizdir.",
"torbox_account_linked": "TorBox hesabı bağlandı", "torbox_account_linked": "TorBox hesabı bağlando",
"create_real_debrid_account": "Henüz bir Real-Debrid hesabınız yoksa buraya tıklayın", "real_debrid_account_linked": "Real-Debrid hesabı bağlando",
"create_torbox_account": "Henüz bir TorBox hesabınız yoksa buraya tıklayın",
"real_debrid_account_linked": "Real-Debrid hesabı bağlandı",
"name_min_length": "Tema ismi en az 3 karakter uzunluğunda olmalıdır", "name_min_length": "Tema ismi en az 3 karakter uzunluğunda olmalıdır",
"import_theme": "Temayı içe aktar", "import_theme": "Temayı içe aktar",
"import_theme_description": "{{theme}} teması, tema mağazasından içeri aktarılacak", "import_theme_description": "{{theme}} teması, tema mağazasından içeri aktarılacak",
"error_importing_theme": "Temayı içe aktarmada bir sorun oluştu", "error_importing_theme": "Temayı içe aktarmada bir sorun oluştu",
"theme_imported": "Tema başarıyla içe aktarıldı", "theme_imported": "Tema başarıyla içe aktarıldı"
"enable_friend_request_notifications": "Bir arkadaşlık isteği alındığında",
"enable_auto_install": "Güncellemeleri otomatik yükle",
"common_redist": "Ortak bağımlılıklar",
"common_redist_description": "Bazı oyunların çalışabilmesi için genel bağımlılıklar gereklidir. Sorun yaşamamak için bunların yüklenmesi önerilir.",
"install_common_redist": "Yükle",
"installing_common_redist": "Yükleniyor…"
}, },
"notifications": { "notifications": {
"download_complete": "İndirme tamamlandı", "download_complete": "İndirme tamamlandı",
@@ -365,11 +351,7 @@
"new_update_available": "{{version}} sürümü mevcut", "new_update_available": "{{version}} sürümü mevcut",
"restart_to_install_update": "Güncellemeyi yüklemek için Hydra'yı yeniden başlatın", "restart_to_install_update": "Güncellemeyi yüklemek için Hydra'yı yeniden başlatın",
"notification_achievement_unlocked_title": "{{game}} için başarım kilidi açıldı", "notification_achievement_unlocked_title": "{{game}} için başarım kilidi açıldı",
"notification_achievement_unlocked_body": "{{achievement}} ve diğer {{count}} başarım açıldı", "notification_achievement_unlocked_body": "{{achievement}} ve diğer {{count}} başarım açıldı"
"new_friend_request_description": "Yeni bir arkadaşlık isteğin var",
"new_friend_request_title": "Yeni arkadaşlık isteği",
"extraction_complete": ıkartma tamamlandı",
"game_extracted": "{{title}} başarıyla çıkartıldı"
}, },
"system_tray": { "system_tray": {
"open": "Hydra'yı Aç", "open": "Hydra'yı Aç",

View File

@@ -47,7 +47,6 @@ import "./torrenting/resume-game-download";
import "./torrenting/start-game-download"; import "./torrenting/start-game-download";
import "./torrenting/pause-game-seed"; import "./torrenting/pause-game-seed";
import "./torrenting/resume-game-seed"; import "./torrenting/resume-game-seed";
import "./torrenting/check-debrid-availability";
import "./user-preferences/get-user-preferences"; import "./user-preferences/get-user-preferences";
import "./user-preferences/update-user-preferences"; import "./user-preferences/update-user-preferences";
import "./user-preferences/auto-launch"; import "./user-preferences/auto-launch";

View File

@@ -13,42 +13,35 @@ const deleteGameFolder = async (
objectId: string objectId: string
): Promise<void> => { ): Promise<void> => {
const downloadKey = levelKeys.game(shop, objectId); const downloadKey = levelKeys.game(shop, objectId);
const download = await downloadsSublevel.get(downloadKey); const download = await downloadsSublevel.get(downloadKey);
if (!download?.folderName) return; if (!download) return;
const folderPath = path.join( if (download.folderName) {
download.downloadPath ?? (await getDownloadsPath()), const folderPath = path.join(
download.folderName download.downloadPath ?? (await getDownloadsPath()),
); download.folderName
);
const metaPath = `${folderPath}.meta`; if (fs.existsSync(folderPath)) {
const deleteFile = async (filePath: string, isDirectory = false) => {
if (fs.existsSync(filePath)) {
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
fs.rm( fs.rm(
filePath, folderPath,
{ { recursive: true, force: true, maxRetries: 5, retryDelay: 200 },
recursive: isDirectory,
force: true,
maxRetries: 5,
retryDelay: 200,
},
(error) => { (error) => {
if (error) { if (error) {
logger.error(error); logger.error(error);
reject(); reject();
} }
resolve(); resolve();
} }
); );
}); });
} }
}; }
await deleteFile(folderPath, true);
await deleteFile(metaPath);
await downloadsSublevel.del(downloadKey); await downloadsSublevel.del(downloadKey);
}; };

View File

@@ -1,11 +0,0 @@
import { HydraDebridClient } from "@main/services/download/hydra-debrid";
import { registerEvent } from "../register-event";
const checkDebridAvailability = async (
_event: Electron.IpcMainInvokeEvent,
magnets: string[]
) => {
return HydraDebridClient.getAvailableMagnets(magnets);
};
registerEvent("checkDebridAvailability", checkDebridAvailability);

View File

@@ -8,6 +8,7 @@ import { electronApp, optimizer } from "@electron-toolkit/utils";
import { logger, WindowManager } from "@main/services"; import { logger, WindowManager } from "@main/services";
import resources from "@locales"; import resources from "@locales";
import { PythonRPC } from "./services/python-rpc"; import { PythonRPC } from "./services/python-rpc";
import { Aria2 } from "./services/aria2";
import { db, levelKeys } from "./level"; import { db, levelKeys } from "./level";
import { loadState } from "./main"; import { loadState } from "./main";
@@ -142,6 +143,7 @@ app.on("window-all-closed", () => {
app.on("before-quit", () => { app.on("before-quit", () => {
/* Disconnects libtorrent */ /* Disconnects libtorrent */
PythonRPC.kill(); PythonRPC.kill();
Aria2.kill();
}); });
app.on("activate", () => { app.on("activate", () => {

View File

@@ -1,7 +1,8 @@
import { Aria2, DownloadManager, Ludusavi, startMainLoop } from "./services"; import { DownloadManager, Ludusavi, startMainLoop } from "./services";
import { RealDebridClient } from "./services/download/real-debrid"; import { RealDebridClient } from "./services/download/real-debrid";
import { HydraApi } from "./services/hydra-api"; import { HydraApi } from "./services/hydra-api";
import { uploadGamesBatch } from "./services/library-sync"; import { uploadGamesBatch } from "./services/library-sync";
import { Aria2 } from "./services/aria2";
import { downloadsSublevel } from "./level/sublevels/downloads"; import { downloadsSublevel } from "./level/sublevels/downloads";
import { sortBy } from "lodash-es"; import { sortBy } from "lodash-es";
import { Downloader } from "@shared"; import { Downloader } from "@shared";

View File

@@ -16,13 +16,6 @@ export const getGameAchievementData = async (
if (cachedAchievements && useCachedData) if (cachedAchievements && useCachedData)
return cachedAchievements.achievements; return cachedAchievements.achievements;
if (
cachedAchievements &&
Date.now() < (cachedAchievements.cacheExpiresTimestamp ?? 0)
) {
return cachedAchievements.achievements;
}
const language = await db const language = await db
.get<string, string>(levelKeys.language, { .get<string, string>(levelKeys.language, {
valueEncoding: "utf-8", valueEncoding: "utf-8",
@@ -38,7 +31,6 @@ export const getGameAchievementData = async (
await gameAchievementsSublevel.put(levelKeys.game(shop, objectId), { await gameAchievementsSublevel.put(levelKeys.game(shop, objectId), {
unlockedAchievements: cachedAchievements?.unlockedAchievements ?? [], unlockedAchievements: cachedAchievements?.unlockedAchievements ?? [],
achievements, achievements,
cacheExpiresTimestamp: Date.now() + 1000 * 60 * 30, // 30 minutes
}); });
return achievements; return achievements;

View File

@@ -2,7 +2,6 @@ import type {
Game, Game,
GameShop, GameShop,
UnlockedAchievement, UnlockedAchievement,
UpdatedUnlockedAchievements,
UserPreferences, UserPreferences,
} from "@types"; } from "@types";
import { WindowManager } from "../window-manager"; import { WindowManager } from "../window-manager";
@@ -27,7 +26,6 @@ const saveAchievementsOnLocal = async (
await gameAchievementsSublevel.put(levelKey, { await gameAchievementsSublevel.put(levelKey, {
achievements: gameAchievement?.achievements ?? [], achievements: gameAchievement?.achievements ?? [],
unlockedAchievements: unlockedAchievements, unlockedAchievements: unlockedAchievements,
cacheExpiresTimestamp: gameAchievement?.cacheExpiresTimestamp,
}); });
if (!sendUpdateEvent) return; if (!sendUpdateEvent) return;
@@ -116,7 +114,7 @@ export const mergeAchievements = async (
} }
if (game.remoteId) { if (game.remoteId) {
await HydraApi.put<UpdatedUnlockedAchievements | undefined>( await HydraApi.put(
"/profile/games/achievements", "/profile/games/achievements",
{ {
id: game.remoteId, id: game.remoteId,
@@ -125,19 +123,10 @@ export const mergeAchievements = async (
{ needsSubscription: !newAchievements.length } { needsSubscription: !newAchievements.length }
) )
.then((response) => { .then((response) => {
if (response) {
return saveAchievementsOnLocal(
response.objectId,
response.shop,
response.achievements,
publishNotification
);
}
return saveAchievementsOnLocal( return saveAchievementsOnLocal(
game.objectId, response.objectId,
game.shop, response.shop,
mergedLocalAchievements, response.achievements,
publishNotification publishNotification
); );
}) })

View File

@@ -4,14 +4,13 @@ import { app } from "electron";
export class Aria2 { export class Aria2 {
private static process: cp.ChildProcess | null = null; private static process: cp.ChildProcess | null = null;
private static readonly binaryPath = app.isPackaged
? path.join(process.resourcesPath, "aria2", "aria2c")
: path.join(__dirname, "..", "..", "aria2", "aria2c");
public static spawn() { public static spawn() {
const binaryPath = app.isPackaged
? path.join(process.resourcesPath, "aria2", "aria2c")
: path.join(__dirname, "..", "..", "aria2", "aria2c");
this.process = cp.spawn( this.process = cp.spawn(
binaryPath, this.binaryPath,
[ [
"--enable-rpc", "--enable-rpc",
"--rpc-listen-all", "--rpc-listen-all",

View File

@@ -23,7 +23,6 @@ import { db, downloadsSublevel, gamesSublevel, levelKeys } from "@main/level";
import { sortBy } from "lodash-es"; import { sortBy } from "lodash-es";
import { TorBoxClient } from "./torbox"; import { TorBoxClient } from "./torbox";
import { GameFilesManager } from "../game-files-manager"; import { GameFilesManager } from "../game-files-manager";
import { HydraDebridClient } from "./hydra-debrid";
export class DownloadManager { export class DownloadManager {
private static downloadingGameId: string | null = null; private static downloadingGameId: string | null = null;
@@ -314,8 +313,6 @@ export class DownloadManager {
url: downloadLink, url: downloadLink,
save_path: download.downloadPath, save_path: download.downloadPath,
header: `Cookie: accountToken=${token}`, header: `Cookie: accountToken=${token}`,
allow_multiple_connections: true,
connections_limit: 8,
}; };
} }
case Downloader.PixelDrain: { case Downloader.PixelDrain: {
@@ -367,7 +364,7 @@ export class DownloadManager {
case Downloader.RealDebrid: { case Downloader.RealDebrid: {
const downloadUrl = await RealDebridClient.getDownloadUrl(download.uri); const downloadUrl = await RealDebridClient.getDownloadUrl(download.uri);
if (!downloadUrl) throw new Error(DownloadError.NotCachedOnRealDebrid); if (!downloadUrl) throw new Error(DownloadError.NotCachedInRealDebrid);
return { return {
action: "start", action: "start",
@@ -390,21 +387,6 @@ export class DownloadManager {
allow_multiple_connections: true, allow_multiple_connections: true,
}; };
} }
case Downloader.Hydra: {
const downloadUrl = await HydraDebridClient.getDownloadUrl(
download.uri
);
if (!downloadUrl) throw new Error(DownloadError.NotCachedOnHydra);
return {
action: "start",
game_id: downloadId,
url: downloadUrl,
save_path: download.downloadPath,
allow_multiple_connections: true,
};
}
} }
} }

View File

@@ -1,27 +0,0 @@
import { HydraApi } from "../hydra-api";
export class HydraDebridClient {
public static getAvailableMagnets(
magnets: string[]
): Promise<Record<string, boolean>> {
return HydraApi.put(
"/debrid/check-availability",
{
magnets,
},
{ needsAuth: false }
);
}
public static async getDownloadUrl(magnet: string) {
try {
const response = await HydraApi.post("/debrid/request-file", {
magnet,
});
return response.downloadUrl;
} catch (error) {
return null;
}
}
}

View File

@@ -11,4 +11,3 @@ export * from "./cloud-sync";
export * from "./7zip"; export * from "./7zip";
export * from "./game-files-manager"; export * from "./game-files-manager";
export * from "./common-redist-manager"; export * from "./common-redist-manager";
export * from "./aria2";

View File

@@ -21,12 +21,6 @@ const binaryNameByPlatform: Partial<Record<NodeJS.Platform, string>> = {
win32: "hydra-python-rpc.exe", win32: "hydra-python-rpc.exe",
}; };
const rustBinaryNameByPlatform: Partial<Record<NodeJS.Platform, string>> = {
darwin: "hydra-httpdl",
linux: "hydra-httpdl",
win32: "hydra-httpdl.exe",
};
export class PythonRPC { export class PythonRPC {
public static readonly BITTORRENT_PORT = "5881"; public static readonly BITTORRENT_PORT = "5881";
public static readonly RPC_PORT = "8084"; public static readonly RPC_PORT = "8084";
@@ -58,20 +52,6 @@ export class PythonRPC {
this.RPC_PASSWORD, this.RPC_PASSWORD,
initialDownload ? JSON.stringify(initialDownload) : "", initialDownload ? JSON.stringify(initialDownload) : "",
initialSeeding ? JSON.stringify(initialSeeding) : "", initialSeeding ? JSON.stringify(initialSeeding) : "",
app.isPackaged
? path.join(
process.resourcesPath,
rustBinaryNameByPlatform[process.platform]!
)
: path.join(
__dirname,
"..",
"..",
"rust_rpc",
"target",
"debug",
rustBinaryNameByPlatform[process.platform]!
),
]; ];
if (app.isPackaged) { if (app.isPackaged) {

View File

@@ -55,8 +55,6 @@ contextBridge.exposeInMainWorld("electron", {
ipcRenderer.on("on-seeding-status", listener); ipcRenderer.on("on-seeding-status", listener);
return () => ipcRenderer.removeListener("on-seeding-status", listener); return () => ipcRenderer.removeListener("on-seeding-status", listener);
}, },
checkDebridAvailability: (magnets: string[]) =>
ipcRenderer.invoke("checkDebridAvailability", magnets),
/* Catalogue */ /* Catalogue */
searchGames: (payload: CatalogueSearchPayload, take: number, skip: number) => searchGames: (payload: CatalogueSearchPayload, take: number, skip: number) =>

View File

@@ -31,6 +31,7 @@ import { HydraCloudModal } from "./pages/shared-modals/hydra-cloud/hydra-cloud-m
import { injectCustomCss } from "./helpers"; import { injectCustomCss } from "./helpers";
import "./app.scss"; import "./app.scss";
import { DownloadSource } from "@types";
export interface AppProps { export interface AppProps {
children: React.ReactNode; children: React.ReactNode;
@@ -136,16 +137,71 @@ export function App() {
}); });
}, [fetchUserDetails, updateUserDetails, dispatch]); }, [fetchUserDetails, updateUserDetails, dispatch]);
const onSignIn = useCallback(() => { const syncDownloadSources = useCallback(async () => {
window.electron.getDownloadSources().then((sources) => { const downloadSources = await window.electron.getDownloadSources();
sources.forEach((source) => {
downloadSourcesWorker.postMessage([
"IMPORT_DOWNLOAD_SOURCE",
source.url,
]);
});
});
const existingDownloadSources: DownloadSource[] =
await downloadSourcesTable.toArray();
window.electron.createDownloadSources(
existingDownloadSources.map((source) => source.url)
);
await Promise.allSettled(
downloadSources.map(async (source) => {
return new Promise((resolve) => {
const existingDownloadSource = existingDownloadSources.find(
(downloadSource) => downloadSource.url === source.url
);
if (!existingDownloadSource) {
const channel = new BroadcastChannel(
`download_sources:import:${source.url}`
);
downloadSourcesWorker.postMessage([
"IMPORT_DOWNLOAD_SOURCE",
source.url,
]);
channel.onmessage = () => {
resolve(true);
channel.close();
};
} else {
resolve(true);
}
});
})
);
updateRepacks();
const id = crypto.randomUUID();
const channel = new BroadcastChannel(`download_sources:sync:${id}`);
channel.onmessage = async (event: MessageEvent<number>) => {
const newRepacksCount = event.data;
window.electron.publishNewRepacksNotification(newRepacksCount);
updateRepacks();
const downloadSources = await downloadSourcesTable.toArray();
downloadSources
.filter((source) => !source.fingerprint)
.forEach(async (downloadSource) => {
const { fingerprint } = await window.electron.putDownloadSource(
downloadSource.objectIds
);
downloadSourcesTable.update(downloadSource.id, { fingerprint });
});
};
downloadSourcesWorker.postMessage(["SYNC_DOWNLOAD_SOURCES", id]);
}, [updateRepacks]);
const onSignIn = useCallback(() => {
fetchUserDetails().then((response) => { fetchUserDetails().then((response) => {
if (response) { if (response) {
updateUserDetails(response); updateUserDetails(response);
@@ -153,7 +209,15 @@ export function App() {
showSuccessToast(t("successfully_signed_in")); showSuccessToast(t("successfully_signed_in"));
} }
}); });
}, [fetchUserDetails, t, showSuccessToast, updateUserDetails]);
syncDownloadSources();
}, [
fetchUserDetails,
t,
showSuccessToast,
updateUserDetails,
syncDownloadSources,
]);
useEffect(() => { useEffect(() => {
const unsubscribe = window.electron.onSyncFriendRequests((result) => { const unsubscribe = window.electron.onSyncFriendRequests((result) => {
@@ -221,41 +285,8 @@ export function App() {
}, [dispatch, draggingDisabled]); }, [dispatch, draggingDisabled]);
useEffect(() => { useEffect(() => {
updateRepacks(); syncDownloadSources();
}, [syncDownloadSources]);
const id = crypto.randomUUID();
const channel = new BroadcastChannel(`download_sources:sync:${id}`);
channel.onmessage = async (event: MessageEvent<number>) => {
const newRepacksCount = event.data;
window.electron.publishNewRepacksNotification(newRepacksCount);
updateRepacks();
const downloadSources = await downloadSourcesTable.toArray();
await Promise.all(
downloadSources
.filter((source) => !source.fingerprint)
.map(async (downloadSource) => {
const { fingerprint } = await window.electron.putDownloadSource(
downloadSource.objectIds
);
return downloadSourcesTable.update(downloadSource.id, {
fingerprint,
});
})
);
channel.close();
};
downloadSourcesWorker.postMessage(["SYNC_DOWNLOAD_SOURCES", id]);
return () => {
channel.close();
};
}, [updateRepacks]);
useEffect(() => { useEffect(() => {
const loadAndApplyTheme = async () => { const loadAndApplyTheme = async () => {

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,24 +0,0 @@
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Meteor">
<g id="Vector">
<path d="M10.6242 13.0003C10.6242 13.6184 10.4409 14.2226 10.0975 14.7365C9.75415 15.2504 9.26609 15.6509 8.69507 15.8875C8.12405 16.124 7.49572 16.1859 6.88953 16.0653C6.28334 15.9447 5.72652 15.6471 5.28948 15.2101C4.85244 14.773 4.55481 14.2162 4.43423 13.61C4.31366 13.0038 4.37554 12.3755 4.61206 11.8045C4.84859 11.2334 5.24913 10.7454 5.76303 10.402C6.27693 10.0586 6.88112 9.87535 7.49919 9.87535C8.32799 9.87535 9.12285 10.2046 9.7089 10.7906C10.2949 11.3767 10.6242 12.1715 10.6242 13.0003ZM16.432 10.0582L12.682 13.8082C12.5647 13.9254 12.4988 14.0845 12.4988 14.2503C12.4988 14.4162 12.5647 14.5753 12.682 14.6925C12.7993 14.8098 12.9583 14.8757 13.1242 14.8757C13.29 14.8757 13.4491 14.8098 13.5664 14.6925L17.3164 10.9425C17.3744 10.8845 17.4205 10.8155 17.4519 10.7397C17.4834 10.6638 17.4995 10.5825 17.4995 10.5003C17.4995 10.4182 17.4834 10.3369 17.4519 10.261C17.4205 10.1852 17.3744 10.1162 17.3164 10.0582C17.2583 10.0001 17.1894 9.95403 17.1135 9.9226C17.0376 9.89118 16.9563 9.875 16.8742 9.875C16.7921 9.875 16.7107 9.89118 16.6349 9.9226C16.559 9.95403 16.4901 10.0001 16.432 10.0582ZM14.8164 9.06754C14.8744 9.00947 14.9205 8.94053 14.9519 8.86466C14.9834 8.78879 14.9995 8.70747 14.9995 8.62535C14.9995 8.54323 14.9834 8.46191 14.9519 8.38604C14.9205 8.31017 14.8744 8.24123 14.8164 8.18316C14.7583 8.12509 14.6894 8.07903 14.6135 8.0476C14.5376 8.01617 14.4563 8 14.3742 8C14.2921 8 14.2107 8.01617 14.1349 8.0476C14.059 8.07903 13.9901 8.12509 13.932 8.18316L12.057 10.0582C11.9397 10.1754 11.8738 10.3345 11.8738 10.5003C11.8738 10.6662 11.9397 10.8253 12.057 10.9425C12.1743 11.0598 12.3333 11.1257 12.4992 11.1257C12.665 11.1257 12.8241 11.0598 12.9414 10.9425L14.8164 9.06754ZM17.9414 5.05816C17.8833 5.00005 17.8144 4.95395 17.7385 4.9225C17.6627 4.89105 17.5813 4.87486 17.4992 4.87486C17.4171 4.87486 17.3357 4.89105 17.2599 4.9225C17.184 4.95395 17.115 5.00005 17.057 5.05816L15.807 6.30816C15.6897 6.42544 15.6238 6.5845 15.6238 6.75035C15.6238 6.9162 15.6897 7.07526 15.807 7.19254C15.9243 7.30981 16.0833 7.37569 16.2492 7.3757C16.415 7.3757 16.5741 7.30981 16.6914 7.19254L17.9414 5.94254C17.9995 5.88449 18.0456 5.81556 18.077 5.73969C18.1085 5.66381 18.1247 5.58248 18.1247 5.50035C18.1247 5.41821 18.1085 5.33688 18.077 5.26101C18.0456 5.18514 17.9995 5.11621 17.9414 5.05816ZM9.557 8.44254C9.61505 8.50065 9.68398 8.54674 9.75985 8.5782C9.83572 8.60965 9.91705 8.62584 9.99919 8.62584C10.0813 8.62584 10.1627 8.60965 10.2385 8.5782C10.3144 8.54674 10.3833 8.50065 10.4414 8.44254L16.0664 2.81754C16.1244 2.75947 16.1705 2.69053 16.2019 2.61466C16.2334 2.53879 16.2495 2.45747 16.2495 2.37535C16.2495 2.29323 16.2334 2.21191 16.2019 2.13604C16.1705 2.06017 16.1244 1.99123 16.0664 1.93316C16.0083 1.87509 15.9394 1.82903 15.8635 1.7976C15.7876 1.76618 15.7063 1.75 15.6242 1.75C15.5421 1.75 15.4607 1.76618 15.3849 1.7976C15.309 1.82903 15.2401 1.87509 15.182 1.93316L9.557 7.55816C9.49889 7.61621 9.45279 7.68514 9.42134 7.76101C9.38989 7.83688 9.3737 7.91821 9.3737 8.00035C9.3737 8.08248 9.38989 8.16381 9.42134 8.23969C9.45279 8.31556 9.49889 8.38449 9.557 8.44254ZM10.5929 16.0941C9.77242 16.9146 8.65957 17.3756 7.49919 17.3756C6.33881 17.3756 5.22595 16.9146 4.40544 16.0941C3.58492 15.2736 3.12396 14.1607 3.12396 13.0003C3.12396 11.84 3.58492 10.7271 4.40544 9.9066L10.8703 3.44253C10.9284 3.38447 10.9744 3.31553 11.0058 3.23966C11.0373 3.16379 11.0534 3.08247 11.0534 3.00035C11.0534 2.91823 11.0373 2.83691 11.0058 2.76104C10.9744 2.68517 10.9284 2.61623 10.8703 2.55816C10.8122 2.50009 10.7433 2.45403 10.6674 2.4226C10.5915 2.39118 10.5102 2.375 10.4281 2.375C10.346 2.375 10.2647 2.39118 10.1888 2.4226C10.1129 2.45403 10.044 2.50009 9.98591 2.55816L3.52184 9.023C2.99253 9.54377 2.57156 10.1642 2.28322 10.8484C1.99488 11.5327 1.84487 12.2673 1.84184 13.0098C1.83882 13.7524 1.98284 14.4882 2.2656 15.1747C2.54836 15.8613 2.96427 16.4852 3.48932 17.0102C4.01438 17.5353 4.63819 17.9512 5.32479 18.2339C6.01138 18.5167 6.74717 18.6607 7.4897 18.6577C8.23223 18.6547 8.96682 18.5047 9.65109 18.2163C10.3354 17.928 10.9558 17.507 11.4765 16.9777C11.5888 16.8595 11.6505 16.7022 11.6484 16.5392C11.6463 16.3762 11.5806 16.2205 11.4654 16.1053C11.3501 15.99 11.1944 15.9243 11.0314 15.9223C10.8684 15.9202 10.7111 15.9818 10.5929 16.0941Z" fill="black"/>
<path d="M10.6242 13.0003C10.6242 13.6184 10.4409 14.2226 10.0975 14.7365C9.75415 15.2504 9.26609 15.6509 8.69507 15.8875C8.12405 16.124 7.49572 16.1859 6.88953 16.0653C6.28334 15.9447 5.72652 15.6471 5.28948 15.2101C4.85244 14.773 4.55481 14.2162 4.43423 13.61C4.31366 13.0038 4.37554 12.3755 4.61206 11.8045C4.84859 11.2334 5.24913 10.7454 5.76303 10.402C6.27693 10.0586 6.88112 9.87535 7.49919 9.87535C8.32799 9.87535 9.12285 10.2046 9.7089 10.7906C10.2949 11.3767 10.6242 12.1715 10.6242 13.0003ZM16.432 10.0582L12.682 13.8082C12.5647 13.9254 12.4988 14.0845 12.4988 14.2503C12.4988 14.4162 12.5647 14.5753 12.682 14.6925C12.7993 14.8098 12.9583 14.8757 13.1242 14.8757C13.29 14.8757 13.4491 14.8098 13.5664 14.6925L17.3164 10.9425C17.3744 10.8845 17.4205 10.8155 17.4519 10.7397C17.4834 10.6638 17.4995 10.5825 17.4995 10.5003C17.4995 10.4182 17.4834 10.3369 17.4519 10.261C17.4205 10.1852 17.3744 10.1162 17.3164 10.0582C17.2583 10.0001 17.1894 9.95403 17.1135 9.9226C17.0376 9.89118 16.9563 9.875 16.8742 9.875C16.7921 9.875 16.7107 9.89118 16.6349 9.9226C16.559 9.95403 16.4901 10.0001 16.432 10.0582ZM14.8164 9.06754C14.8744 9.00947 14.9205 8.94053 14.9519 8.86466C14.9834 8.78879 14.9995 8.70747 14.9995 8.62535C14.9995 8.54323 14.9834 8.46191 14.9519 8.38604C14.9205 8.31017 14.8744 8.24123 14.8164 8.18316C14.7583 8.12509 14.6894 8.07903 14.6135 8.0476C14.5376 8.01617 14.4563 8 14.3742 8C14.2921 8 14.2107 8.01617 14.1349 8.0476C14.059 8.07903 13.9901 8.12509 13.932 8.18316L12.057 10.0582C11.9397 10.1754 11.8738 10.3345 11.8738 10.5003C11.8738 10.6662 11.9397 10.8253 12.057 10.9425C12.1743 11.0598 12.3333 11.1257 12.4992 11.1257C12.665 11.1257 12.8241 11.0598 12.9414 10.9425L14.8164 9.06754ZM17.9414 5.05816C17.8833 5.00005 17.8144 4.95395 17.7385 4.9225C17.6627 4.89105 17.5813 4.87486 17.4992 4.87486C17.4171 4.87486 17.3357 4.89105 17.2599 4.9225C17.184 4.95395 17.115 5.00005 17.057 5.05816L15.807 6.30816C15.6897 6.42544 15.6238 6.5845 15.6238 6.75035C15.6238 6.9162 15.6897 7.07526 15.807 7.19254C15.9243 7.30981 16.0833 7.37569 16.2492 7.3757C16.415 7.3757 16.5741 7.30981 16.6914 7.19254L17.9414 5.94254C17.9995 5.88449 18.0456 5.81556 18.077 5.73969C18.1085 5.66381 18.1247 5.58248 18.1247 5.50035C18.1247 5.41821 18.1085 5.33688 18.077 5.26101C18.0456 5.18514 17.9995 5.11621 17.9414 5.05816ZM9.557 8.44254C9.61505 8.50065 9.68398 8.54674 9.75985 8.5782C9.83572 8.60965 9.91705 8.62584 9.99919 8.62584C10.0813 8.62584 10.1627 8.60965 10.2385 8.5782C10.3144 8.54674 10.3833 8.50065 10.4414 8.44254L16.0664 2.81754C16.1244 2.75947 16.1705 2.69053 16.2019 2.61466C16.2334 2.53879 16.2495 2.45747 16.2495 2.37535C16.2495 2.29323 16.2334 2.21191 16.2019 2.13604C16.1705 2.06017 16.1244 1.99123 16.0664 1.93316C16.0083 1.87509 15.9394 1.82903 15.8635 1.7976C15.7876 1.76618 15.7063 1.75 15.6242 1.75C15.5421 1.75 15.4607 1.76618 15.3849 1.7976C15.309 1.82903 15.2401 1.87509 15.182 1.93316L9.557 7.55816C9.49889 7.61621 9.45279 7.68514 9.42134 7.76101C9.38989 7.83688 9.3737 7.91821 9.3737 8.00035C9.3737 8.08248 9.38989 8.16381 9.42134 8.23969C9.45279 8.31556 9.49889 8.38449 9.557 8.44254ZM10.5929 16.0941C9.77242 16.9146 8.65957 17.3756 7.49919 17.3756C6.33881 17.3756 5.22595 16.9146 4.40544 16.0941C3.58492 15.2736 3.12396 14.1607 3.12396 13.0003C3.12396 11.84 3.58492 10.7271 4.40544 9.9066L10.8703 3.44253C10.9284 3.38447 10.9744 3.31553 11.0058 3.23966C11.0373 3.16379 11.0534 3.08247 11.0534 3.00035C11.0534 2.91823 11.0373 2.83691 11.0058 2.76104C10.9744 2.68517 10.9284 2.61623 10.8703 2.55816C10.8122 2.50009 10.7433 2.45403 10.6674 2.4226C10.5915 2.39118 10.5102 2.375 10.4281 2.375C10.346 2.375 10.2647 2.39118 10.1888 2.4226C10.1129 2.45403 10.044 2.50009 9.98591 2.55816L3.52184 9.023C2.99253 9.54377 2.57156 10.1642 2.28322 10.8484C1.99488 11.5327 1.84487 12.2673 1.84184 13.0098C1.83882 13.7524 1.98284 14.4882 2.2656 15.1747C2.54836 15.8613 2.96427 16.4852 3.48932 17.0102C4.01438 17.5353 4.63819 17.9512 5.32479 18.2339C6.01138 18.5167 6.74717 18.6607 7.4897 18.6577C8.23223 18.6547 8.96682 18.5047 9.65109 18.2163C10.3354 17.928 10.9558 17.507 11.4765 16.9777C11.5888 16.8595 11.6505 16.7022 11.6484 16.5392C11.6463 16.3762 11.5806 16.2205 11.4654 16.1053C11.3501 15.99 11.1944 15.9243 11.0314 15.9223C10.8684 15.9202 10.7111 15.9818 10.5929 16.0941Z" fill="url(#paint0_linear_2850_16638)"/>
<path d="M10.6242 13.0003C10.6242 13.6184 10.4409 14.2226 10.0975 14.7365C9.75415 15.2504 9.26609 15.6509 8.69507 15.8875C8.12405 16.124 7.49572 16.1859 6.88953 16.0653C6.28334 15.9447 5.72652 15.6471 5.28948 15.2101C4.85244 14.773 4.55481 14.2162 4.43423 13.61C4.31366 13.0038 4.37554 12.3755 4.61206 11.8045C4.84859 11.2334 5.24913 10.7454 5.76303 10.402C6.27693 10.0586 6.88112 9.87535 7.49919 9.87535C8.32799 9.87535 9.12285 10.2046 9.7089 10.7906C10.2949 11.3767 10.6242 12.1715 10.6242 13.0003ZM16.432 10.0582L12.682 13.8082C12.5647 13.9254 12.4988 14.0845 12.4988 14.2503C12.4988 14.4162 12.5647 14.5753 12.682 14.6925C12.7993 14.8098 12.9583 14.8757 13.1242 14.8757C13.29 14.8757 13.4491 14.8098 13.5664 14.6925L17.3164 10.9425C17.3744 10.8845 17.4205 10.8155 17.4519 10.7397C17.4834 10.6638 17.4995 10.5825 17.4995 10.5003C17.4995 10.4182 17.4834 10.3369 17.4519 10.261C17.4205 10.1852 17.3744 10.1162 17.3164 10.0582C17.2583 10.0001 17.1894 9.95403 17.1135 9.9226C17.0376 9.89118 16.9563 9.875 16.8742 9.875C16.7921 9.875 16.7107 9.89118 16.6349 9.9226C16.559 9.95403 16.4901 10.0001 16.432 10.0582ZM14.8164 9.06754C14.8744 9.00947 14.9205 8.94053 14.9519 8.86466C14.9834 8.78879 14.9995 8.70747 14.9995 8.62535C14.9995 8.54323 14.9834 8.46191 14.9519 8.38604C14.9205 8.31017 14.8744 8.24123 14.8164 8.18316C14.7583 8.12509 14.6894 8.07903 14.6135 8.0476C14.5376 8.01617 14.4563 8 14.3742 8C14.2921 8 14.2107 8.01617 14.1349 8.0476C14.059 8.07903 13.9901 8.12509 13.932 8.18316L12.057 10.0582C11.9397 10.1754 11.8738 10.3345 11.8738 10.5003C11.8738 10.6662 11.9397 10.8253 12.057 10.9425C12.1743 11.0598 12.3333 11.1257 12.4992 11.1257C12.665 11.1257 12.8241 11.0598 12.9414 10.9425L14.8164 9.06754ZM17.9414 5.05816C17.8833 5.00005 17.8144 4.95395 17.7385 4.9225C17.6627 4.89105 17.5813 4.87486 17.4992 4.87486C17.4171 4.87486 17.3357 4.89105 17.2599 4.9225C17.184 4.95395 17.115 5.00005 17.057 5.05816L15.807 6.30816C15.6897 6.42544 15.6238 6.5845 15.6238 6.75035C15.6238 6.9162 15.6897 7.07526 15.807 7.19254C15.9243 7.30981 16.0833 7.37569 16.2492 7.3757C16.415 7.3757 16.5741 7.30981 16.6914 7.19254L17.9414 5.94254C17.9995 5.88449 18.0456 5.81556 18.077 5.73969C18.1085 5.66381 18.1247 5.58248 18.1247 5.50035C18.1247 5.41821 18.1085 5.33688 18.077 5.26101C18.0456 5.18514 17.9995 5.11621 17.9414 5.05816ZM9.557 8.44254C9.61505 8.50065 9.68398 8.54674 9.75985 8.5782C9.83572 8.60965 9.91705 8.62584 9.99919 8.62584C10.0813 8.62584 10.1627 8.60965 10.2385 8.5782C10.3144 8.54674 10.3833 8.50065 10.4414 8.44254L16.0664 2.81754C16.1244 2.75947 16.1705 2.69053 16.2019 2.61466C16.2334 2.53879 16.2495 2.45747 16.2495 2.37535C16.2495 2.29323 16.2334 2.21191 16.2019 2.13604C16.1705 2.06017 16.1244 1.99123 16.0664 1.93316C16.0083 1.87509 15.9394 1.82903 15.8635 1.7976C15.7876 1.76618 15.7063 1.75 15.6242 1.75C15.5421 1.75 15.4607 1.76618 15.3849 1.7976C15.309 1.82903 15.2401 1.87509 15.182 1.93316L9.557 7.55816C9.49889 7.61621 9.45279 7.68514 9.42134 7.76101C9.38989 7.83688 9.3737 7.91821 9.3737 8.00035C9.3737 8.08248 9.38989 8.16381 9.42134 8.23969C9.45279 8.31556 9.49889 8.38449 9.557 8.44254ZM10.5929 16.0941C9.77242 16.9146 8.65957 17.3756 7.49919 17.3756C6.33881 17.3756 5.22595 16.9146 4.40544 16.0941C3.58492 15.2736 3.12396 14.1607 3.12396 13.0003C3.12396 11.84 3.58492 10.7271 4.40544 9.9066L10.8703 3.44253C10.9284 3.38447 10.9744 3.31553 11.0058 3.23966C11.0373 3.16379 11.0534 3.08247 11.0534 3.00035C11.0534 2.91823 11.0373 2.83691 11.0058 2.76104C10.9744 2.68517 10.9284 2.61623 10.8703 2.55816C10.8122 2.50009 10.7433 2.45403 10.6674 2.4226C10.5915 2.39118 10.5102 2.375 10.4281 2.375C10.346 2.375 10.2647 2.39118 10.1888 2.4226C10.1129 2.45403 10.044 2.50009 9.98591 2.55816L3.52184 9.023C2.99253 9.54377 2.57156 10.1642 2.28322 10.8484C1.99488 11.5327 1.84487 12.2673 1.84184 13.0098C1.83882 13.7524 1.98284 14.4882 2.2656 15.1747C2.54836 15.8613 2.96427 16.4852 3.48932 17.0102C4.01438 17.5353 4.63819 17.9512 5.32479 18.2339C6.01138 18.5167 6.74717 18.6607 7.4897 18.6577C8.23223 18.6547 8.96682 18.5047 9.65109 18.2163C10.3354 17.928 10.9558 17.507 11.4765 16.9777C11.5888 16.8595 11.6505 16.7022 11.6484 16.5392C11.6463 16.3762 11.5806 16.2205 11.4654 16.1053C11.3501 15.99 11.1944 15.9243 11.0314 15.9223C10.8684 15.9202 10.7111 15.9818 10.5929 16.0941Z" stroke="url(#paint1_linear_2850_16638)" stroke-width="0.3"/>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_2850_16638" x1="1.95109" y1="1.75" x2="21.5698" y2="11.5208" gradientUnits="userSpaceOnUse">
<stop stop-color="#0CF1CA"/>
<stop offset="0.264423" stop-color="#0BD2B0"/>
<stop offset="0.307692" stop-color="#0CF1CA"/>
<stop offset="0.427885" stop-color="#0CF1CA"/>
<stop offset="0.466346" stop-color="#0FAF94"/>
<stop offset="0.591346" stop-color="#0CA288"/>
<stop offset="1" stop-color="#086253"/>
</linearGradient>
<linearGradient id="paint1_linear_2850_16638" x1="1.8418" y1="2.25694" x2="21.3121" y2="11.25" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -1,11 +0,0 @@
.debrid-badge {
display: flex;
align-items: center;
gap: 8px;
border-radius: 4px;
border: 1px solid rgba(12, 241, 202, 0.3);
background: rgba(12, 241, 202, 0.05);
color: #0cf1ca;
padding: 4px 8px;
font-size: 12px;
}

View File

@@ -1,18 +0,0 @@
import Meteor from "@renderer/assets/meteor.svg?react";
import "./debrid-badge.scss";
import { useTranslation } from "react-i18next";
export interface DebridBadgeProps {
collapsed?: boolean;
}
export function DebridBadge({ collapsed }: Readonly<DebridBadgeProps>) {
const { t } = useTranslation("hydra_cloud");
return (
<div className="debrid-badge">
<Meteor />
{!collapsed && t("debrid_description")}
</div>
);
}

View File

@@ -14,4 +14,3 @@ export * from "./toast/toast";
export * from "./badge/badge"; export * from "./badge/badge";
export * from "./confirmation-modal/confirmation-modal"; export * from "./confirmation-modal/confirmation-modal";
export * from "./suspense-wrapper/suspense-wrapper"; export * from "./suspense-wrapper/suspense-wrapper";
export * from "./debrid-badge/debrid-badge";

View File

@@ -11,7 +11,6 @@ export const DOWNLOADER_NAME = {
[Downloader.Datanodes]: "Datanodes", [Downloader.Datanodes]: "Datanodes",
[Downloader.Mediafire]: "Mediafire", [Downloader.Mediafire]: "Mediafire",
[Downloader.TorBox]: "TorBox", [Downloader.TorBox]: "TorBox",
[Downloader.Hydra]: "Nimbus",
}; };
export const MAX_MINUTES_TO_SHOW_IN_PLAYTIME = 120; export const MAX_MINUTES_TO_SHOW_IN_PLAYTIME = 120;

View File

@@ -86,10 +86,7 @@ export function GameDetailsContextProvider({
const [showGameOptionsModal, setShowGameOptionsModal] = useState(false); const [showGameOptionsModal, setShowGameOptionsModal] = useState(false);
const { getRepacksForObjectId } = useRepacks(); const { getRepacksForObjectId } = useRepacks();
const repacks = getRepacksForObjectId(objectId);
const repacks = useMemo(() => {
return getRepacksForObjectId(objectId);
}, [getRepacksForObjectId, objectId]);
const { i18n } = useTranslation("game_details"); const { i18n } = useTranslation("game_details");

View File

@@ -59,9 +59,6 @@ declare global {
cb: (value: SeedingStatus[]) => void cb: (value: SeedingStatus[]) => void
) => () => Electron.IpcRenderer; ) => () => Electron.IpcRenderer;
onHardDelete: (cb: () => void) => () => Electron.IpcRenderer; onHardDelete: (cb: () => void) => () => Electron.IpcRenderer;
checkDebridAvailability: (
magnets: string[]
) => Promise<Record<string, boolean>>;
/* Catalogue */ /* Catalogue */
searchGames: ( searchGames: (

View File

@@ -10,6 +10,15 @@ export interface HowLongToBeatEntry {
updatedAt: Date; updatedAt: Date;
} }
export interface CatalogueCache {
id?: number;
category: string;
games: { objectId: string; shop: GameShop }[];
createdAt: Date;
updatedAt: Date;
expiresAt: Date;
}
export const db = new Dexie("Hydra"); export const db = new Dexie("Hydra");
db.version(9).stores({ db.version(9).stores({

View File

@@ -15,14 +15,12 @@ import type {
StartGameDownloadPayload, StartGameDownloadPayload,
} from "@types"; } from "@types";
import { useDate } from "./use-date"; import { useDate } from "./use-date";
import { formatBytes, formatBytesToMbps } from "@shared"; import { formatBytes } from "@shared";
export function useDownload() { export function useDownload() {
const { updateLibrary } = useLibrary(); const { updateLibrary } = useLibrary();
const { formatDistance } = useDate(); const { formatDistance } = useDate();
const userPrefs = useAppSelector((state) => state.userPreferences.value);
const { lastPacket, gamesWithDeletionInProgress } = useAppSelector( const { lastPacket, gamesWithDeletionInProgress } = useAppSelector(
(state) => state.download (state) => state.download
); );
@@ -101,14 +99,8 @@ export function useDownload() {
return gamesWithDeletionInProgress.includes(objectId); return gamesWithDeletionInProgress.includes(objectId);
}; };
const formatDownloadSpeed = (downloadSpeed: number): string => {
return userPrefs?.showDownloadSpeedInMegabytes
? `${formatBytes(downloadSpeed)}/s`
: formatBytesToMbps(downloadSpeed);
};
return { return {
downloadSpeed: formatDownloadSpeed(lastPacket?.downloadSpeed ?? 0), downloadSpeed: `${formatBytes(lastPacket?.downloadSpeed ?? 0)}/s`,
progress: formatDownloadProgress(lastPacket?.progress ?? 0), progress: formatDownloadProgress(lastPacket?.progress ?? 0),
lastPacket, lastPacket,
eta: calculateETA(), eta: calculateETA(),

View File

@@ -1,10 +1,8 @@
import { useEffect, useState, useCallback } from "react"; import { useEffect, useState } from "react";
enum Feature { enum Feature {
CheckDownloadWritePermission = "CHECK_DOWNLOAD_WRITE_PERMISSION", CheckDownloadWritePermission = "CHECK_DOWNLOAD_WRITE_PERMISSION",
TorBox = "TORBOX", Torbox = "TORBOX",
Nimbus = "NIMBUS",
NimbusPreview = "NIMBUS_PREVIEW",
} }
export function useFeature() { export function useFeature() {
@@ -17,17 +15,14 @@ export function useFeature() {
}); });
}, []); }, []);
const isFeatureEnabled = useCallback( const isFeatureEnabled = (feature: Feature) => {
(feature: Feature) => { if (!features) {
if (!features) { const features = JSON.parse(localStorage.getItem("features") ?? "[]");
const features = JSON.parse(localStorage.getItem("features") ?? "[]");
return features.includes(feature);
}
return features.includes(feature); return features.includes(feature);
}, }
[features]
); return features.includes(feature);
};
return { return {
isFeatureEnabled, isFeatureEnabled,

View File

@@ -73,11 +73,8 @@
min-height: 140px; min-height: 140px;
max-height: 140px; max-height: 140px;
position: relative; position: relative;
&--hydra {
box-shadow: 0px 0px 16px 0px rgba(12, 241, 202, 0.15);
}
} }
&__cover { &__cover {
width: 280px; width: 280px;
min-width: 280px; min-width: 280px;
@@ -148,14 +145,4 @@
padding: 8px; padding: 8px;
min-height: unset; min-height: unset;
} }
&__hydra-gradient {
background: linear-gradient(90deg, #01483c 0%, #0cf1ca 50%, #01483c 100%);
box-shadow: 0px 0px 8px 0px rgba(12, 241, 202, 0.15);
width: 100%;
position: absolute;
bottom: 0;
height: 2px;
z-index: 1;
}
} }

View File

@@ -1,5 +1,4 @@
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import cn from "classnames";
import type { GameShop, LibraryGame, SeedingStatus } from "@types"; import type { GameShop, LibraryGame, SeedingStatus } from "@types";
@@ -33,6 +32,8 @@ import {
XCircleIcon, XCircleIcon,
} from "@primer/octicons-react"; } from "@primer/octicons-react";
import torBoxLogo from "@renderer/assets/icons/torbox.webp";
export interface DownloadGroupProps { export interface DownloadGroupProps {
library: LibraryGame[]; library: LibraryGame[];
title: string; title: string;
@@ -309,13 +310,7 @@ export function DownloadGroup({
<ul className="download-group__downloads"> <ul className="download-group__downloads">
{library.map((game) => { {library.map((game) => {
return ( return (
<li <li key={game.id} className="download-group__item">
key={game.id}
className={cn("download-group__item", {
"download-group__item--hydra":
game.download?.downloader === Downloader.Hydra,
})}
>
<div className="download-group__cover"> <div className="download-group__cover">
<div className="download-group__cover-backdrop"> <div className="download-group__cover-backdrop">
<img <img
@@ -325,7 +320,20 @@ export function DownloadGroup({
/> />
<div className="download-group__cover-content"> <div className="download-group__cover-content">
<Badge>{DOWNLOADER_NAME[game.download!.downloader]}</Badge> {game.download?.downloader === Downloader.TorBox ? (
<Badge>
<img
src={torBoxLogo}
alt="TorBox"
style={{ width: 13 }}
/>
<span>TorBox</span>
</Badge>
) : (
<Badge>
{DOWNLOADER_NAME[game.download!.downloader]}
</Badge>
)}
</div> </div>
</div> </div>
</div> </div>
@@ -366,10 +374,6 @@ export function DownloadGroup({
</DropdownMenu> </DropdownMenu>
)} )}
</div> </div>
{game.download?.downloader === Downloader.Hydra && (
<div className="download-group__hydra-gradient" />
)}
</li> </li>
); );
})} })}

View File

@@ -83,18 +83,14 @@ export function DownloadSettingsModal({
const getDefaultDownloader = useCallback( const getDefaultDownloader = useCallback(
(availableDownloaders: Downloader[]) => { (availableDownloaders: Downloader[]) => {
if (availableDownloaders.includes(Downloader.Hydra)) { if (availableDownloaders.includes(Downloader.TorBox)) {
return Downloader.Hydra; return Downloader.TorBox;
} }
if (availableDownloaders.includes(Downloader.RealDebrid)) { if (availableDownloaders.includes(Downloader.RealDebrid)) {
return Downloader.RealDebrid; return Downloader.RealDebrid;
} }
if (availableDownloaders.includes(Downloader.TorBox)) {
return Downloader.TorBox;
}
return availableDownloaders[0]; return availableDownloaders[0];
}, },
[] []
@@ -114,15 +110,11 @@ export function DownloadSettingsModal({
return userPreferences?.realDebridApiToken; return userPreferences?.realDebridApiToken;
if (downloader === Downloader.TorBox) if (downloader === Downloader.TorBox)
return userPreferences?.torBoxApiToken; return userPreferences?.torBoxApiToken;
if (downloader === Downloader.Hydra)
return isFeatureEnabled(Feature.Nimbus);
return true; return true;
}); });
setSelectedDownloader(getDefaultDownloader(filteredDownloaders)); setSelectedDownloader(getDefaultDownloader(filteredDownloaders));
}, [ }, [
Feature,
isFeatureEnabled,
getDefaultDownloader, getDefaultDownloader,
userPreferences?.downloadsPath, userPreferences?.downloadsPath,
downloaders, downloaders,
@@ -189,9 +181,7 @@ export function DownloadSettingsModal({
(downloader === Downloader.RealDebrid && (downloader === Downloader.RealDebrid &&
!userPreferences?.realDebridApiToken) || !userPreferences?.realDebridApiToken) ||
(downloader === Downloader.TorBox && (downloader === Downloader.TorBox &&
!userPreferences?.torBoxApiToken) || !userPreferences?.torBoxApiToken);
(downloader === Downloader.Hydra &&
!isFeatureEnabled(Feature.Nimbus));
return ( return (
<Button <Button

View File

@@ -1,20 +1,14 @@
import { useContext, useEffect, useMemo, useState } from "react"; import { useContext, useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { import { Badge, Button, Modal, TextField } from "@renderer/components";
Badge,
Button,
DebridBadge,
Modal,
TextField,
} from "@renderer/components";
import type { GameRepack } from "@types"; import type { GameRepack } from "@types";
import { DownloadSettingsModal } from "./download-settings-modal"; import { DownloadSettingsModal } from "./download-settings-modal";
import { gameDetailsContext } from "@renderer/context"; import { gameDetailsContext } from "@renderer/context";
import { Downloader } from "@shared"; import { Downloader } from "@shared";
import { orderBy } from "lodash-es"; import { orderBy } from "lodash-es";
import { useDate, useFeature } from "@renderer/hooks"; import { useDate } from "@renderer/hooks";
import "./repacks-modal.scss"; import "./repacks-modal.scss";
export interface RepacksModalProps { export interface RepacksModalProps {
@@ -37,57 +31,15 @@ export function RepacksModal({
const [repack, setRepack] = useState<GameRepack | null>(null); const [repack, setRepack] = useState<GameRepack | null>(null);
const [showSelectFolderModal, setShowSelectFolderModal] = useState(false); const [showSelectFolderModal, setShowSelectFolderModal] = useState(false);
const [hashesInDebrid, setHashesInDebrid] = useState<Record<string, boolean>>(
{}
);
const { repacks, game } = useContext(gameDetailsContext); const { repacks, game } = useContext(gameDetailsContext);
const { t } = useTranslation("game_details"); const { t } = useTranslation("game_details");
const { formatDate } = useDate(); const { formatDate } = useDate();
const getHashFromMagnet = (magnet: string) => {
if (!magnet || typeof magnet !== "string") {
return null;
}
const hashRegex = /xt=urn:btih:([a-zA-Z0-9]+)/i;
const match = magnet.match(hashRegex);
return match ? match[1].toLowerCase() : null;
};
const { isFeatureEnabled, Feature } = useFeature();
useEffect(() => {
if (!isFeatureEnabled(Feature.NimbusPreview)) {
return;
}
const magnets = repacks.flatMap((repack) =>
repack.uris.filter((uri) => uri.startsWith("magnet:"))
);
window.electron.checkDebridAvailability(magnets).then((availableHashes) => {
setHashesInDebrid(availableHashes);
});
}, [repacks, isFeatureEnabled, Feature]);
const sortedRepacks = useMemo(() => { const sortedRepacks = useMemo(() => {
return orderBy( return orderBy(repacks, (repack) => repack.uploadDate, "desc");
repacks, }, [repacks]);
[
(repack) => {
const magnet = repack.uris.find((uri) => uri.startsWith("magnet:"));
const hash = magnet ? getHashFromMagnet(magnet) : null;
return hash ? (hashesInDebrid[hash] ?? false) : false;
},
(repack) => repack.uploadDate,
],
["desc", "desc"]
);
}, [repacks, hashesInDebrid]);
useEffect(() => { useEffect(() => {
setFilteredRepacks(sortedRepacks); setFilteredRepacks(sortedRepacks);
@@ -158,10 +110,6 @@ export function RepacksModal({
{repack.fileSize} - {repack.repacker} -{" "} {repack.fileSize} - {repack.repacker} -{" "}
{repack.uploadDate ? formatDate(repack.uploadDate) : ""} {repack.uploadDate ? formatDate(repack.uploadDate) : ""}
</p> </p>
{hashesInDebrid[getHashFromMagnet(repack.uris[0]) ?? ""] && (
<DebridBadge />
)}
</Button> </Button>
); );
})} })}

View File

@@ -25,7 +25,7 @@ import "./sidebar.scss";
const achievementsPlaceholder: UserAchievement[] = [ const achievementsPlaceholder: UserAchievement[] = [
{ {
displayName: "Timber!!", displayName: "Timber!!",
name: "1", name: "",
hidden: false, hidden: false,
description: "Chop down your first tree.", description: "Chop down your first tree.",
icon: "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/0fbb33098c9da39d1d4771d8209afface9c46e81.jpg", icon: "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/0fbb33098c9da39d1d4771d8209afface9c46e81.jpg",
@@ -36,7 +36,7 @@ const achievementsPlaceholder: UserAchievement[] = [
}, },
{ {
displayName: "Supreme Helper Minion!", displayName: "Supreme Helper Minion!",
name: "2", name: "",
hidden: false, hidden: false,
icon: "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/0a6ff6a36670c96ceb4d30cf6fd69d2fdf55f38e.jpg", icon: "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/0a6ff6a36670c96ceb4d30cf6fd69d2fdf55f38e.jpg",
icongray: icongray:
@@ -46,7 +46,7 @@ const achievementsPlaceholder: UserAchievement[] = [
}, },
{ {
displayName: "Feast of Midas", displayName: "Feast of Midas",
name: "3", name: "",
hidden: false, hidden: false,
icon: "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/2d10311274fe7c92ab25cc29afdca86b019ad472.jpg", icon: "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/2d10311274fe7c92ab25cc29afdca86b019ad472.jpg",
icongray: icongray:
@@ -122,8 +122,8 @@ export function Sidebar() {
<h3>{t("sign_in_to_see_achievements")}</h3> <h3>{t("sign_in_to_see_achievements")}</h3>
</div> </div>
<ul className="list achievements-placeholder__blur"> <ul className="list achievements-placeholder__blur">
{achievementsPlaceholder.map((achievement) => ( {achievementsPlaceholder.map((achievement, index) => (
<li key={achievement.name}> <li key={index}>
<div className="list__item"> <div className="list__item">
<img <img
className={`list__item-image achievements-placeholder__blur ${ className={`list__item-image achievements-placeholder__blur ${

View File

@@ -23,7 +23,6 @@ export function SettingsBehavior() {
enableAutoInstall: false, enableAutoInstall: false,
seedAfterDownloadComplete: false, seedAfterDownloadComplete: false,
showHiddenAchievementsDescription: false, showHiddenAchievementsDescription: false,
showDownloadSpeedInMegabytes: false,
}); });
const { t } = useTranslation("settings"); const { t } = useTranslation("settings");
@@ -41,8 +40,6 @@ export function SettingsBehavior() {
userPreferences.seedAfterDownloadComplete ?? false, userPreferences.seedAfterDownloadComplete ?? false,
showHiddenAchievementsDescription: showHiddenAchievementsDescription:
userPreferences.showHiddenAchievementsDescription ?? false, userPreferences.showHiddenAchievementsDescription ?? false,
showDownloadSpeedInMegabytes:
userPreferences.showDownloadSpeedInMegabytes ?? false,
}); });
} }
}, [userPreferences]); }, [userPreferences]);
@@ -142,16 +139,6 @@ export function SettingsBehavior() {
}) })
} }
/> />
<CheckboxField
label={t("show_download_speed_in_megabytes")}
checked={form.showDownloadSpeedInMegabytes}
onChange={() =>
handleChange({
showDownloadSpeedInMegabytes: !form.showDownloadSpeedInMegabytes,
})
}
/>
</> </>
); );
} }

View File

@@ -16,7 +16,7 @@ const TORBOX_URL = torBoxReferralCode
: "https://torbox.app"; : "https://torbox.app";
const TORBOX_API_TOKEN_URL = "https://torbox.app/settings"; const TORBOX_API_TOKEN_URL = "https://torbox.app/settings";
export function SettingsTorBox() { export function SettingsTorbox() {
const userPreferences = useAppSelector( const userPreferences = useAppSelector(
(state) => state.userPreferences.value (state) => state.userPreferences.value
); );

View File

@@ -3,6 +3,7 @@ import { useTranslation } from "react-i18next";
import { SettingsRealDebrid } from "./settings-real-debrid"; import { SettingsRealDebrid } from "./settings-real-debrid";
import { SettingsGeneral } from "./settings-general"; import { SettingsGeneral } from "./settings-general";
import { SettingsBehavior } from "./settings-behavior"; import { SettingsBehavior } from "./settings-behavior";
import torBoxLogo from "@renderer/assets/icons/torbox.webp";
import { SettingsDownloadSources } from "./settings-download-sources"; import { SettingsDownloadSources } from "./settings-download-sources";
import { import {
SettingsContextConsumer, SettingsContextConsumer,
@@ -13,7 +14,7 @@ import { useFeature, useUserDetails } from "@renderer/hooks";
import { useMemo } from "react"; import { useMemo } from "react";
import "./settings.scss"; import "./settings.scss";
import { SettingsAppearance } from "./aparence/settings-appearance"; import { SettingsAppearance } from "./aparence/settings-appearance";
import { SettingsTorBox } from "./settings-torbox"; import { SettingsTorbox } from "./settings-torbox";
export default function Settings() { export default function Settings() {
const { t } = useTranslation("settings"); const { t } = useTranslation("settings");
@@ -22,7 +23,7 @@ export default function Settings() {
const { isFeatureEnabled, Feature } = useFeature(); const { isFeatureEnabled, Feature } = useFeature();
const isTorBoxEnabled = isFeatureEnabled(Feature.TorBox); const isTorboxEnabled = isFeatureEnabled(Feature.Torbox);
const categories = useMemo(() => { const categories = useMemo(() => {
const categories = [ const categories = [
@@ -33,10 +34,19 @@ export default function Settings() {
tabLabel: t("appearance"), tabLabel: t("appearance"),
contentTitle: t("appearance"), contentTitle: t("appearance"),
}, },
...(isTorBoxEnabled ...(isTorboxEnabled
? [ ? [
{ {
tabLabel: "TorBox", tabLabel: (
<>
<img
src={torBoxLogo}
alt="TorBox"
style={{ width: 13, height: 13 }}
/>{" "}
Torbox
</>
),
contentTitle: "TorBox", contentTitle: "TorBox",
}, },
] ]
@@ -50,7 +60,7 @@ export default function Settings() {
{ tabLabel: t("account"), contentTitle: t("account") }, { tabLabel: t("account"), contentTitle: t("account") },
]; ];
return categories; return categories;
}, [userDetails, t, isTorBoxEnabled]); }, [userDetails, t, isTorboxEnabled]);
return ( return (
<SettingsContextProvider> <SettingsContextProvider>
@@ -74,7 +84,7 @@ export default function Settings() {
} }
if (currentCategoryIndex === 4) { if (currentCategoryIndex === 4) {
return <SettingsTorBox />; return <SettingsTorbox />;
} }
if (currentCategoryIndex === 5) { if (currentCategoryIndex === 5) {

View File

@@ -7,7 +7,6 @@ export enum Downloader {
Datanodes, Datanodes,
Mediafire, Mediafire,
TorBox, TorBox,
Hydra,
} }
export enum DownloadSourceStatus { export enum DownloadSourceStatus {
@@ -53,11 +52,10 @@ export enum AuthPage {
} }
export enum DownloadError { export enum DownloadError {
NotCachedOnRealDebrid = "download_error_not_cached_on_real_debrid", NotCachedInRealDebrid = "download_error_not_cached_in_real_debrid",
NotCachedOnTorBox = "download_error_not_cached_on_torbox", NotCachedInTorbox = "download_error_not_cached_in_torbox",
GofileQuotaExceeded = "download_error_gofile_quota_exceeded", GofileQuotaExceeded = "download_error_gofile_quota_exceeded",
RealDebridAccountNotAuthorized = "download_error_real_debrid_account_not_authorized", RealDebridAccountNotAuthorized = "download_error_real_debrid_account_not_authorized",
NotCachedOnHydra = "download_error_not_cached_on_hydra",
} }
export const FILE_EXTENSIONS_TO_EXTRACT = [".rar", ".zip", ".7z"]; export const FILE_EXTENSIONS_TO_EXTRACT = [".rar", ".zip", ".7z"];

View File

@@ -49,12 +49,6 @@ export const formatBytes = (bytes: number): string => {
return `${Math.trunc(formatedByte * 10) / 10} ${FORMAT[base]}`; return `${Math.trunc(formatedByte * 10) / 10} ${FORMAT[base]}`;
}; };
export const formatBytesToMbps = (bytesPerSecond: number): string => {
const bitsPerSecond = bytesPerSecond * 8;
const mbps = bitsPerSecond / (1024 * 1024);
return `${Math.trunc(mbps * 10) / 10} Mbps`;
};
export const pipe = export const pipe =
<T>(...fns: ((arg: T) => any)[]) => <T>(...fns: ((arg: T) => any)[]) =>
(arg: T) => (arg: T) =>
@@ -117,12 +111,7 @@ export const getDownloadersForUri = (uri: string) => {
return [Downloader.RealDebrid]; return [Downloader.RealDebrid];
if (uri.startsWith("magnet:")) { if (uri.startsWith("magnet:")) {
return [ return [Downloader.Torrent, Downloader.TorBox, Downloader.RealDebrid];
Downloader.Torrent,
Downloader.Hydra,
Downloader.TorBox,
Downloader.RealDebrid,
];
} }
return []; return [];

View File

@@ -22,7 +22,7 @@ export interface DownloadProgress {
download: Download; download: Download;
} }
/* TorBox */ /* Torbox */
export interface TorBoxUser { export interface TorBoxUser {
id: number; id: number;
email: string; email: string;

View File

@@ -1,7 +1,7 @@
import type { Cracker, DownloadSourceStatus, Downloader } from "@shared"; import type { Cracker, DownloadSourceStatus, Downloader } from "@shared";
import type { SteamAppDetails } from "./steam.types"; import type { SteamAppDetails } from "./steam.types";
import type { Download, Game, Subscription } from "./level.types"; import type { Download, Game, Subscription } from "./level.types";
import type { GameShop, UnlockedAchievement } from "./game.types"; import type { GameShop } from "./game.types";
export type FriendRequestAction = "ACCEPTED" | "REFUSED" | "CANCEL"; export type FriendRequestAction = "ACCEPTED" | "REFUSED" | "CANCEL";
@@ -237,12 +237,6 @@ export interface UserStats {
unlockedAchievementSum?: number; unlockedAchievementSum?: number;
} }
export interface UpdatedUnlockedAchievements {
objectId: string;
shop: GameShop;
achievements: UnlockedAchievement[];
}
export interface AchievementFile { export interface AchievementFile {
type: Cracker; type: Cracker;
filePath: string; filePath: string;

View File

@@ -67,7 +67,6 @@ export interface Download {
export interface GameAchievement { export interface GameAchievement {
achievements: SteamAchievement[]; achievements: SteamAchievement[];
unlockedAchievements: UnlockedAchievement[]; unlockedAchievements: UnlockedAchievement[];
cacheExpiresTimestamp: number | undefined;
} }
export interface UserPreferences { export interface UserPreferences {
@@ -82,12 +81,10 @@ export interface UserPreferences {
enableAutoInstall?: boolean; enableAutoInstall?: boolean;
seedAfterDownloadComplete?: boolean; seedAfterDownloadComplete?: boolean;
showHiddenAchievementsDescription?: boolean; showHiddenAchievementsDescription?: boolean;
showDownloadSpeedInMegabits?: boolean;
downloadNotificationsEnabled?: boolean; downloadNotificationsEnabled?: boolean;
repackUpdatesNotificationsEnabled?: boolean; repackUpdatesNotificationsEnabled?: boolean;
achievementNotificationsEnabled?: boolean; achievementNotificationsEnabled?: boolean;
friendRequestNotificationsEnabled?: boolean; friendRequestNotificationsEnabled?: boolean;
showDownloadSpeedInMegabytes?: boolean;
} }
export interface ScreenState { export interface ScreenState {

298
yarn.lock
View File

@@ -1417,15 +1417,6 @@
resolved "https://registry.yarnpkg.com/@electron-toolkit/utils/-/utils-3.0.0.tgz#74626893d93025eacba086d497b615cf927d42c4" resolved "https://registry.yarnpkg.com/@electron-toolkit/utils/-/utils-3.0.0.tgz#74626893d93025eacba086d497b615cf927d42c4"
integrity sha512-GaXHDhiT7KCvMJjXdp/QqpYinq69T/Pdl49Z1XLf8mKGf63dnsODMWyrmIjEQ0z/vG7dO8qF3fvmI6Eb2lUNZA== integrity sha512-GaXHDhiT7KCvMJjXdp/QqpYinq69T/Pdl49Z1XLf8mKGf63dnsODMWyrmIjEQ0z/vG7dO8qF3fvmI6Eb2lUNZA==
"@electron/asar@3.2.18":
version "3.2.18"
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.18.tgz#fa607f829209bab8b9e0ce6658d3fe81b2cba517"
integrity sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==
dependencies:
commander "^5.0.0"
glob "^7.1.6"
minimatch "^3.0.4"
"@electron/asar@^3.2.7": "@electron/asar@^3.2.7":
version "3.2.13" version "3.2.13"
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.13.tgz#56565ea423ead184465adfa72663b2c70d9835f2" resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.13.tgz#56565ea423ead184465adfa72663b2c70d9835f2"
@@ -1436,15 +1427,6 @@
glob "^7.1.6" glob "^7.1.6"
minimatch "^3.0.4" minimatch "^3.0.4"
"@electron/fuses@^1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@electron/fuses/-/fuses-1.8.0.tgz#ad34d3cc4703b1258b83f6989917052cfc1490a0"
integrity sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==
dependencies:
chalk "^4.1.1"
fs-extra "^9.0.1"
minimist "^1.2.5"
"@electron/get@^2.0.0": "@electron/get@^2.0.0":
version "2.0.3" version "2.0.3"
resolved "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz" resolved "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz"
@@ -1460,21 +1442,6 @@
optionalDependencies: optionalDependencies:
global-agent "^3.0.0" global-agent "^3.0.0"
"@electron/node-gyp@git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2":
version "10.2.0-electron.1"
resolved "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2"
dependencies:
env-paths "^2.2.0"
exponential-backoff "^3.1.1"
glob "^8.1.0"
graceful-fs "^4.2.6"
make-fetch-happen "^10.2.1"
nopt "^6.0.0"
proc-log "^2.0.1"
semver "^7.3.5"
tar "^6.2.1"
which "^2.0.2"
"@electron/notarize@2.5.0": "@electron/notarize@2.5.0":
version "2.5.0" version "2.5.0"
resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.5.0.tgz#d4d25356adfa29df4a76bd64a8bd347237cd251e" resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.5.0.tgz#d4d25356adfa29df4a76bd64a8bd347237cd251e"
@@ -1496,12 +1463,11 @@
minimist "^1.2.6" minimist "^1.2.6"
plist "^3.0.5" plist "^3.0.5"
"@electron/rebuild@3.7.0": "@electron/rebuild@3.6.1":
version "3.7.0" version "3.6.1"
resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.7.0.tgz#82e20c467ddedbb295d7f641592c52e68c141e9f" resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.6.1.tgz#59e8e36c3f6e6b94a699425dfb61f0394c3dd4df"
integrity sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw== integrity sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==
dependencies: dependencies:
"@electron/node-gyp" "https://github.com/electron/node-gyp#06b29aafb7708acef8b3669835c8a7857ebc92d2"
"@malept/cross-spawn-promise" "^2.0.0" "@malept/cross-spawn-promise" "^2.0.0"
chalk "^4.0.0" chalk "^4.0.0"
debug "^4.1.1" debug "^4.1.1"
@@ -1510,6 +1476,7 @@
got "^11.7.0" got "^11.7.0"
node-abi "^3.45.0" node-abi "^3.45.0"
node-api-version "^0.2.0" node-api-version "^0.2.0"
node-gyp "^9.0.0"
ora "^5.1.0" ora "^5.1.0"
read-binary-file-arch "^1.0.6" read-binary-file-arch "^1.0.6"
semver "^7.3.5" semver "^7.3.5"
@@ -3687,35 +3654,35 @@ anymatch@~3.1.2:
normalize-path "^3.0.0" normalize-path "^3.0.0"
picomatch "^2.0.4" picomatch "^2.0.4"
app-builder-bin@5.0.0-alpha.12: app-builder-bin@5.0.0-alpha.10:
version "5.0.0-alpha.12" version "5.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz#2daf82f8badc698e0adcc95ba36af4ff0650dc80" resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.10.tgz#cf12e593b6b847fb9d04027fa755c6c6610d778b"
integrity sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w== integrity sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw==
app-builder-lib@26.0.12: app-builder-lib@25.1.8:
version "26.0.12" version "25.1.8"
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.0.12.tgz#2e33df936e0f78d4266b058ece90308ea981eefb" resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.1.8.tgz#ae376039c5f269c7d562af494a087e5bc6310f1b"
integrity sha512-+/CEPH1fVKf6HowBUs6LcAIoRcjeqgvAeoSE+cl7Y7LndyQ9ViGPYibNk7wmhMHzNgHIuIbw4nWADPO+4mjgWw== integrity sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg==
dependencies: dependencies:
"@develar/schema-utils" "~2.6.5" "@develar/schema-utils" "~2.6.5"
"@electron/asar" "3.2.18"
"@electron/fuses" "^1.8.0"
"@electron/notarize" "2.5.0" "@electron/notarize" "2.5.0"
"@electron/osx-sign" "1.3.1" "@electron/osx-sign" "1.3.1"
"@electron/rebuild" "3.7.0" "@electron/rebuild" "3.6.1"
"@electron/universal" "2.0.1" "@electron/universal" "2.0.1"
"@malept/flatpak-bundler" "^0.4.0" "@malept/flatpak-bundler" "^0.4.0"
"@types/fs-extra" "9.0.13" "@types/fs-extra" "9.0.13"
async-exit-hook "^2.0.1" async-exit-hook "^2.0.1"
builder-util "26.0.11" bluebird-lst "^1.0.9"
builder-util-runtime "9.3.1" builder-util "25.1.7"
builder-util-runtime "9.2.10"
chromium-pickle-js "^0.2.0" chromium-pickle-js "^0.2.0"
config-file-ts "0.2.8-rc1" config-file-ts "0.2.8-rc1"
debug "^4.3.4" debug "^4.3.4"
dotenv "^16.4.5" dotenv "^16.4.5"
dotenv-expand "^11.0.6" dotenv-expand "^11.0.6"
ejs "^3.1.8" ejs "^3.1.8"
electron-publish "26.0.11" electron-publish "25.1.7"
form-data "^4.0.0"
fs-extra "^10.1.0" fs-extra "^10.1.0"
hosted-git-info "^4.1.0" hosted-git-info "^4.1.0"
is-ci "^3.0.0" is-ci "^3.0.0"
@@ -3724,18 +3691,30 @@ app-builder-lib@26.0.12:
json5 "^2.2.3" json5 "^2.2.3"
lazy-val "^1.0.5" lazy-val "^1.0.5"
minimatch "^10.0.0" minimatch "^10.0.0"
plist "3.1.0"
resedit "^1.7.0" resedit "^1.7.0"
sanitize-filename "^1.6.3"
semver "^7.3.8" semver "^7.3.8"
tar "^6.1.12" tar "^6.1.12"
temp-file "^3.4.0" temp-file "^3.4.0"
tiny-async-pool "1.3.0"
applescript@^1.0.0: applescript@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz" resolved "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz"
integrity sha512-yvtNHdWvtbYEiIazXAdp/NY+BBb65/DAseqlNiJQjOx9DynuzOYDbVLBJvuc0ve0VL9x6B3OHF6eH52y9hCBtQ== integrity sha512-yvtNHdWvtbYEiIazXAdp/NY+BBb65/DAseqlNiJQjOx9DynuzOYDbVLBJvuc0ve0VL9x6B3OHF6eH52y9hCBtQ==
"aproba@^1.0.3 || ^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
are-we-there-yet@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd"
integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==
dependencies:
delegates "^1.0.0"
readable-stream "^3.6.0"
arg@^4.1.0: arg@^4.1.0:
version "4.1.3" version "4.1.3"
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
@@ -3996,6 +3975,18 @@ bl@^4.1.0:
inherits "^2.0.4" inherits "^2.0.4"
readable-stream "^3.4.0" readable-stream "^3.4.0"
bluebird-lst@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c"
integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==
dependencies:
bluebird "^3.5.5"
bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
boolean@^3.0.1: boolean@^3.0.1:
version "3.2.0" version "3.2.0"
resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
@@ -4084,36 +4075,35 @@ buffer@^6.0.3:
base64-js "^1.3.1" base64-js "^1.3.1"
ieee754 "^1.2.1" ieee754 "^1.2.1"
builder-util-runtime@9.3.1: builder-util-runtime@9.2.10:
version "9.3.1" version "9.2.10"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.3.1.tgz#0daedde0f6d381f2a00a50a407b166fe7dca1a67" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz#a0f7d9e214158402e78b74a745c8d9f870c604bc"
integrity sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ== integrity sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==
dependencies: dependencies:
debug "^4.3.4" debug "^4.3.4"
sax "^1.2.4" sax "^1.2.4"
builder-util@26.0.11: builder-util@25.1.7:
version "26.0.11" version "25.1.7"
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.0.11.tgz#ad85b92c93f2b976b973e1d87337e0c6813fcb8f" resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-25.1.7.tgz#a07b404f0cb1a635aa165902be65297d58932ff8"
integrity sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA== integrity sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==
dependencies: dependencies:
"7zip-bin" "~5.2.0" "7zip-bin" "~5.2.0"
"@types/debug" "^4.1.6" "@types/debug" "^4.1.6"
app-builder-bin "5.0.0-alpha.12" app-builder-bin "5.0.0-alpha.10"
builder-util-runtime "9.3.1" bluebird-lst "^1.0.9"
builder-util-runtime "9.2.10"
chalk "^4.1.2" chalk "^4.1.2"
cross-spawn "^7.0.6" cross-spawn "^7.0.3"
debug "^4.3.4" debug "^4.3.4"
fs-extra "^10.1.0" fs-extra "^10.1.0"
http-proxy-agent "^7.0.0" http-proxy-agent "^7.0.0"
https-proxy-agent "^7.0.0" https-proxy-agent "^7.0.0"
is-ci "^3.0.0" is-ci "^3.0.0"
js-yaml "^4.1.0" js-yaml "^4.1.0"
sanitize-filename "^1.6.3"
source-map-support "^0.5.19" source-map-support "^0.5.19"
stat-mode "^1.0.0" stat-mode "^1.0.0"
temp-file "^3.4.0" temp-file "^3.4.0"
tiny-async-pool "1.3.0"
cac@^6.7.14: cac@^6.7.14:
version "6.7.14" version "6.7.14"
@@ -4236,7 +4226,7 @@ chalk@^2.4.2:
escape-string-regexp "^1.0.5" escape-string-regexp "^1.0.5"
supports-color "^5.3.0" supports-color "^5.3.0"
chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -4377,6 +4367,11 @@ color-string@^1.9.0:
color-name "^1.0.0" color-name "^1.0.0"
simple-swizzle "^0.2.2" simple-swizzle "^0.2.2"
color-support@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
color.js@^1.2.0: color.js@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/color.js/-/color.js-1.2.0.tgz#18d9f55545111730d25ccf18ea8b6933c71440d7" resolved "https://registry.yarnpkg.com/color.js/-/color.js-1.2.0.tgz#18d9f55545111730d25ccf18ea8b6933c71440d7"
@@ -4433,6 +4428,11 @@ config-file-ts@0.2.8-rc1:
glob "^10.3.12" glob "^10.3.12"
typescript "^5.4.3" typescript "^5.4.3"
console-control-strings@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
conventional-changelog-angular@^7.0.0: conventional-changelog-angular@^7.0.0:
version "7.0.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a"
@@ -4521,7 +4521,7 @@ cross-fetch-ponyfill@^1.0.3:
abort-controller "^3.0.0" abort-controller "^3.0.0"
node-fetch "^3.3.0" node-fetch "^3.3.0"
cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3" version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -4530,15 +4530,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2:
shebang-command "^2.0.0" shebang-command "^2.0.0"
which "^2.0.1" which "^2.0.1"
cross-spawn@^7.0.6:
version "7.0.6"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
which "^2.0.1"
cssstyle@^4.0.1: cssstyle@^4.0.1:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.1.0.tgz#161faee382af1bafadb6d3867a92a19bcb4aea70" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.1.0.tgz#161faee382af1bafadb6d3867a92a19bcb4aea70"
@@ -4692,6 +4683,11 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
detect-libc@^2.0.1: detect-libc@^2.0.1:
version "2.0.3" version "2.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
@@ -4740,14 +4736,14 @@ diskusage@^1.2.0:
es6-promise "^4.2.8" es6-promise "^4.2.8"
nan "^2.18.0" nan "^2.18.0"
dmg-builder@26.0.12: dmg-builder@25.1.8:
version "26.0.12" version "25.1.8"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.0.12.tgz#6996ad0bab80a861c9a7b33ee9734d4f60566b46" resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.1.8.tgz#41f3b725edd896156e891016a44129e1bd580430"
integrity sha512-59CAAjAhTaIMCN8y9kD573vDkxbs1uhDcrFLHSgutYdPcGOU35Rf95725snvzEOy4BFB7+eLJ8djCNPmGwG67w== integrity sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==
dependencies: dependencies:
app-builder-lib "26.0.12" app-builder-lib "25.1.8"
builder-util "26.0.11" builder-util "25.1.7"
builder-util-runtime "9.3.1" builder-util-runtime "9.2.10"
fs-extra "^10.1.0" fs-extra "^10.1.0"
iconv-lite "^0.6.2" iconv-lite "^0.6.2"
js-yaml "^4.1.0" js-yaml "^4.1.0"
@@ -4851,16 +4847,16 @@ ejs@^3.1.8:
dependencies: dependencies:
jake "^10.8.5" jake "^10.8.5"
electron-builder@^26.0.12: electron-builder@^25.1.8:
version "26.0.12" version "25.1.8"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.12.tgz#797af2e70efdd96c9ea5d8a8164b8728c90d65ff" resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.1.8.tgz#b0e310f1600787610bb84c3f39bc7aadb2548486"
integrity sha512-cD1kz5g2sgPTMFHjLxfMjUK5JABq3//J4jPswi93tOPFz6btzXYtK5NrDt717NRbukCUDOrrvmYVOWERlqoiXA== integrity sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig==
dependencies: dependencies:
app-builder-lib "26.0.12" app-builder-lib "25.1.8"
builder-util "26.0.11" builder-util "25.1.7"
builder-util-runtime "9.3.1" builder-util-runtime "9.2.10"
chalk "^4.1.2" chalk "^4.1.2"
dmg-builder "26.0.12" dmg-builder "25.1.8"
fs-extra "^10.1.0" fs-extra "^10.1.0"
is-ci "^3.0.0" is-ci "^3.0.0"
lazy-val "^1.0.5" lazy-val "^1.0.5"
@@ -4872,16 +4868,15 @@ electron-log@^5.2.4:
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.2.4.tgz#6b488d9db80aa3c6f3dc39bcd635fc9d1f79c8af" resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.2.4.tgz#6b488d9db80aa3c6f3dc39bcd635fc9d1f79c8af"
integrity sha512-iX12WXc5XAaKeHg2QpiFjVwL+S1NVHPFd3V5RXtCmKhpAzXsVQnR3UEc0LovM6p6NkUQxDWnkdkaam9FNUVmCA== integrity sha512-iX12WXc5XAaKeHg2QpiFjVwL+S1NVHPFd3V5RXtCmKhpAzXsVQnR3UEc0LovM6p6NkUQxDWnkdkaam9FNUVmCA==
electron-publish@26.0.11: electron-publish@25.1.7:
version "26.0.11" version "25.1.7"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.0.11.tgz#92c9329a101af2836d9d228c82966eca1eee9a7b" resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.1.7.tgz#14e50c2a3fafdc1c454eadbbc47ead89a48bb554"
integrity sha512-a8QRH0rAPIWH9WyyS5LbNvW9Ark6qe63/LqDB7vu2JXYpi0Gma5Q60Dh4tmTqhOBQt0xsrzD8qE7C+D7j+B24A== integrity sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==
dependencies: dependencies:
"@types/fs-extra" "^9.0.11" "@types/fs-extra" "^9.0.11"
builder-util "26.0.11" builder-util "25.1.7"
builder-util-runtime "9.3.1" builder-util-runtime "9.2.10"
chalk "^4.1.2" chalk "^4.1.2"
form-data "^4.0.0"
fs-extra "^10.1.0" fs-extra "^10.1.0"
lazy-val "^1.0.5" lazy-val "^1.0.5"
mime "^2.5.2" mime "^2.5.2"
@@ -4896,12 +4891,12 @@ electron-to-chromium@^1.5.73:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d"
integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==
electron-updater@^6.6.2: electron-updater@^6.3.9:
version "6.6.2" version "6.3.9"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.6.2.tgz#3e65e044f1a99b00d61e200e24de8e709c69ce99" resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.3.9.tgz#e1e7f155624c58e6f3760f376c3a584028165ec4"
integrity sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw== integrity sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==
dependencies: dependencies:
builder-util-runtime "9.3.1" builder-util-runtime "9.2.10"
fs-extra "^10.1.0" fs-extra "^10.1.0"
js-yaml "^4.1.0" js-yaml "^4.1.0"
lazy-val "^1.0.5" lazy-val "^1.0.5"
@@ -5710,6 +5705,20 @@ functions-have-names@^1.2.3:
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
gauge@^4.0.3:
version "4.0.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
dependencies:
aproba "^1.0.3 || ^2.0.0"
color-support "^1.1.3"
console-control-strings "^1.1.0"
has-unicode "^2.0.1"
signal-exit "^3.0.7"
string-width "^4.2.3"
strip-ansi "^6.0.1"
wide-align "^1.1.5"
gensync@^1.0.0-beta.2: gensync@^1.0.0-beta.2:
version "1.0.0-beta.2" version "1.0.0-beta.2"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@@ -5854,7 +5863,7 @@ glob@^10.3.12, glob@^10.3.7:
package-json-from-dist "^1.0.0" package-json-from-dist "^1.0.0"
path-scurry "^1.11.1" path-scurry "^1.11.1"
glob@^7.1.3, glob@^7.1.6: glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.3" version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@@ -5866,7 +5875,7 @@ glob@^7.1.3, glob@^7.1.6:
once "^1.3.0" once "^1.3.0"
path-is-absolute "^1.0.0" path-is-absolute "^1.0.0"
glob@^8.0.1, glob@^8.1.0: glob@^8.0.1:
version "8.1.0" version "8.1.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
@@ -6028,6 +6037,11 @@ has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
dependencies: dependencies:
has-symbols "^1.0.3" has-symbols "^1.0.3"
has-unicode@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
@@ -7070,7 +7084,7 @@ make-error@^1.1.1:
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
make-fetch-happen@^10.2.1: make-fetch-happen@^10.0.3:
version "10.2.1" version "10.2.1"
resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164"
integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==
@@ -7199,7 +7213,7 @@ minimatch@^9.0.3, minimatch@^9.0.4:
dependencies: dependencies:
brace-expansion "^2.0.1" brace-expansion "^2.0.1"
minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: minimist@^1.2.6, minimist@^1.2.8:
version "1.2.8" version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@@ -7386,6 +7400,23 @@ node-gyp-build@^4.3.0:
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8"
integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==
node-gyp@^9.0.0:
version "9.4.1"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185"
integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==
dependencies:
env-paths "^2.2.0"
exponential-backoff "^3.1.1"
glob "^7.1.4"
graceful-fs "^4.2.6"
make-fetch-happen "^10.0.3"
nopt "^6.0.0"
npmlog "^6.0.0"
rimraf "^3.0.2"
semver "^7.3.5"
tar "^6.1.2"
which "^2.0.2"
node-releases@^2.0.18: node-releases@^2.0.18:
version "2.0.18" version "2.0.18"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
@@ -7413,6 +7444,16 @@ normalize-url@^6.0.1:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
npmlog@^6.0.0:
version "6.0.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830"
integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==
dependencies:
are-we-there-yet "^3.0.0"
console-control-strings "^1.1.0"
gauge "^4.0.3"
set-blocking "^2.0.0"
nwsapi@^2.2.12: nwsapi@^2.2.12:
version "2.2.13" version "2.2.13"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.13.tgz#e56b4e98960e7a040e5474536587e599c4ff4655" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.13.tgz#e56b4e98960e7a040e5474536587e599c4ff4655"
@@ -7699,7 +7740,7 @@ piscina@^4.7.0:
optionalDependencies: optionalDependencies:
"@napi-rs/nice" "^1.0.1" "@napi-rs/nice" "^1.0.1"
plist@3.1.0, plist@^3.0.4, plist@^3.0.5, plist@^3.1.0: plist@^3.0.4, plist@^3.0.5, plist@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9"
integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==
@@ -7739,11 +7780,6 @@ prettier@^3.4.2:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f"
integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==
proc-log@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685"
integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==
progress@^2.0.3: progress@^2.0.3:
version "2.0.3" version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@@ -7956,7 +7992,7 @@ read-binary-file-arch@^1.0.6:
dependencies: dependencies:
debug "^4.3.4" debug "^4.3.4"
readable-stream@^3.4.0: readable-stream@^3.4.0, readable-stream@^3.6.0:
version "3.6.2" version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -8394,11 +8430,6 @@ semver-compare@^1.0.0:
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
semver@^5.5.0:
version "5.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^6.2.0, semver@^6.3.1: semver@^6.2.0, semver@^6.3.1:
version "6.3.1" version "6.3.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
@@ -8416,6 +8447,11 @@ serialize-error@^7.0.1:
dependencies: dependencies:
type-fest "^0.13.1" type-fest "^0.13.1"
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
set-function-length@^1.2.1, set-function-length@^1.2.2: set-function-length@^1.2.1, set-function-length@^1.2.2:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
@@ -8514,7 +8550,7 @@ side-channel@^1.1.0:
side-channel-map "^1.0.1" side-channel-map "^1.0.1"
side-channel-weakmap "^1.0.2" side-channel-weakmap "^1.0.2"
signal-exit@^3.0.2: signal-exit@^3.0.2, signal-exit@^3.0.7:
version "3.0.7" version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
@@ -8641,7 +8677,7 @@ state-local@^1.0.6:
is-fullwidth-code-point "^3.0.0" is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1" strip-ansi "^6.0.1"
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3" version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -8848,7 +8884,7 @@ synckit@^0.9.1:
"@pkgr/core" "^0.1.0" "@pkgr/core" "^0.1.0"
tslib "^2.6.2" tslib "^2.6.2"
tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.2.1: tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2:
version "6.2.1" version "6.2.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
@@ -8895,13 +8931,6 @@ text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
tiny-async-pool@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz#c013e1b369095e7005db5595f95e646cca6ef8a5"
integrity sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==
dependencies:
semver "^5.5.0"
tiny-case@^1.0.3: tiny-case@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03" resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03"
@@ -9517,6 +9546,13 @@ which@2.0.2, which@^2.0.1, which@^2.0.2:
dependencies: dependencies:
isexe "^2.0.0" isexe "^2.0.0"
wide-align@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
dependencies:
string-width "^1.0.2 || 2 || 3 || 4"
winreg@1.2.4: winreg@1.2.4:
version "1.2.4" version "1.2.4"
resolved "https://registry.yarnpkg.com/winreg/-/winreg-1.2.4.tgz#ba065629b7a925130e15779108cf540990e98d1b" resolved "https://registry.yarnpkg.com/winreg/-/winreg-1.2.4.tgz#ba065629b7a925130e15779108cf540990e98d1b"