From 6ca3611c070d888dea7ce625b463b86073ef4871 Mon Sep 17 00:00:00 2001 From: chalkim Date: Thu, 20 Jun 2024 18:44:19 +0800 Subject: [PATCH 1/6] feature: add basic create torrent and publish(qbittorent) --- Dockerfile | 3 +- Dockerfile.s6 | 3 +- Dockerfile.s6.aarch64 | 3 +- Dockerfile.s6.armhf | 3 +- Makefile.torrent | 2 + frontend/public/svg/qbittorrent.svg | 1 + frontend/public/svg/torrent.svg | 2 + frontend/src/api/index.ts | 3 +- frontend/src/api/torrent.ts | 51 ++ frontend/src/components/prompts/Prompts.vue | 4 + frontend/src/components/prompts/Publish.vue | 82 +++ frontend/src/components/prompts/Torrent.vue | 171 +++++++ .../src/components/settings/Permissions.vue | 4 + frontend/src/i18n/zh-cn.json | 16 +- frontend/src/types/api.d.ts | 11 + frontend/src/types/user.d.ts | 1 + frontend/src/views/files/FileListing.vue | 27 + go.mod | 76 ++- go.sum | 478 ++++++++++++++++++ http/http.go | 3 + http/torrent.go | 210 ++++++++ settings/defaults.go | 20 +- torrent/qbittorrent.go | 83 +++ torrent/torrent.go | 30 ++ users.torrent | 1 + users/permissions.go | 1 + users/users.go | 31 +- 27 files changed, 1287 insertions(+), 33 deletions(-) create mode 100644 Makefile.torrent create mode 100644 frontend/public/svg/qbittorrent.svg create mode 100644 frontend/public/svg/torrent.svg create mode 100644 frontend/src/api/torrent.ts create mode 100644 frontend/src/components/prompts/Publish.vue create mode 100644 frontend/src/components/prompts/Torrent.vue create mode 100644 http/torrent.go create mode 100644 torrent/qbittorrent.go create mode 100644 torrent/torrent.go create mode 100644 users.torrent diff --git a/Dockerfile b/Dockerfile index 40a91a06..2539d9e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,8 @@ FROM alpine:latest RUN apk --update add ca-certificates \ mailcap \ curl \ - jq + jq \ + mktorrent COPY healthcheck.sh /healthcheck.sh RUN chmod +x /healthcheck.sh # Make the script executable diff --git a/Dockerfile.s6 b/Dockerfile.s6 index 233feb22..2bba24d6 100644 --- a/Dockerfile.s6 +++ b/Dockerfile.s6 @@ -2,7 +2,8 @@ FROM ghcr.io/linuxserver/baseimage-alpine:3.17 RUN apk --update add ca-certificates \ mailcap \ - curl + curl \ + mktorrent HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \ CMD curl -f http://localhost/health || exit 1 diff --git a/Dockerfile.s6.aarch64 b/Dockerfile.s6.aarch64 index d7f3dcee..821b76a4 100644 --- a/Dockerfile.s6.aarch64 +++ b/Dockerfile.s6.aarch64 @@ -2,7 +2,8 @@ FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.17 RUN apk --update add ca-certificates \ mailcap \ - curl + curl \ + mktorrent HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \ CMD curl -f http://localhost/health || exit 1 diff --git a/Dockerfile.s6.armhf b/Dockerfile.s6.armhf index 17bd1def..158989d3 100644 --- a/Dockerfile.s6.armhf +++ b/Dockerfile.s6.armhf @@ -2,7 +2,8 @@ FROM ghcr.io/linuxserver/baseimage-alpine:arm32v7-3.17 RUN apk --update add ca-certificates \ mailcap \ - curl + curl \ + mktorrent HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \ CMD curl -f http://localhost/health || exit 1 diff --git a/Makefile.torrent b/Makefile.torrent new file mode 100644 index 00000000..cef31f2f --- /dev/null +++ b/Makefile.torrent @@ -0,0 +1,2 @@ +d8:announce34:http://1337.abcvg.info:80/announce13:announce-listll34:http://1337.abcvg.info:80/announceel36:http://207.241.226.111:6969/announceel36:http://207.241.231.226:6969/announceel31:http://49.12.76.8:8080/announceel44:http://[2a01:4f8:c012:8025::1]:8080/announceel47:http://[2a04:ac00:1:3dd8::1:2710]:2710/announceel32:http://bt.okmp3.ru:2710/announceel37:http://bvarf.tracker.sh:2086/announceel29:http://ch3oh.ru:6969/announceel37:http://fosstorrents.com:6969/announceel33:http://ipv6.rer.lol:6969/announceel39:http://isk.richardsw.club:6969/announceel36:http://nyaa.tracker.wf:7777/announceel40:http://open-v6.demonoid.ch:6969/announceel41:http://retracker.hotplug.ru:2710/announceel32:http://t1.aag.moe:17715/announceel35:http://tk.greedland.net:80/announceel35:http://torrentsmd.com:8080/announceel37:http://tracker.bt4g.com:2095/announceel37:http://tracker.dler.com:6969/announceel37:http://tracker.dler.org:6969/announceel38:http://tracker.edkj.club:6969/announceel45:http://tracker.electro-torrent.pl:80/announceel37:http://tracker.files.fm:6969/announceel37:http://tracker.gbitt.info:80/announceel42:http://tracker.ipv6tracker.org:80/announceel41:http://tracker.mywaifu.best:6969/announceel39:http://tracker.renfei.net:8080/announceel36:http://tracker2.dler.org:80/announceel39:http://tracker2.itzmx.com:6961/announceel39:http://tracker3.itzmx.com:6961/announceel39:http://tracker4.itzmx.com:2710/announceel41:http://www.all4nothin.net:80/announce.phpel40:http://www.peckservers.com:9000/announceel39:http://www.wareztorrent.com:80/announceel36:https://1337.abcvg.info:443/announceel31:https://tr.abir.ga:443/announceel43:https://tr.burnabyhighstar.com:443/announceel40:https://tracker.cloudit.top:443/announceel39:https://tracker.gbitt.info:443/announceel40:https://tracker.gcrenwp.top:443/announceel40:https://tracker.ipfsscan.io:443/announceel37:https://tracker.kuroy.me:443/announceel43:https://tracker.lilithraws.org:443/announceel40:https://tracker.loligirl.cn:443/announceel39:https://tracker.pmman.tech:443/announceel39:https://tracker.renfei.net:443/announceel44:https://tracker.tamersunion.org:443/announceel43:https://tracker.yemekyedim.com:443/announceel36:https://tracker1.520.jp:443/announceel39:https://trackers.mlsub.net:443/announceel33:https://trackers.run:443/announceel41:https://www.peckservers.com:9443/announceel36:udp://1c.premierzal.ru:6969/announceel35:udp://207.241.226.111:6969/announceel35:udp://207.241.231.226:6969/announceel30:udp://49.12.76.8:8080/announceel33:udp://52.58.128.163:6969/announceel43:udp://[2a01:4f8:c012:8025::1]:8080/announceel43:udp://[2a03:7220:8083:cd00::1]:451/announceel46:udp://[2a04:ac00:1:3dd8::1:2710]:2710/announceel39:udp://[2a0f:e586:f:f::81]:6969/announceel30:udp://aegir.sexy:6969/announceel33:udp://amigacity.xyz:6969/announceel36:udp://bt.ktrackers.com:6666/announceel35:udp://bt1.archive.org:6969/announceel35:udp://bt2.archive.org:6969/announceel38:udp://bubu.mapfactor.com:6969/announceel30:udp://concen.org:6969/announceel44:udp://d40969.acod.regrucolo.ru:6969/announceel70:udp://ec2-18-191-163-220.us-east-2.compute.amazonaws.com:6969/announceel29:udp://epider.me:6969/announceel27:udp://evan.im:6969/announceel37:udp://exodus.desync.com:6969/announceel38:udp://fh2.cmp-gaming.com:6969/announceel39:udp://inferno.demonoid.is:3391/announceel32:udp://ipv4.rer.lol:2710/announceel37:udp://ipv6.fuuuuuck.com:6969/announceel38:udp://isk.richardsw.club:6969/announceel30:udp://jutone.com:6969/announceel36:udp://leet-tracker.moe:1337/announceel36:udp://martin-gebhardt.eu:25/announceel35:udp://moonburrow.club:6969/announceel32:udp://new-line.net:6969/announceel29:udp://odd-hd.fr:6969/announceel35:udp://oh.fuuuuuck.com:6969/announceel44:udp://open-tracker.demonoid.ch:6969/announceel36:udp://open.demonii.com:1337/announceel36:udp://open.demonoid.ch:6969/announceel33:udp://open.dstud.io:6969/announceel40:udp://open.free-tracker.ga:6969/announceel33:udp://open.stealth.si:80/announceel36:udp://open.tracker.ink:6969/announceel31:udp://open.u-p.pw:6969/announceel31:udp://opentor.org:2710/announceel34:udp://opentracker.io:6969/announceel41:udp://p2p.publictracker.xyz:6969/announceel35:udp://p4p.arenabg.com:1337/announceel44:udp://public.publictracker.xyz:6969/announceel46:udp://public.tracker.vraphim.com:6969/announceel40:udp://retracker.hotplug.ru:2710/announceel38:udp://retracker.lanta.me:2710/announceel50:udp://retracker01-msk-virt.corbina.net:80/announceel41:udp://run.publictracker.xyz:6969/announceel29:udp://ryjer.com:6969/announceel32:udp://seedpeer.net:6969/announceel33:udp://tamas3.ynh.fr:6969/announceel42:udp://tk1.trackerservers.com:8080/announceel42:udp://tk2.trackerservers.com:8080/announceel44:udp://tk2v6.trackerservers.com:8080/announceel43:udp://torrents.artixlinux.org:6969/announceel40:udp://tracker-udp.gbitt.info:80/announceel37:udp://tracker.0x7c0.com:6969/announceel41:udp://tracker.birkenwald.de:6969/announceel37:udp://tracker.bittor.pw:1337/announceel37:udp://tracker.breizh.pm:6969/announceel35:udp://tracker.ccp.ovh:6969/announceel38:udp://tracker.cyberia.is:6969/announceel45:udp://tracker.darkness.services:6969/announceel43:udp://tracker.ddunlimited.net:6969/announceel40:udp://tracker.deadorbit.nl:6969/announceel36:udp://tracker.dler.com:6969/announceel36:udp://tracker.dler.org:6969/announceel39:udp://tracker.draatman.uk:6969/announceel35:udp://tracker.dump.cl:6969/announceel37:udp://tracker.edkj.club:6969/announceel38:udp://tracker.farted.net:6969/announceel40:udp://tracker.filemail.com:6969/announceel36:udp://tracker.fnix.net:6969/announceel34:udp://tracker.gmi.gd:6969/announceel44:udp://tracker.jamesthebard.net:6969/announceel38:udp://tracker.moeking.me:6969/announceel42:udp://tracker.opentrackr.org:1337/announceel33:udp://tracker.qu.ax:6969/announceel40:udp://tracker.silksa.co.za:6969/announceel37:udp://tracker.skyts.net:6969/announceel37:udp://tracker.srv00.com:6969/announceel38:udp://tracker.theoks.net:6969/announceel40:udp://tracker.tiny-vps.com:6969/announceel41:udp://tracker.torrent.eu.org:451/announceel40:udp://tracker.tryhackx.org:6969/announceel40:udp://tracker1.myporn.club:9337/announceel35:udp://tracker2.dler.org:80/announceel38:udp://tracker2.itzmx.com:6961/announceel38:udp://tracker3.itzmx.com:6961/announceel38:udp://tracker4.itzmx.com:2710/announceel45:udp://ttk2.nbaonlineservice.com:6969/announceel44:udp://u.peer-exchange.download:6969/announceel37:udp://u4.trakx.crim.ist:1337/announceel37:udp://u6.trakx.crim.ist:1337/announceel31:udp://wepzone.net:6969/announceel37:udp://www.torrent.eu.org:451/announceel30:udp://z.mercax.com:53/announceel45:wss://tracker.openwebtorrent.com:443/announceee10:created by13:mktorrent 1.113:creation datei1718738276e4:infod6:lengthi1826e4:name8:Makefile12:piece lengthi262144e6:pieces20: +!uTwee \ No newline at end of file diff --git a/frontend/public/svg/qbittorrent.svg b/frontend/public/svg/qbittorrent.svg new file mode 100644 index 00000000..01c99f79 --- /dev/null +++ b/frontend/public/svg/qbittorrent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/svg/torrent.svg b/frontend/public/svg/torrent.svg new file mode 100644 index 00000000..a3c55155 --- /dev/null +++ b/frontend/public/svg/torrent.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index abc189dc..ddc16709 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -3,7 +3,8 @@ import * as share from "./share"; import * as users from "./users"; import * as settings from "./settings"; import * as pub from "./pub"; +import * as torrent from "./torrent"; import search from "./search"; import commands from "./commands"; -export { files, share, users, settings, pub, commands, search }; +export { files, share, users, settings, pub, torrent, commands, search }; diff --git a/frontend/src/api/torrent.ts b/frontend/src/api/torrent.ts new file mode 100644 index 00000000..ba63309b --- /dev/null +++ b/frontend/src/api/torrent.ts @@ -0,0 +1,51 @@ +import { fetchURL, fetchJSON, removePrefix, createURL } from "./utils"; + +export async function makeTorrent( + url: string, + announces: string[], + comment: string, + date: boolean, + name: string, + pieceLen: number, + privateFlag: boolean, + source: string, + webSeeds: string[] +) { + // Construct the URL for torrent creation API + url = removePrefix(url); + url = `/api/torrent${url}`; + + let body = "{}"; + if (announces.length > 0) { + body = JSON.stringify({ + announces: announces, + comment: comment, + date: date, + name: name, + pieceLen: pieceLen, + private: privateFlag, + source: source, + webSeeds: webSeeds, + }); + } + + // Send POST request to create the torrent + return fetchJSON(url, { + method: "POST", + body: body, + }); +} + +export function publish( + url: string +) { + url = removePrefix(url); + url = `/api/publish${url}`; + + let body = "{}"; + + return fetchJSON(url, { + method: "POST", + body: body, + }); +} \ No newline at end of file diff --git a/frontend/src/components/prompts/Prompts.vue b/frontend/src/components/prompts/Prompts.vue index 4ecde794..7b3147fd 100644 --- a/frontend/src/components/prompts/Prompts.vue +++ b/frontend/src/components/prompts/Prompts.vue @@ -15,6 +15,8 @@ import Delete from "./Delete.vue"; import DeleteUser from "./DeleteUser.vue"; import Download from "./Download.vue"; import Rename from "./Rename.vue"; +import Torrent from "./Torrent.vue"; +import Publish from "./Publish.vue"; import Move from "./Move.vue"; import Copy from "./Copy.vue"; import NewFile from "./NewFile.vue"; @@ -37,6 +39,8 @@ const components = new Map([ ["help", Help], ["delete", Delete], ["rename", Rename], + ["torrent", Torrent], + ["publish", Publish], ["move", Move], ["copy", Copy], ["newFile", NewFile], diff --git a/frontend/src/components/prompts/Publish.vue b/frontend/src/components/prompts/Publish.vue new file mode 100644 index 00000000..e4835fc0 --- /dev/null +++ b/frontend/src/components/prompts/Publish.vue @@ -0,0 +1,82 @@ + + + diff --git a/frontend/src/components/prompts/Torrent.vue b/frontend/src/components/prompts/Torrent.vue new file mode 100644 index 00000000..3440223b --- /dev/null +++ b/frontend/src/components/prompts/Torrent.vue @@ -0,0 +1,171 @@ + + + diff --git a/frontend/src/components/settings/Permissions.vue b/frontend/src/components/settings/Permissions.vue index 13d2b936..ae16be2a 100644 --- a/frontend/src/components/settings/Permissions.vue +++ b/frontend/src/components/settings/Permissions.vue @@ -36,6 +36,10 @@ {{ $t("settings.perm.share") }}

