mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-14 12:23:43 +00:00
feat: new version check (#102)
This commit is contained in:
1 parent
701ea59035
commit
33f6325bf7
19 files changed
+235
-91
No files matched your search
@@ -1,5 +1,5 @@
|
|||||||
name-template: 'v$NEXT_PATCH_VERSION 🌈'
|
name-template: 'v1.3.0 🌈'
|
||||||
tag-template: 'v$NEXT_PATCH_VERSION'
|
tag-template: 'v1.3.0'
|
||||||
categories:
|
categories:
|
||||||
- title: '🆕 Features'
|
- title: '🆕 Features'
|
||||||
labels:
|
labels:
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ name: build
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
get-release:
|
get-release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
+2
-15
@@ -2,28 +2,15 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"fmt"
|
"github.com/GopeedLab/gopeed/cmd"
|
||||||
"github.com/GopeedLab/gopeed/pkg/rest"
|
|
||||||
"github.com/GopeedLab/gopeed/pkg/rest/model"
|
"github.com/GopeedLab/gopeed/pkg/rest/model"
|
||||||
"net/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed banner.txt
|
|
||||||
var banner string
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
cfg := &model.StartConfig{
|
cfg := &model.StartConfig{
|
||||||
Network: "tcp",
|
Network: "tcp",
|
||||||
Address: "127.0.0.1:9999",
|
Address: "127.0.0.1:9999",
|
||||||
Storage: model.StorageBolt,
|
Storage: model.StorageBolt,
|
||||||
}
|
}
|
||||||
fmt.Println(banner)
|
cmd.Start(cfg)
|
||||||
srv, listener, err := rest.BuildServer(cfg)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
fmt.Printf("Server start success on http://%s\n", listener.Addr().String())
|
|
||||||
if err := srv.Serve(listener); err != nil && err != http.ErrServerClosed {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
File renamed without changes.
@@ -0,0 +1,42 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "embed"
|
||||||
|
"fmt"
|
||||||
|
"github.com/GopeedLab/gopeed/pkg/download"
|
||||||
|
"github.com/GopeedLab/gopeed/pkg/rest"
|
||||||
|
"github.com/GopeedLab/gopeed/pkg/rest/model"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed banner.txt
|
||||||
|
var banner string
|
||||||
|
|
||||||
|
func Start(cfg *model.StartConfig) {
|
||||||
|
fmt.Println(banner)
|
||||||
|
srv, listener, err := rest.BuildServer(cfg)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
exist, _, err := rest.Downloader.GetConfig()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if !exist {
|
||||||
|
// Set default download dir to user download dir
|
||||||
|
userDir, err := os.UserHomeDir()
|
||||||
|
if err == nil {
|
||||||
|
downloadDir := filepath.Join(userDir, "Downloads")
|
||||||
|
rest.Downloader.PutConfig(&download.DownloaderStoreConfig{
|
||||||
|
DownloadDir: downloadDir,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
fmt.Printf("Server start success on http://%s\n", listener.Addr().String())
|
||||||
|
if err := srv.Serve(listener); err != nil && err != http.ErrServerClosed {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
|
|
||||||
_______ ______ .______ _______ _______ _______
|
|
||||||
/ _____| / __ \ | _ \ | ____|| ____|| \
|
|
||||||
| | __ | | | | | |_) | | |__ | |__ | .--. |
|
|
||||||
| | |_ | | | | | | ___/ | __| | __| | | | |
|
|
||||||
| |__| | | `--' | | | | |____ | |____ | '--' |
|
|
||||||
\______| \______/ | _| |_______||_______||_______/
|
|
||||||
+1
-12
@@ -5,11 +5,8 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"embed"
|
"embed"
|
||||||
"fmt"
|
|
||||||
"github.com/GopeedLab/gopeed/pkg/rest"
|
|
||||||
"github.com/GopeedLab/gopeed/pkg/rest/model"
|
"github.com/GopeedLab/gopeed/pkg/rest/model"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"net/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed banner.txt
|
//go:embed banner.txt
|
||||||
@@ -30,13 +27,5 @@ func main() {
|
|||||||
WebEnable: true,
|
WebEnable: true,
|
||||||
WebFS: sub,
|
WebFS: sub,
|
||||||
}
|
}
|
||||||
fmt.Println(banner)
|
cmd.Start(cfg)
|
||||||
srv, listener, err := rest.BuildServer(cfg)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
fmt.Printf("Server start success on http://%s\n", listener.Addr().String())
|
|
||||||
if err := srv.Serve(listener); err != nil && err != http.ErrServerClosed {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+17
-12
@@ -1,7 +1,6 @@
|
|||||||
package rest
|
package rest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"compress/gzip"
|
|
||||||
"github.com/GopeedLab/gopeed/pkg/base"
|
"github.com/GopeedLab/gopeed/pkg/base"
|
||||||
"github.com/GopeedLab/gopeed/pkg/download"
|
"github.com/GopeedLab/gopeed/pkg/download"
|
||||||
"github.com/GopeedLab/gopeed/pkg/rest/model"
|
"github.com/GopeedLab/gopeed/pkg/rest/model"
|
||||||
@@ -164,24 +163,30 @@ func DoProxy(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
w.WriteHeader(resp.StatusCode)
|
|
||||||
for k, vv := range resp.Header {
|
for k, vv := range resp.Header {
|
||||||
for _, v := range vv {
|
for _, v := range vv {
|
||||||
w.Header().Add(k, v)
|
w.Header().Set(k, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var reader io.ReadCloser
|
w.WriteHeader(resp.StatusCode)
|
||||||
switch resp.Header.Get("Content-Encoding") {
|
buf, err := io.ReadAll(resp.Body)
|
||||||
case "gzip":
|
if err != nil {
|
||||||
reader, err = gzip.NewReader(resp.Body)
|
|
||||||
defer reader.Close()
|
|
||||||
default:
|
|
||||||
reader = resp.Body
|
|
||||||
}
|
|
||||||
if _, err := io.Copy(w, reader); err != nil {
|
|
||||||
writeError(w, err.Error())
|
writeError(w, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
w.Write(buf)
|
||||||
|
//var reader io.ReadCloser
|
||||||
|
//switch resp.Header.Get("Content-Encoding") {
|
||||||
|
//case "gzip":
|
||||||
|
// reader, err = gzip.NewReader(resp.Body)
|
||||||
|
// defer reader.Close()
|
||||||
|
//default:
|
||||||
|
// reader = resp.Body
|
||||||
|
//}
|
||||||
|
//if _, err := io.Copy(w, resp.Body); err != nil {
|
||||||
|
// writeError(w, err.Error())
|
||||||
|
// return
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeError(w http.ResponseWriter, msg string) {
|
func writeError(w http.ResponseWriter, msg string) {
|
||||||
|
|||||||
@@ -49,6 +49,9 @@
|
|||||||
"effectAfterRestart": "Effect after restart",
|
"effectAfterRestart": "Effect after restart",
|
||||||
"deleteTask": "Delete Task",
|
"deleteTask": "Delete Task",
|
||||||
"deleteTaskTip": "Keep downloaded files",
|
"deleteTaskTip": "Keep downloaded files",
|
||||||
"delete": "Delete"
|
"delete": "Delete",
|
||||||
|
"newVersionTitle": "Discover new version @version",
|
||||||
|
"newVersionUpdate": "Download Now",
|
||||||
|
"newVersionLater": "Later"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8,9 +8,12 @@
|
|||||||
"task": "کار",
|
"task": "کار",
|
||||||
"setting": "تنظیمات",
|
"setting": "تنظیمات",
|
||||||
"create": "ایجاد کار",
|
"create": "ایجاد کار",
|
||||||
|
"downloading": "دانلود کردن",
|
||||||
|
"downloaded": "دانلود شدن",
|
||||||
"downloadLink": "لینک دانلود",
|
"downloadLink": "لینک دانلود",
|
||||||
"downloadLinkValid": "لطفا لینک دانلود را وارد کنید",
|
"downloadLinkValid": "لطفا لینک دانلود را وارد کنید",
|
||||||
"download": "دانلود",
|
"download": "دانلود",
|
||||||
|
"noFileSelected": "لطفا حداقل یک فایل را جهت دانلود انتخاب کنید.",
|
||||||
"noStoragePermission": "مجوز ذخیره سازی مورد نیاز است",
|
"noStoragePermission": "مجوز ذخیره سازی مورد نیاز است",
|
||||||
"selectFile": "انتخاب فایل",
|
"selectFile": "انتخاب فایل",
|
||||||
"basic": "پایه",
|
"basic": "پایه",
|
||||||
@@ -44,6 +47,8 @@
|
|||||||
"effectAfterRestart": "Effect after restart",
|
"effectAfterRestart": "Effect after restart",
|
||||||
"deleteTask": "پاک کردن کار",
|
"deleteTask": "پاک کردن کار",
|
||||||
"deleteTaskTip": "فایل های دانلود شده را نگه دارد",
|
"deleteTaskTip": "فایل های دانلود شده را نگه دارد",
|
||||||
"delete": "پاک کردن"
|
"delete": "پاک کردن",
|
||||||
}
|
"newVersionTitle": "@version عنوان: کشف نسخه جدید",
|
||||||
|
"newVersionUpdate": "دریافت اکنون",
|
||||||
|
"newVersionLater": "بعداً"
|
||||||
|
}
|
||||||
@@ -6,6 +6,8 @@
|
|||||||
"cancel": "Отмена",
|
"cancel": "Отмена",
|
||||||
"selectAll": "Выбрать все",
|
"selectAll": "Выбрать все",
|
||||||
"task": "Задачи",
|
"task": "Задачи",
|
||||||
|
"downloading": "Загрузка",
|
||||||
|
"downloaded": "Загружено",
|
||||||
"setting": "Настройки",
|
"setting": "Настройки",
|
||||||
"create": "Создать задачу",
|
"create": "Создать задачу",
|
||||||
"downloadLink": "Ссылка для скачивание",
|
"downloadLink": "Ссылка для скачивание",
|
||||||
@@ -13,6 +15,7 @@
|
|||||||
"downloadLinkHit": "Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append",
|
"downloadLinkHit": "Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append",
|
||||||
"downloadLinkHitDesktop": ", или перетащите сюда торрент-файл",
|
"downloadLinkHitDesktop": ", или перетащите сюда торрент-файл",
|
||||||
"download": "Скачать",
|
"download": "Скачать",
|
||||||
|
"noFileSelected": "Файл не выбран",
|
||||||
"noStoragePermission": "Требуется доступ к хранилищу",
|
"noStoragePermission": "Требуется доступ к хранилищу",
|
||||||
"selectFile": "Выберать файл",
|
"selectFile": "Выберать файл",
|
||||||
"basic": "Основные параметры",
|
"basic": "Основные параметры",
|
||||||
@@ -46,5 +49,8 @@
|
|||||||
"effectAfterRestart": "Эффект после перезагрузки",
|
"effectAfterRestart": "Эффект после перезагрузки",
|
||||||
"deleteTask": "Удалить задачу",
|
"deleteTask": "Удалить задачу",
|
||||||
"deleteTaskTip": "Сохранить загруженные файлы",
|
"deleteTaskTip": "Сохранить загруженные файлы",
|
||||||
"delete": "Удалить"
|
"delete": "Удалить",
|
||||||
}
|
"newVersionTitle": "Обнаружена новая версия @version",
|
||||||
|
"newVersionUpdate": "Скачать сейчас",
|
||||||
|
"newVersionLater": "позже"
|
||||||
|
}
|
||||||
@@ -49,5 +49,8 @@
|
|||||||
"effectAfterRestart": "此配置项将在重启应用后生效",
|
"effectAfterRestart": "此配置项将在重启应用后生效",
|
||||||
"deleteTask": "删除任务",
|
"deleteTask": "删除任务",
|
||||||
"deleteTaskTip": "保留已下载的文件",
|
"deleteTaskTip": "保留已下载的文件",
|
||||||
"delete": "删除"
|
"delete": "删除",
|
||||||
|
"newVersionTitle": "发现新版本 @version",
|
||||||
|
"newVersionUpdate": "立即下载",
|
||||||
|
"newVersionLater": "稍后再说"
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:dio/adapter.dart';
|
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:dio/io.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'model/resolve_result.dart';
|
import 'model/resolve_result.dart';
|
||||||
import '../util/util.dart';
|
import '../util/util.dart';
|
||||||
@@ -33,6 +34,9 @@ class _Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
dio.options.baseUrl = baseUrl;
|
dio.options.baseUrl = baseUrl;
|
||||||
|
dio.options.contentType = Headers.jsonContentType;
|
||||||
|
dio.options.connectTimeout = const Duration(seconds: 5);
|
||||||
|
dio.options.receiveTimeout = const Duration(seconds: 60);
|
||||||
dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {
|
dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {
|
||||||
if (apiToken.isNotEmpty) {
|
if (apiToken.isNotEmpty) {
|
||||||
options.headers['X-Api-Token'] = apiToken;
|
options.headers['X-Api-Token'] = apiToken;
|
||||||
@@ -42,7 +46,7 @@ class _Client {
|
|||||||
|
|
||||||
_instance!.dio = dio;
|
_instance!.dio = dio;
|
||||||
if (isUnixSocket) {
|
if (isUnixSocket) {
|
||||||
(_instance!.dio.httpClientAdapter as DefaultHttpClientAdapter)
|
(_instance!.dio.httpClientAdapter as IOHttpClientAdapter)
|
||||||
.onHttpClientCreate = (client) {
|
.onHttpClientCreate = (client) {
|
||||||
client.connectionFactory =
|
client.connectionFactory =
|
||||||
(Uri uri, String? proxyHost, int? proxyPort) {
|
(Uri uri, String? proxyHost, int? proxyPort) {
|
||||||
@@ -131,5 +135,7 @@ Future<Response<String>> proxyRequest<T>(String uri,
|
|||||||
options.headers ??= {};
|
options.headers ??= {};
|
||||||
options.headers!["X-Target-Uri"] = uri;
|
options.headers!["X-Target-Uri"] = uri;
|
||||||
|
|
||||||
return _client.dio.request("/api/v1/proxy", data: data, options: options);
|
// add timestamp to avoid cache
|
||||||
|
return _client.dio.request("/api/v1/proxy?t=${DateTime.now()}",
|
||||||
|
data: data, options: options);
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,17 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:gopeed/api/api.dart';
|
||||||
|
|
||||||
class SettingController extends GetxController {
|
class SettingController extends GetxController {
|
||||||
final tapStatues = <String, bool>{}.obs;
|
final tapStatues = <String, bool>{}.obs;
|
||||||
|
final latestVersion = "".obs;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
fetchLatestVersion();
|
||||||
|
}
|
||||||
|
|
||||||
// set all tap status to false
|
// set all tap status to false
|
||||||
void clearTap() {
|
void clearTap() {
|
||||||
@@ -13,4 +23,22 @@ class SettingController extends GetxController {
|
|||||||
clearTap();
|
clearTap();
|
||||||
tapStatues[key] = true;
|
tapStatues[key] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fetch latest version
|
||||||
|
void fetchLatestVersion() async {
|
||||||
|
String? releaseDataStr;
|
||||||
|
try {
|
||||||
|
releaseDataStr =
|
||||||
|
(await proxyRequest("https://gopeed.com/api/release")).data;
|
||||||
|
} catch (e) {
|
||||||
|
releaseDataStr = (await proxyRequest(
|
||||||
|
"https://api.github.com/repos/GopeedLab/gopeed/releases/latest"))
|
||||||
|
.data;
|
||||||
|
}
|
||||||
|
if (releaseDataStr == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final releaseData = jsonDecode(releaseDataStr);
|
||||||
|
latestVersion.value = releaseData["tag_name"].substring(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@ import 'package:get/get.dart';
|
|||||||
import '../../../../util/message.dart';
|
import '../../../../util/message.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
import 'package:badges/badges.dart' as badges;
|
||||||
|
|
||||||
import '../../../../generated/locales.g.dart';
|
import '../../../../generated/locales.g.dart';
|
||||||
import '../../../../util/localeManager.dart';
|
import '../../../../util/localeManager.dart';
|
||||||
@@ -236,10 +237,45 @@ class SettingView extends GetView<SettingController> {
|
|||||||
mode: LaunchMode.externalApplication);
|
mode: LaunchMode.externalApplication);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
buildVersion() => ListTile(
|
buildVersion() {
|
||||||
title: Text('version'.tr),
|
final hasNewVersion = controller.latestVersion.value != '' &&
|
||||||
subtitle: Text(packageInfo.version),
|
controller.latestVersion.value != packageInfo.version;
|
||||||
);
|
return ListTile(
|
||||||
|
title: hasNewVersion
|
||||||
|
? badges.Badge(
|
||||||
|
position: badges.BadgePosition.topStart(start: 36),
|
||||||
|
child: Text('version'.tr))
|
||||||
|
: Text('version'.tr),
|
||||||
|
subtitle: Text(packageInfo.version),
|
||||||
|
onTap: () {
|
||||||
|
if (hasNewVersion) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AlertDialog(
|
||||||
|
content: Text('newVersionTitle'.trParams(
|
||||||
|
{'version': controller.latestVersion.value})),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
Get.back();
|
||||||
|
},
|
||||||
|
child: Text('newVersionLater'.tr),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
launchUrl(
|
||||||
|
Uri.parse(
|
||||||
|
'https://github.com/GopeedLab/gopeed/releases/latest'),
|
||||||
|
mode: LaunchMode.externalApplication);
|
||||||
|
},
|
||||||
|
child: Text('newVersionUpdate'.tr),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// advanced config items start
|
// advanced config items start
|
||||||
final buildApiProtocol = _buildConfigItem(
|
final buildApiProtocol = _buildConfigItem(
|
||||||
|
|||||||
@@ -24,30 +24,37 @@ class BuildTaskListView extends GetView {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
actions: <Widget>[
|
// actions: <Widget>[
|
||||||
IconButton(
|
// // IconButton(
|
||||||
icon: const Icon(Icons.add),
|
// // icon: const Icon(Icons.add),
|
||||||
tooltip: 'create'.tr,
|
// // tooltip: 'create'.tr,
|
||||||
onPressed: () {
|
// // onPressed: () {
|
||||||
Get.rootDelegate.toNamed(Routes.CREATE);
|
// // Get.rootDelegate.toNamed(Routes.CREATE);
|
||||||
},
|
// // },
|
||||||
|
// // ),
|
||||||
|
// //TODO appBar toggleALl/start selected/delete selected/
|
||||||
|
// // IconButton(
|
||||||
|
// // icon: const Icon(Icons.pause),
|
||||||
|
// // tooltip: 'title'.tr,
|
||||||
|
// // onPressed: () {
|
||||||
|
// // // pause all
|
||||||
|
// // },
|
||||||
|
// // ),
|
||||||
|
// // IconButton(
|
||||||
|
// // icon: const Icon(Icons.delete),
|
||||||
|
// // tooltip: 'title'.tr,
|
||||||
|
// // onPressed: () {
|
||||||
|
// // // delete all
|
||||||
|
// // },
|
||||||
|
// // )
|
||||||
|
// ],
|
||||||
),
|
),
|
||||||
//TODO appBar toggleALl/start selected/delete selected/
|
floatingActionButton: FloatingActionButton(
|
||||||
// IconButton(
|
onPressed: () {
|
||||||
// icon: const Icon(Icons.pause),
|
Get.rootDelegate.toNamed(Routes.CREATE);
|
||||||
// tooltip: 'title'.tr,
|
},
|
||||||
// onPressed: () {
|
tooltip: 'create'.tr,
|
||||||
// // pause all
|
child: const Icon(Icons.add),
|
||||||
// },
|
|
||||||
// ),
|
|
||||||
// IconButton(
|
|
||||||
// icon: const Icon(Icons.delete),
|
|
||||||
// tooltip: 'title'.tr,
|
|
||||||
// onPressed: () {
|
|
||||||
// // delete all
|
|
||||||
// },
|
|
||||||
// )
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
body: Obx(() {
|
body: Obx(() {
|
||||||
return buildTaskList(context, tasks);
|
return buildTaskList(context, tasks);
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ class LocaleKeys {
|
|||||||
static const deleteTask = 'deleteTask';
|
static const deleteTask = 'deleteTask';
|
||||||
static const deleteTaskTip = 'deleteTaskTip';
|
static const deleteTaskTip = 'deleteTaskTip';
|
||||||
static const delete = 'delete';
|
static const delete = 'delete';
|
||||||
|
static const newVersionTitle = 'newVersionTitle';
|
||||||
|
static const newVersionUpdate = 'newVersionUpdate';
|
||||||
|
static const newVersionLater = 'newVersionLater';
|
||||||
}
|
}
|
||||||
|
|
||||||
class Locales {
|
class Locales {
|
||||||
@@ -121,6 +124,9 @@ class Locales {
|
|||||||
'deleteTask': 'Delete Task',
|
'deleteTask': 'Delete Task',
|
||||||
'deleteTaskTip': 'Keep downloaded files',
|
'deleteTaskTip': 'Keep downloaded files',
|
||||||
'delete': 'Delete',
|
'delete': 'Delete',
|
||||||
|
'newVersionTitle': 'Discover new version @version',
|
||||||
|
'newVersionUpdate': 'Download Now',
|
||||||
|
'newVersionLater': 'Later',
|
||||||
};
|
};
|
||||||
static const fa_IR = {
|
static const fa_IR = {
|
||||||
'label': 'فارسی',
|
'label': 'فارسی',
|
||||||
@@ -132,9 +138,12 @@ class Locales {
|
|||||||
'task': 'کار',
|
'task': 'کار',
|
||||||
'setting': 'تنظیمات',
|
'setting': 'تنظیمات',
|
||||||
'create': 'ایجاد کار',
|
'create': 'ایجاد کار',
|
||||||
|
'downloading': 'دانلود کردن',
|
||||||
|
'downloaded': 'دانلود شدن',
|
||||||
'downloadLink': 'لینک دانلود',
|
'downloadLink': 'لینک دانلود',
|
||||||
'downloadLinkValid': 'لطفا لینک دانلود را وارد کنید',
|
'downloadLinkValid': 'لطفا لینک دانلود را وارد کنید',
|
||||||
'download': 'دانلود',
|
'download': 'دانلود',
|
||||||
|
'noFileSelected': 'لطفا حداقل یک فایل را جهت دانلود انتخاب کنید.',
|
||||||
'noStoragePermission': 'مجوز ذخیره سازی مورد نیاز است',
|
'noStoragePermission': 'مجوز ذخیره سازی مورد نیاز است',
|
||||||
'selectFile': 'انتخاب فایل',
|
'selectFile': 'انتخاب فایل',
|
||||||
'basic': 'پایه',
|
'basic': 'پایه',
|
||||||
@@ -170,6 +179,9 @@ class Locales {
|
|||||||
'deleteTask': 'پاک کردن کار',
|
'deleteTask': 'پاک کردن کار',
|
||||||
'deleteTaskTip': 'فایل های دانلود شده را نگه دارد',
|
'deleteTaskTip': 'فایل های دانلود شده را نگه دارد',
|
||||||
'delete': 'پاک کردن',
|
'delete': 'پاک کردن',
|
||||||
|
'newVersionTitle': '@version عنوان: کشف نسخه جدید',
|
||||||
|
'newVersionUpdate': 'دریافت اکنون',
|
||||||
|
'newVersionLater': 'بعداً',
|
||||||
};
|
};
|
||||||
static const ru_RU = {
|
static const ru_RU = {
|
||||||
'label': 'Русский(Россия)',
|
'label': 'Русский(Россия)',
|
||||||
@@ -179,6 +191,8 @@ class Locales {
|
|||||||
'cancel': 'Отмена',
|
'cancel': 'Отмена',
|
||||||
'selectAll': 'Выбрать все',
|
'selectAll': 'Выбрать все',
|
||||||
'task': 'Задачи',
|
'task': 'Задачи',
|
||||||
|
'downloading': 'Загрузка',
|
||||||
|
'downloaded': 'Загружено',
|
||||||
'setting': 'Настройки',
|
'setting': 'Настройки',
|
||||||
'create': 'Создать задачу',
|
'create': 'Создать задачу',
|
||||||
'downloadLink': 'Ссылка для скачивание',
|
'downloadLink': 'Ссылка для скачивание',
|
||||||
@@ -187,6 +201,7 @@ class Locales {
|
|||||||
'Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append',
|
'Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append',
|
||||||
'downloadLinkHitDesktop': ', или перетащите сюда торрент-файл',
|
'downloadLinkHitDesktop': ', или перетащите сюда торрент-файл',
|
||||||
'download': 'Скачать',
|
'download': 'Скачать',
|
||||||
|
'noFileSelected': 'Файл не выбран',
|
||||||
'noStoragePermission': 'Требуется доступ к хранилищу',
|
'noStoragePermission': 'Требуется доступ к хранилищу',
|
||||||
'selectFile': 'Выберать файл',
|
'selectFile': 'Выберать файл',
|
||||||
'basic': 'Основные параметры',
|
'basic': 'Основные параметры',
|
||||||
@@ -222,6 +237,9 @@ class Locales {
|
|||||||
'deleteTask': 'Удалить задачу',
|
'deleteTask': 'Удалить задачу',
|
||||||
'deleteTaskTip': 'Сохранить загруженные файлы',
|
'deleteTaskTip': 'Сохранить загруженные файлы',
|
||||||
'delete': 'Удалить',
|
'delete': 'Удалить',
|
||||||
|
'newVersionTitle': 'Обнаружена новая версия @version',
|
||||||
|
'newVersionUpdate': 'Скачать сейчас',
|
||||||
|
'newVersionLater': 'позже',
|
||||||
};
|
};
|
||||||
static const zh_CN = {
|
static const zh_CN = {
|
||||||
'label': '中文(简体)',
|
'label': '中文(简体)',
|
||||||
@@ -275,5 +293,8 @@ class Locales {
|
|||||||
'deleteTask': '删除任务',
|
'deleteTask': '删除任务',
|
||||||
'deleteTaskTip': '保留已下载的文件',
|
'deleteTaskTip': '保留已下载的文件',
|
||||||
'delete': '删除',
|
'delete': '删除',
|
||||||
|
'newVersionTitle': '发现新版本 @version',
|
||||||
|
'newVersionUpdate': '立即下载',
|
||||||
|
'newVersionLater': '稍后再说',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
+12
-4
@@ -41,6 +41,14 @@ packages:
|
|||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.10.0"
|
version: "2.10.0"
|
||||||
|
badges:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: badges
|
||||||
|
sha256: d33d4e07197d6e61ddc940640f2b4dc303d3c80887011344940e24d7522f8d26
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "3.0.3"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -221,10 +229,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: dio
|
name: dio
|
||||||
sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8"
|
sha256: "0894a098594263fe1caaba3520e3016d8a855caeb010a882273189cca10f11e9"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.6"
|
version: "5.1.1"
|
||||||
fake_async:
|
fake_async:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -466,10 +474,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: logging_appenders
|
name: logging_appenders
|
||||||
sha256: "013e8548b79e3b8dc0333f3efae706184356b5926c6bea59150efa126c91598c"
|
sha256: c2ea00fb779a81e995943f1e3e6e6969d463de3882d134d78ad58e76f2b6f1b1
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.0.2"
|
||||||
lottie:
|
lottie:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
|||||||
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
|
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
|
||||||
# Read more about iOS versioning at
|
# Read more about iOS versioning at
|
||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
version: 1.2.3+1
|
version: 1.3.0+1
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.17.6 <3.0.0"
|
sdk: ">=2.17.6 <3.0.0"
|
||||||
@@ -40,7 +40,7 @@ dependencies:
|
|||||||
styled_widget: ^0.4.0+3
|
styled_widget: ^0.4.0+3
|
||||||
context_menus: ^1.0.2
|
context_menus: ^1.0.2
|
||||||
json_annotation: ^4.6.0
|
json_annotation: ^4.6.0
|
||||||
dio: ^4.0.6
|
dio: ^5.1.1
|
||||||
path_provider: ^2.0.11
|
path_provider: ^2.0.11
|
||||||
file_picker: ^5.2.5
|
file_picker: ^5.2.5
|
||||||
macos_secure_bookmarks: ^0.2.1
|
macos_secure_bookmarks: ^0.2.1
|
||||||
@@ -53,6 +53,7 @@ dependencies:
|
|||||||
package_info_plus: ^3.0.2
|
package_info_plus: ^3.0.2
|
||||||
fluent_ui: ^4.4.0
|
fluent_ui: ^4.4.0
|
||||||
path: any
|
path: any
|
||||||
|
badges: ^3.0.3
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|||||||
Reference in new issue
Block a user