feat: add get all torrents api

This commit is contained in:
Simon Ding
2024-07-27 09:26:51 +08:00
parent 51fc5c3c74
commit b2a092c64e
7 changed files with 124 additions and 83 deletions

0
doc/quick_start.md Normal file
View File

View File

@@ -41,9 +41,9 @@ func SetLogLevel(l string) {
case "info": case "info":
atom.SetLevel(zap.InfoLevel) atom.SetLevel(zap.InfoLevel)
Info("set log level to info") Info("set log level to info")
case "warn", "warnning": case "warn", "warning":
atom.SetLevel(zap.WarnLevel) atom.SetLevel(zap.WarnLevel)
Warn("set log level to warnning") Warn("set log level to warning")
case "error": case "error":
atom.SetLevel(zap.ErrorLevel) atom.SetLevel(zap.ErrorLevel)
Error("set log level to error") Error("set log level to error")

View File

@@ -45,6 +45,22 @@ type Client struct {
cfg Config cfg Config
} }
func (c *Client) GetAll() ([]*Torrent, error) {
all, err := c.c.TorrentGetAll(context.TODO())
if err != nil {
return nil, errors.Wrap(err, "get all")
}
var torrents []*Torrent
for _, t := range all {
torrents = append(torrents, &Torrent{
ID: *t.ID,
c: c.c,
Config: c.cfg,
})
}
return torrents, nil
}
func (c *Client) Download(link, dir string) (*Torrent, error) { func (c *Client) Download(link, dir string) (*Torrent, error) {
if strings.HasPrefix(link, "http") { if strings.HasPrefix(link, "http") {
client := &http.Client{ client := &http.Client{

View File

@@ -93,3 +93,33 @@ func (s *Server) GetMediaDownloadHistory(c *gin.Context) (interface{}, error) {
} }
return his, nil return his, nil
} }
type TorrentInfo struct {
Name string `json:"name"`
ID int64 `json:"id"`
SeedRatio float32 `json:"seed_ratio"`
Progress int `json:"progress"`
}
func (s *Server) GetAllTorrents(c *gin.Context) (interface{}, error) {
trc, err := s.getDownloadClient()
if err != nil {
return nil, errors.Wrap(err, "connect transmission")
}
all, err := trc.GetAll()
if err != nil {
return nil, errors.Wrap(err, "get all")
}
var infos []TorrentInfo
for _, t := range all {
if !t.Exists() {
continue
}
infos = append(infos, TorrentInfo{
Name: t.Name(),
ID: t.ID,
Progress: t.Progress(),
})
}
return infos, nil
}

View File

@@ -110,10 +110,6 @@ func SearchMovie(db1 *db.Client, movieId int, checkResolution bool) ([]torznab.R
if meta.Year != year && meta.Year != year-1 && meta.Year != year+1 { //year not match if meta.Year != year && meta.Year != year-1 && meta.Year != year+1 { //year not match
continue continue
} }
if utils.ContainsIgnoreCase(r.Name, "soundtrack") {
//ignore soundtracks
continue
}
filtered = append(filtered, r) filtered = append(filtered, r)

View File

@@ -73,6 +73,7 @@ func (s *Server) Serve() error {
activity.GET("/", HttpHandler(s.GetAllActivities)) activity.GET("/", HttpHandler(s.GetAllActivities))
activity.DELETE("/:id", HttpHandler(s.RemoveActivity)) activity.DELETE("/:id", HttpHandler(s.RemoveActivity))
activity.GET("/media/:id", HttpHandler(s.GetMediaDownloadHistory)) activity.GET("/media/:id", HttpHandler(s.GetMediaDownloadHistory))
activity.GET("/torrents", HttpHandler(s.GetAllTorrents))
} }
tv := api.Group("/media") tv := api.Group("/media")

View File

@@ -30,84 +30,82 @@ class _SystemSettingsPageState extends ConsumerState<SystemSettingsPage> {
var tmdbSetting = settings.when( var tmdbSetting = settings.when(
data: (v) { data: (v) {
return Container( return FormBuilder(
padding: const EdgeInsets.fromLTRB(40, 10, 40, 0), key: _formKey, //设置globalKey用于后面获取FormState
child: FormBuilder( autovalidateMode: AutovalidateMode.onUserInteraction,
key: _formKey, //设置globalKey用于后面获取FormState initialValue: {
autovalidateMode: AutovalidateMode.onUserInteraction, "tmdb_api": v.tmdbApiKey,
initialValue: { "download_dir": v.downloadDIr,
"tmdb_api": v.tmdbApiKey, "log_level": v.logLevel
"download_dir": v.downloadDIr, },
"log_level": v.logLevel child: Column(
}, crossAxisAlignment: CrossAxisAlignment.start,
child: Column( children: [
crossAxisAlignment: CrossAxisAlignment.start, FormBuilderTextField(
children: [ name: "tmdb_api",
FormBuilderTextField( autofocus: true,
name: "tmdb_api", decoration: Commons.requiredTextFieldStyle(
autofocus: true, text: "TMDB Api Key", icon: const Icon(Icons.key)),
decoration: Commons.requiredTextFieldStyle( //
text: "TMDB Api Key", icon: const Icon(Icons.key)), validator: FormBuilderValidators.required(),
//
validator: FormBuilderValidators.required(),
),
FormBuilderTextField(
name: "download_dir",
autofocus: true,
decoration: Commons.requiredTextFieldStyle(
text: "下载路径", icon: const Icon(Icons.folder)),
//
validator: FormBuilderValidators.required(),
),
SizedBox(
width: 300,
child: FormBuilderDropdown(
name: "log_level",
decoration: const InputDecoration(
labelText: "日志级别",
icon: Icon(Icons.file_present_rounded),
),
items: const [
DropdownMenuItem(
value: "debug", child: Text("DEBUG")),
DropdownMenuItem(value: "info", child: Text("INFO")),
DropdownMenuItem(
value: "warn", child: Text("WARNING")),
DropdownMenuItem(
value: "error", child: Text("ERROR")),
],
validator: FormBuilderValidators.required(),
),
),
Center(
child: Padding(
padding: const EdgeInsets.only(top: 28.0),
child: ElevatedButton(
child: const Padding(
padding: EdgeInsets.all(16.0),
child: Text("保存"),
),
onPressed: () {
if (_formKey.currentState!.saveAndValidate()) {
var values = _formKey.currentState!.value;
var f = ref
.read(settingProvider.notifier)
.updateSettings(GeneralSetting(
tmdbApiKey: values["tmdb_api"],
downloadDIr: values["download_dir"],
logLevel: values["log_level"]));
f.then((v) {
Utils.showSnakeBar("更新成功");
}).onError((e, s) {
Utils.showSnakeBar("更新失败:$e");
});
}
}),
),
)
],
), ),
)); FormBuilderTextField(
name: "download_dir",
autofocus: true,
decoration: Commons.requiredTextFieldStyle(
text: "下载路径", icon: const Icon(Icons.folder)),
//
validator: FormBuilderValidators.required(),
),
SizedBox(
width: 300,
child: FormBuilderDropdown(
name: "log_level",
decoration: const InputDecoration(
labelText: "日志级别",
icon: Icon(Icons.file_present_rounded),
),
items: const [
DropdownMenuItem(
value: "debug", child: Text("DEBUG")),
DropdownMenuItem(value: "info", child: Text("INFO")),
DropdownMenuItem(
value: "warn", child: Text("WARNING")),
DropdownMenuItem(
value: "error", child: Text("ERROR")),
],
validator: FormBuilderValidators.required(),
),
),
Center(
child: Padding(
padding: const EdgeInsets.only(top: 28.0),
child: ElevatedButton(
child: const Padding(
padding: EdgeInsets.all(16.0),
child: Text("保存"),
),
onPressed: () {
if (_formKey.currentState!.saveAndValidate()) {
var values = _formKey.currentState!.value;
var f = ref
.read(settingProvider.notifier)
.updateSettings(GeneralSetting(
tmdbApiKey: values["tmdb_api"],
downloadDIr: values["download_dir"],
logLevel: values["log_level"]));
f.then((v) {
Utils.showSnakeBar("更新成功");
}).onError((e, s) {
Utils.showSnakeBar("更新失败:$e");
});
}
}),
),
)
],
),
);
}, },
error: (err, trace) => Text("$err"), error: (err, trace) => Text("$err"),
loading: () => const MyProgressIndicator()); loading: () => const MyProgressIndicator());