+

+ + {{ $t("settings.perm.torrent") }} +

diff --git a/frontend/src/i18n/zh-cn.json b/frontend/src/i18n/zh-cn.json index 1aea4134..db998d71 100644 --- a/frontend/src/i18n/zh-cn.json +++ b/frontend/src/i18n/zh-cn.json @@ -14,6 +14,7 @@ "folder": "文件夹", "hideDotfiles": "不显示隐藏文件", "info": "信息", + "torrent": "制作 Torrent", "more": "更多", "move": "移动", "moveFile": "移动文件", @@ -117,6 +118,8 @@ "fileInfo": "文件信息", "filesSelected": "已选择 {count} 个文件。", "lastModified": "最后修改", + "makeTorrentMessageSingle": "你确定要创建这个文件的种子吗?", + "makeTorrentMessageMultiple": "你确定要创建这 {count} 个文件的种子吗?", "move": "移动", "moveMessage": "请选择目标目录:", "newArchetype": "创建一个基于原型的新帖子。你的文件将会创建在内容文件夹中。", @@ -140,7 +143,12 @@ "optionalPassword": "密码(选填,不填即无密码)", "resolution": "分辨率", "deleteUser": "你确定要删除这个用户吗?", - "discardEditorChanges": "你确定要放弃所做的更改吗?" + "discardEditorChanges": "你确定要放弃所做的更改吗?", + "trackersList": "Tracker URL:", + "comment": "注释:", + "webSeeds": "Web 种子 URL:", + "source": "源:", + "privateTorrent": "私有torrent(不会在DHT网络上分发)" }, "search": { "images": "图像", @@ -205,7 +213,8 @@ "execute": "执行命令", "modify": "编辑", "rename": "重命名或移动文件和文件夹", - "share": "分享文件" + "share": "分享文件", + "torrent": "BT制种" }, "permissions": "权限", "permissionsHelp": "你可以将该用户设置为管理员或单独选择各项权限。如果你选择了“管理员”,则其他的选项会被自动选中,同时该用户可以管理其他用户。\n", @@ -252,7 +261,8 @@ "siteSettings": "网站设置" }, "success": { - "linkCopied": "链接已复制!" + "linkCopied": "链接已复制!", + "torrentCreated": "种子已创建!" }, "time": { "days": "天", diff --git a/frontend/src/types/api.d.ts b/frontend/src/types/api.d.ts index 66685e5e..91286177 100644 --- a/frontend/src/types/api.d.ts +++ b/frontend/src/types/api.d.ts @@ -31,3 +31,14 @@ interface Share { interface SearchParams { [key: string]: string; } + +interface Torrent { + announces: string[]; + comment: string; + date: boolean; + name: string; + pieceLen: number; + private: boolean; + source: string; + webSeeds: string[]; +} \ No newline at end of file diff --git a/frontend/src/types/user.d.ts b/frontend/src/types/user.d.ts index b81806fc..e9e3d6cc 100644 --- a/frontend/src/types/user.d.ts +++ b/frontend/src/types/user.d.ts @@ -45,6 +45,7 @@ interface Permissions { share: boolean; shell: boolean; upload: boolean; + torrent: boolean; } interface Sorting { diff --git a/frontend/src/views/files/FileListing.vue b/frontend/src/views/files/FileListing.vue index a26ac67e..9ced6f0b 100644 --- a/frontend/src/views/files/FileListing.vue +++ b/frontend/src/views/files/FileListing.vue @@ -12,6 +12,20 @@