Upload 26 files
Browse files- .env +3 -0
- .env_sample +4 -0
- assets/nyaa.public.db +2 -0
- assets/servers.db +3 -0
- assets/ygg.db +4 -0
- go.mod +94 -0
- go.sum +549 -0
- helpers.go +217 -0
- main.go +420 -0
- persistence/.gitignore +1 -0
- rd.go +175 -0
- temp/.gitignore +1 -0
- torrent.client.go +21 -0
- types/imdb.meta.go +79 -0
- types/jackett.rss.go +73 -0
- types/kitsu.meta.go +52 -0
- types/manifest.go +13 -0
- types/rd/addtorrent.rd.go +6 -0
- types/rd/availability.rd.go +8 -0
- types/rd/error.rd.go +7 -0
- types/rd/torrentInfo.rd.go +24 -0
- types/rd/unrestrictLink.rd.go +15 -0
- types/server.go +6 -0
- types/stream.meta.go +21 -0
- utils.go +288 -0
- utils.go.old +308 -0
.env
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
MAX_RES=100
|
2 |
+
PUBLIC=0
|
3 |
+
PORT=8001
|
.env_sample
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
MAX_RES=100 # max results to receive from the addon
|
2 |
+
PUBLIC=0 # 0 means the tracker is public and 1 otherwise
|
3 |
+
OVERRIDE_API_URL="/api/v2.0/indexers/nyaasi/results/torznab/api?cat=2000,5000,8000"
|
4 |
+
PORT=3000
|
assets/nyaa.public.db
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
http://107.174.205.19:9117|lob0qltgax72dudgufn7onjr7nx2rscw
|
2 |
+
http://172.91.224.183:9117|luuo4utx3hiaigdx2gpdm5pxa9k2kxw2
|
assets/servers.db
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
http://94.23.251.209:9117|9h74moi7ojdkiznbnjs0u06120skuvi7
|
2 |
+
http://91.121.142.198:9117|h3sw93wbzdfxql4gdf42b30r9nj18qm6
|
3 |
+
http://94.23.255.66:9117/jackett|k1uucgr72c7l6a7l2nc45v0nlrsvbuq3
|
assets/ygg.db
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
http://94.23.251.209:9117|9h74moi7ojdkiznbnjs0u06120skuvi7
|
2 |
+
http://91.121.142.198:9117|h3sw93wbzdfxql4gdf42b30r9nj18qm6
|
3 |
+
http://94.23.255.66:9117/jackett|k1uucgr72c7l6a7l2nc45v0nlrsvbuq3
|
4 |
+
http://82.65.164.35:9117|0lxj8zb82mmbnj1d6b2e6h04zb80e94h
|
go.mod
ADDED
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
module github.com/daniwalter001/jackett_fiber
|
2 |
+
|
3 |
+
// +heroku goVersion go1.21
|
4 |
+
go 1.22
|
5 |
+
|
6 |
+
require github.com/gofiber/fiber/v2 v2.52.5
|
7 |
+
|
8 |
+
require github.com/zeebo/bencode v1.0.0 // indirect
|
9 |
+
|
10 |
+
require (
|
11 |
+
github.com/RoaringBitmap/roaring v1.2.3 // indirect
|
12 |
+
github.com/ajwerner/btree v0.0.0-20211221152037-f427b3e689c0 // indirect
|
13 |
+
github.com/alecthomas/atomic v0.1.0-alpha2 // indirect
|
14 |
+
github.com/anacrolix/chansync v0.3.0 // indirect
|
15 |
+
github.com/anacrolix/dht/v2 v2.19.2-0.20221121215055-066ad8494444 // indirect
|
16 |
+
github.com/anacrolix/envpprof v1.3.0 // indirect
|
17 |
+
github.com/anacrolix/generics v0.0.0-20230911070922-5dd7545c6b13 // indirect
|
18 |
+
github.com/anacrolix/go-libutp v1.3.1 // indirect
|
19 |
+
github.com/anacrolix/log v0.14.6-0.20231202035202-ed7a02cad0b4 // indirect
|
20 |
+
github.com/anacrolix/missinggo v1.3.0 // indirect
|
21 |
+
github.com/anacrolix/missinggo/perf v1.0.0 // indirect
|
22 |
+
github.com/anacrolix/missinggo/v2 v2.7.3 // indirect
|
23 |
+
github.com/anacrolix/mmsg v1.0.0 // indirect
|
24 |
+
github.com/anacrolix/multiless v0.3.0 // indirect
|
25 |
+
github.com/anacrolix/stm v0.4.0 // indirect
|
26 |
+
github.com/anacrolix/sync v0.5.1 // indirect
|
27 |
+
github.com/anacrolix/torrent v1.55.0
|
28 |
+
github.com/anacrolix/upnp v0.1.3-0.20220123035249-922794e51c96 // indirect
|
29 |
+
github.com/anacrolix/utp v0.1.0 // indirect
|
30 |
+
github.com/andybalholm/brotli v1.0.5 // indirect
|
31 |
+
github.com/bahlo/generic-list-go v0.2.0 // indirect
|
32 |
+
github.com/benbjohnson/immutable v0.3.0 // indirect
|
33 |
+
github.com/bits-and-blooms/bitset v1.2.2 // indirect
|
34 |
+
github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 // indirect
|
35 |
+
github.com/cespare/xxhash v1.1.0 // indirect
|
36 |
+
github.com/davecgh/go-spew v1.1.1 // indirect
|
37 |
+
github.com/dustin/go-humanize v1.0.0 // indirect
|
38 |
+
github.com/edsrzf/mmap-go v1.1.0 // indirect
|
39 |
+
github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916 // indirect
|
40 |
+
github.com/go-llsqlite/crawshaw v0.4.0 // indirect
|
41 |
+
github.com/go-logr/logr v1.2.3 // indirect
|
42 |
+
github.com/go-logr/stdr v1.2.2 // indirect
|
43 |
+
github.com/google/btree v1.1.2 // indirect
|
44 |
+
github.com/google/uuid v1.5.0 // indirect
|
45 |
+
github.com/gorilla/websocket v1.5.0 // indirect
|
46 |
+
github.com/huandu/xstrings v1.3.2 // indirect
|
47 |
+
github.com/j-muller/go-torrent-parser v0.0.0-20211014072822-db02b4099054
|
48 |
+
github.com/joho/godotenv v1.5.1
|
49 |
+
github.com/klauspost/compress v1.17.0 // indirect
|
50 |
+
github.com/mattn/go-colorable v0.1.13 // indirect
|
51 |
+
github.com/mattn/go-isatty v0.0.20 // indirect
|
52 |
+
github.com/mattn/go-runewidth v0.0.15 // indirect
|
53 |
+
github.com/mschoch/smat v0.2.0 // indirect
|
54 |
+
github.com/pion/datachannel v1.5.2 // indirect
|
55 |
+
github.com/pion/dtls/v2 v2.2.4 // indirect
|
56 |
+
github.com/pion/ice/v2 v2.2.6 // indirect
|
57 |
+
github.com/pion/interceptor v0.1.11 // indirect
|
58 |
+
github.com/pion/logging v0.2.2 // indirect
|
59 |
+
github.com/pion/mdns v0.0.5 // indirect
|
60 |
+
github.com/pion/randutil v0.1.0 // indirect
|
61 |
+
github.com/pion/rtcp v1.2.9 // indirect
|
62 |
+
github.com/pion/rtp v1.7.13 // indirect
|
63 |
+
github.com/pion/sctp v1.8.2 // indirect
|
64 |
+
github.com/pion/sdp/v3 v3.0.5 // indirect
|
65 |
+
github.com/pion/srtp/v2 v2.0.9 // indirect
|
66 |
+
github.com/pion/stun v0.3.5 // indirect
|
67 |
+
github.com/pion/transport v0.13.1 // indirect
|
68 |
+
github.com/pion/transport/v2 v2.0.0 // indirect
|
69 |
+
github.com/pion/turn/v2 v2.0.8 // indirect
|
70 |
+
github.com/pion/udp v0.1.4 // indirect
|
71 |
+
github.com/pion/webrtc/v3 v3.1.42 // indirect
|
72 |
+
github.com/pkg/errors v0.9.1 // indirect
|
73 |
+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
74 |
+
github.com/rivo/uniseg v0.2.0 // indirect
|
75 |
+
github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 // indirect
|
76 |
+
github.com/tidwall/btree v1.6.0 // indirect
|
77 |
+
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
78 |
+
github.com/valyala/fasthttp v1.51.0 // indirect
|
79 |
+
github.com/valyala/tcplisten v1.0.0 // indirect
|
80 |
+
go.etcd.io/bbolt v1.3.6 // indirect
|
81 |
+
go.opentelemetry.io/otel v1.8.0 // indirect
|
82 |
+
go.opentelemetry.io/otel/trace v1.8.0 // indirect
|
83 |
+
golang.org/x/crypto v0.21.0 // indirect
|
84 |
+
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect
|
85 |
+
golang.org/x/net v0.23.0 // indirect
|
86 |
+
golang.org/x/sync v0.3.0 // indirect
|
87 |
+
golang.org/x/sys v0.18.0 // indirect
|
88 |
+
golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
|
89 |
+
modernc.org/libc v1.22.3 // indirect
|
90 |
+
modernc.org/mathutil v1.5.0 // indirect
|
91 |
+
modernc.org/memory v1.5.0 // indirect
|
92 |
+
modernc.org/sqlite v1.21.1 // indirect
|
93 |
+
zombiezen.com/go/sqlite v0.13.1 // indirect
|
94 |
+
)
|
go.sum
ADDED
@@ -0,0 +1,549 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
2 |
+
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
3 |
+
crawshaw.io/iox v0.0.0-20181124134642-c51c3df30797/go.mod h1:sXBiorCo8c46JlQV3oXPKINnZ8mcqnye1EkVkqsectk=
|
4 |
+
crawshaw.io/sqlite v0.3.2/go.mod h1:igAO5JulrQ1DbdZdtVq48mnZUBAPOeFzer7VhDWNtW4=
|
5 |
+
filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU=
|
6 |
+
filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
|
7 |
+
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
8 |
+
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
|
9 |
+
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
10 |
+
github.com/RoaringBitmap/roaring v0.4.7/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w=
|
11 |
+
github.com/RoaringBitmap/roaring v0.4.17/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI=
|
12 |
+
github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
|
13 |
+
github.com/RoaringBitmap/roaring v1.2.3 h1:yqreLINqIrX22ErkKI0vY47/ivtJr6n+kMhVOVmhWBY=
|
14 |
+
github.com/RoaringBitmap/roaring v1.2.3/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
|
15 |
+
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
16 |
+
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
17 |
+
github.com/ajwerner/btree v0.0.0-20211221152037-f427b3e689c0 h1:byYvvbfSo3+9efR4IeReh77gVs4PnNDR3AMOE9NJ7a0=
|
18 |
+
github.com/ajwerner/btree v0.0.0-20211221152037-f427b3e689c0/go.mod h1:q37NoqncT41qKc048STsifIt69LfUJ8SrWWcz/yam5k=
|
19 |
+
github.com/alecthomas/assert/v2 v2.0.0-alpha3 h1:pcHeMvQ3OMstAWgaeaXIAL8uzB9xMm2zlxt+/4ml8lk=
|
20 |
+
github.com/alecthomas/assert/v2 v2.0.0-alpha3/go.mod h1:+zD0lmDXTeQj7TgDgCt0ePWxb0hMC1G+PGTsTCv1B9o=
|
21 |
+
github.com/alecthomas/atomic v0.1.0-alpha2 h1:dqwXmax66gXvHhsOS4pGPZKqYOlTkapELkLb3MNdlH8=
|
22 |
+
github.com/alecthomas/atomic v0.1.0-alpha2/go.mod h1:zD6QGEyw49HIq19caJDc2NMXAy8rNi9ROrxtMXATfyI=
|
23 |
+
github.com/alecthomas/repr v0.0.0-20210801044451-80ca428c5142 h1:8Uy0oSf5co/NZXje7U1z8Mpep++QJOldL2hs/sBQf48=
|
24 |
+
github.com/alecthomas/repr v0.0.0-20210801044451-80ca428c5142/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
|
25 |
+
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
26 |
+
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
27 |
+
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
28 |
+
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
29 |
+
github.com/anacrolix/chansync v0.3.0 h1:lRu9tbeuw3wl+PhMu/r+JJCRu5ArFXIluOgdF0ao6/U=
|
30 |
+
github.com/anacrolix/chansync v0.3.0/go.mod h1:DZsatdsdXxD0WiwcGl0nJVwyjCKMDv+knl1q2iBjA2k=
|
31 |
+
github.com/anacrolix/dht/v2 v2.19.2-0.20221121215055-066ad8494444 h1:8V0K09lrGoeT2KRJNOtspA7q+OMxGwQqK/Ug0IiaaRE=
|
32 |
+
github.com/anacrolix/dht/v2 v2.19.2-0.20221121215055-066ad8494444/go.mod h1:MctKM1HS5YYDb3F30NGJxLE+QPuqWoT5ReW/4jt8xew=
|
33 |
+
github.com/anacrolix/envpprof v0.0.0-20180404065416-323002cec2fa/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c=
|
34 |
+
github.com/anacrolix/envpprof v1.0.0/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c=
|
35 |
+
github.com/anacrolix/envpprof v1.1.0/go.mod h1:My7T5oSqVfEn4MD4Meczkw/f5lSIndGAKu/0SM/rkf4=
|
36 |
+
github.com/anacrolix/envpprof v1.3.0 h1:WJt9bpuT7A/CDCxPOv/eeZqHWlle/Y0keJUvc6tcJDk=
|
37 |
+
github.com/anacrolix/envpprof v1.3.0/go.mod h1:7QIG4CaX1uexQ3tqd5+BRa/9e2D02Wcertl6Yh0jCB0=
|
38 |
+
github.com/anacrolix/generics v0.0.0-20230911070922-5dd7545c6b13 h1:qwOprPTDMM3BASJRf84mmZnTXRsPGGJ8xoHKQS7m3so=
|
39 |
+
github.com/anacrolix/generics v0.0.0-20230911070922-5dd7545c6b13/go.mod h1:ff2rHB/joTV03aMSSn/AZNnaIpUw0h3njetGsaXcMy8=
|
40 |
+
github.com/anacrolix/go-libutp v1.3.1 h1:idJzreNLl+hNjGC3ZnUOjujEaryeOGgkwHLqSGoige0=
|
41 |
+
github.com/anacrolix/go-libutp v1.3.1/go.mod h1:heF41EC8kN0qCLMokLBVkB8NXiLwx3t8R8810MTNI5o=
|
42 |
+
github.com/anacrolix/log v0.3.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU=
|
43 |
+
github.com/anacrolix/log v0.6.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU=
|
44 |
+
github.com/anacrolix/log v0.10.1-0.20220123034749-3920702c17f8/go.mod h1:GmnE2c0nvz8pOIPUSC9Rawgefy1sDXqposC2wgtBZE4=
|
45 |
+
github.com/anacrolix/log v0.13.1/go.mod h1:D4+CvN8SnruK6zIFS/xPoRJmtvtnxs+CSfDQ+BFxZ68=
|
46 |
+
github.com/anacrolix/log v0.14.6-0.20231202035202-ed7a02cad0b4 h1:CdVK9IoqoqklXQQ4+L2aew64xsz14KdOD+rnKdTQajg=
|
47 |
+
github.com/anacrolix/log v0.14.6-0.20231202035202-ed7a02cad0b4/go.mod h1:1OmJESOtxQGNMlUO5rcv96Vpp9mfMqXXbe2RdinFLdY=
|
48 |
+
github.com/anacrolix/lsan v0.0.0-20211126052245-807000409a62 h1:P04VG6Td13FHMgS5ZBcJX23NPC/fiC4cp9bXwYujdYM=
|
49 |
+
github.com/anacrolix/lsan v0.0.0-20211126052245-807000409a62/go.mod h1:66cFKPCO7Sl4vbFnAaSq7e4OXtdMhRSBagJGWgmpJbM=
|
50 |
+
github.com/anacrolix/missinggo v0.0.0-20180725070939-60ef2fbf63df/go.mod h1:kwGiTUTZ0+p4vAz3VbAI5a30t2YbvemcmspjKwrAz5s=
|
51 |
+
github.com/anacrolix/missinggo v1.1.0/go.mod h1:MBJu3Sk/k3ZfGYcS7z18gwfu72Ey/xopPFJJbTi5yIo=
|
52 |
+
github.com/anacrolix/missinggo v1.1.2-0.20190815015349-b888af804467/go.mod h1:MBJu3Sk/k3ZfGYcS7z18gwfu72Ey/xopPFJJbTi5yIo=
|
53 |
+
github.com/anacrolix/missinggo v1.2.1/go.mod h1:J5cMhif8jPmFoC3+Uvob3OXXNIhOUikzMt+uUjeM21Y=
|
54 |
+
github.com/anacrolix/missinggo v1.3.0 h1:06HlMsudotL7BAELRZs0yDZ4yVXsHXGi323QBjAVASw=
|
55 |
+
github.com/anacrolix/missinggo v1.3.0/go.mod h1:bqHm8cE8xr+15uVfMG3BFui/TxyB6//H5fwlq/TeqMc=
|
56 |
+
github.com/anacrolix/missinggo/perf v1.0.0 h1:7ZOGYziGEBytW49+KmYGTaNfnwUqP1HBsy6BqESAJVw=
|
57 |
+
github.com/anacrolix/missinggo/perf v1.0.0/go.mod h1:ljAFWkBuzkO12MQclXzZrosP5urunoLS0Cbvb4V0uMQ=
|
58 |
+
github.com/anacrolix/missinggo/v2 v2.2.0/go.mod h1:o0jgJoYOyaoYQ4E2ZMISVa9c88BbUBVQQW4QeRkNCGY=
|
59 |
+
github.com/anacrolix/missinggo/v2 v2.5.1/go.mod h1:WEjqh2rmKECd0t1VhQkLGTdIWXO6f6NLjp5GlMZ+6FA=
|
60 |
+
github.com/anacrolix/missinggo/v2 v2.5.2/go.mod h1:yNvsLrtZYRYCOI+KRH/JM8TodHjtIE/bjOGhQaLOWIE=
|
61 |
+
github.com/anacrolix/missinggo/v2 v2.7.3 h1:Ee//CmZBMadeNiYB/hHo9ly2PFOEZ4Fhsbnug3rDAIE=
|
62 |
+
github.com/anacrolix/missinggo/v2 v2.7.3/go.mod h1:mIEtp9pgaXqt8VQ3NQxFOod/eQ1H0D1XsZzKUQfwtac=
|
63 |
+
github.com/anacrolix/mmsg v0.0.0-20180515031531-a4a3ba1fc8bb/go.mod h1:x2/ErsYUmT77kezS63+wzZp8E3byYB0gzirM/WMBLfw=
|
64 |
+
github.com/anacrolix/mmsg v1.0.0 h1:btC7YLjOn29aTUAExJiVUhQOuf/8rhm+/nWCMAnL3Hg=
|
65 |
+
github.com/anacrolix/mmsg v1.0.0/go.mod h1:x8kRaJY/dCrY9Al0PEcj1mb/uFHwP6GCJ9fLl4thEPc=
|
66 |
+
github.com/anacrolix/multiless v0.3.0 h1:5Bu0DZncjE4e06b9r1Ap2tUY4Au0NToBP5RpuEngSis=
|
67 |
+
github.com/anacrolix/multiless v0.3.0/go.mod h1:TrCLEZfIDbMVfLoQt5tOoiBS/uq4y8+ojuEVVvTNPX4=
|
68 |
+
github.com/anacrolix/stm v0.2.0/go.mod h1:zoVQRvSiGjGoTmbM0vSLIiaKjWtNPeTvXUSdJQA4hsg=
|
69 |
+
github.com/anacrolix/stm v0.4.0 h1:tOGvuFwaBjeu1u9X1eIh9TX8OEedEiEQ1se1FjhFnXY=
|
70 |
+
github.com/anacrolix/stm v0.4.0/go.mod h1:GCkwqWoAsP7RfLW+jw+Z0ovrt2OO7wRzcTtFYMYY5t8=
|
71 |
+
github.com/anacrolix/sync v0.0.0-20180808010631-44578de4e778/go.mod h1:s735Etp3joe/voe2sdaXLcqDdJSay1O0OPnM0ystjqk=
|
72 |
+
github.com/anacrolix/sync v0.3.0/go.mod h1:BbecHL6jDSExojhNtgTFSBcdGerzNc64tz3DCOj/I0g=
|
73 |
+
github.com/anacrolix/sync v0.5.1 h1:FbGju6GqSjzVoTgcXTUKkF041lnZkG5P0C3T5RL3SGc=
|
74 |
+
github.com/anacrolix/sync v0.5.1/go.mod h1:BbecHL6jDSExojhNtgTFSBcdGerzNc64tz3DCOj/I0g=
|
75 |
+
github.com/anacrolix/tagflag v0.0.0-20180109131632-2146c8d41bf0/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw=
|
76 |
+
github.com/anacrolix/tagflag v1.0.0/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw=
|
77 |
+
github.com/anacrolix/tagflag v1.1.0/go.mod h1:Scxs9CV10NQatSmbyjqmqmeQNwGzlNe0CMUMIxqHIG8=
|
78 |
+
github.com/anacrolix/torrent v1.55.0 h1:s9yh/YGdPmbN9dTa+0Inh2dLdrLQRvEAj1jdFW/Hdd8=
|
79 |
+
github.com/anacrolix/torrent v1.55.0/go.mod h1:sBdZHBSZNj4de0m+EbYg7vvs/G/STubxu/GzzNbojsE=
|
80 |
+
github.com/anacrolix/upnp v0.1.3-0.20220123035249-922794e51c96 h1:QAVZ3pN/J4/UziniAhJR2OZ9Ox5kOY2053tBbbqUPYA=
|
81 |
+
github.com/anacrolix/upnp v0.1.3-0.20220123035249-922794e51c96/go.mod h1:Wa6n8cYIdaG35x15aH3Zy6d03f7P728QfdcDeD/IEOs=
|
82 |
+
github.com/anacrolix/utp v0.1.0 h1:FOpQOmIwYsnENnz7tAGohA+r6iXpRjrq8ssKSre2Cp4=
|
83 |
+
github.com/anacrolix/utp v0.1.0/go.mod h1:MDwc+vsGEq7RMw6lr2GKOEqjWny5hO5OZXRVNaBJ2Dk=
|
84 |
+
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
|
85 |
+
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
86 |
+
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
87 |
+
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
|
88 |
+
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
|
89 |
+
github.com/benbjohnson/immutable v0.2.0/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI=
|
90 |
+
github.com/benbjohnson/immutable v0.3.0 h1:TVRhuZx2wG9SZ0LRdqlbs9S5BZ6Y24hJEHTCgWHZEIw=
|
91 |
+
github.com/benbjohnson/immutable v0.3.0/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI=
|
92 |
+
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
93 |
+
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
94 |
+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
95 |
+
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
|
96 |
+
github.com/bits-and-blooms/bitset v1.2.2 h1:J5gbX05GpMdBjCvQ9MteIg2KKDExr7DrgK+Yc15FvIk=
|
97 |
+
github.com/bits-and-blooms/bitset v1.2.2/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
|
98 |
+
github.com/bradfitz/iter v0.0.0-20140124041915-454541ec3da2/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo=
|
99 |
+
github.com/bradfitz/iter v0.0.0-20190303215204-33e6a9893b0c/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo=
|
100 |
+
github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 h1:GKTyiRCL6zVf5wWaqKnf+7Qs6GbEPfd4iMOitWzXJx8=
|
101 |
+
github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8/go.mod h1:spo1JLcs67NmW1aVLEgtA8Yy1elc+X8y5SRW1sFW4Og=
|
102 |
+
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
103 |
+
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
104 |
+
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
105 |
+
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
106 |
+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
107 |
+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
108 |
+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
109 |
+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
110 |
+
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
|
111 |
+
github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
112 |
+
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
113 |
+
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
114 |
+
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
|
115 |
+
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
116 |
+
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
117 |
+
github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ=
|
118 |
+
github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q=
|
119 |
+
github.com/frankban/quicktest v1.9.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
|
120 |
+
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
121 |
+
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
122 |
+
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
123 |
+
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
124 |
+
github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
|
125 |
+
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
|
126 |
+
github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
|
127 |
+
github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
|
128 |
+
github.com/glycerine/goconvey v0.0.0-20190315024820-982ee783a72e/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
|
129 |
+
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
|
130 |
+
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
131 |
+
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
132 |
+
github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916 h1:OyQmpAN302wAopDgwVjgs2HkFawP9ahIEqkUYz7V7CA=
|
133 |
+
github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916/go.mod h1:DADrR88ONKPPeSGjFp5iEN55Arx3fi2qXZeKCYDpbmU=
|
134 |
+
github.com/go-llsqlite/crawshaw v0.4.0 h1:L02s2jZBBJj80xm1VkkdyB/JlQ/Fi0kLbNHfXA8yrec=
|
135 |
+
github.com/go-llsqlite/crawshaw v0.4.0/go.mod h1:/YJdV7uBQaYDE0fwe4z3wwJIZBJxdYzd38ICggWqtaE=
|
136 |
+
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
137 |
+
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
138 |
+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
139 |
+
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
140 |
+
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
141 |
+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
142 |
+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
143 |
+
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
144 |
+
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
145 |
+
github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo=
|
146 |
+
github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
|
147 |
+
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
148 |
+
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
149 |
+
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
150 |
+
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
151 |
+
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
152 |
+
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
153 |
+
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
154 |
+
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
155 |
+
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
156 |
+
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
157 |
+
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
158 |
+
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
159 |
+
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
160 |
+
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
161 |
+
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
162 |
+
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
163 |
+
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
164 |
+
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
165 |
+
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
166 |
+
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
167 |
+
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
168 |
+
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
|
169 |
+
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
|
170 |
+
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
171 |
+
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
172 |
+
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
173 |
+
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
174 |
+
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
175 |
+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
176 |
+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
177 |
+
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
178 |
+
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
179 |
+
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
|
180 |
+
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
181 |
+
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
182 |
+
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
183 |
+
github.com/gopherjs/gopherjs v0.0.0-20190309154008-847fc94819f9/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
184 |
+
github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
185 |
+
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
186 |
+
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
187 |
+
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
|
188 |
+
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
189 |
+
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
190 |
+
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
|
191 |
+
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
|
192 |
+
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
193 |
+
github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
|
194 |
+
github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4=
|
195 |
+
github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
196 |
+
github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
197 |
+
github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
|
198 |
+
github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
199 |
+
github.com/j-muller/go-torrent-parser v0.0.0-20211014072822-db02b4099054 h1:74rPb7GmzJVJkSQ1Tpd7Y8iCnNveIjnpgyos4Yu4Gzs=
|
200 |
+
github.com/j-muller/go-torrent-parser v0.0.0-20211014072822-db02b4099054/go.mod h1:mMeMpHRplLTgo3ttLVB8R43jtdEKcDpLVw2CvcwTv28=
|
201 |
+
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
202 |
+
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
203 |
+
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
204 |
+
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
205 |
+
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
206 |
+
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
207 |
+
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
208 |
+
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
209 |
+
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
|
210 |
+
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
211 |
+
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
212 |
+
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
213 |
+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
214 |
+
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
215 |
+
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
216 |
+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
217 |
+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
218 |
+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
219 |
+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
220 |
+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
221 |
+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
222 |
+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
223 |
+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
224 |
+
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
225 |
+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
226 |
+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
227 |
+
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
228 |
+
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
229 |
+
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
230 |
+
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
231 |
+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
232 |
+
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
233 |
+
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
234 |
+
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
|
235 |
+
github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=
|
236 |
+
github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
|
237 |
+
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
238 |
+
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
239 |
+
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
240 |
+
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
241 |
+
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
242 |
+
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
243 |
+
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
244 |
+
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
245 |
+
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
246 |
+
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
247 |
+
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
248 |
+
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
249 |
+
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
250 |
+
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
251 |
+
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
252 |
+
github.com/pion/datachannel v1.5.2 h1:piB93s8LGmbECrpO84DnkIVWasRMk3IimbcXkTQLE6E=
|
253 |
+
github.com/pion/datachannel v1.5.2/go.mod h1:FTGQWaHrdCwIJ1rw6xBIfZVkslikjShim5yr05XFuCQ=
|
254 |
+
github.com/pion/dtls/v2 v2.1.3/go.mod h1:o6+WvyLDAlXF7YiPB/RlskRoeK+/JtuaZa5emwQcWus=
|
255 |
+
github.com/pion/dtls/v2 v2.1.5/go.mod h1:BqCE7xPZbPSubGasRoDFJeTsyJtdD1FanJYL0JGheqY=
|
256 |
+
github.com/pion/dtls/v2 v2.2.4 h1:YSfYwDQgrxMYXLBc/m7PFY5BVtWlNm/DN4qoU2CbcWg=
|
257 |
+
github.com/pion/dtls/v2 v2.2.4/go.mod h1:WGKfxqhrddne4Kg3p11FUMJrynkOY4lb25zHNO49wuw=
|
258 |
+
github.com/pion/ice/v2 v2.2.6 h1:R/vaLlI1J2gCx141L5PEwtuGAGcyS6e7E0hDeJFq5Ig=
|
259 |
+
github.com/pion/ice/v2 v2.2.6/go.mod h1:SWuHiOGP17lGromHTFadUe1EuPgFh/oCU6FCMZHooVE=
|
260 |
+
github.com/pion/interceptor v0.1.11 h1:00U6OlqxA3FFB50HSg25J/8cWi7P6FbSzw4eFn24Bvs=
|
261 |
+
github.com/pion/interceptor v0.1.11/go.mod h1:tbtKjZY14awXd7Bq0mmWvgtHB5MDaRN7HV3OZ/uy7s8=
|
262 |
+
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
|
263 |
+
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
|
264 |
+
github.com/pion/mdns v0.0.5 h1:Q2oj/JB3NqfzY9xGZ1fPzZzK7sDSD8rZPOvcIQ10BCw=
|
265 |
+
github.com/pion/mdns v0.0.5/go.mod h1:UgssrvdD3mxpi8tMxAXbsppL3vJ4Jipw1mTCW+al01g=
|
266 |
+
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
|
267 |
+
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
268 |
+
github.com/pion/rtcp v1.2.9 h1:1ujStwg++IOLIEoOiIQ2s+qBuJ1VN81KW+9pMPsif+U=
|
269 |
+
github.com/pion/rtcp v1.2.9/go.mod h1:qVPhiCzAm4D/rxb6XzKeyZiQK69yJpbUDJSF7TgrqNo=
|
270 |
+
github.com/pion/rtp v1.7.13 h1:qcHwlmtiI50t1XivvoawdCGTP4Uiypzfrsap+bijcoA=
|
271 |
+
github.com/pion/rtp v1.7.13/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
272 |
+
github.com/pion/sctp v1.8.0/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
|
273 |
+
github.com/pion/sctp v1.8.2 h1:yBBCIrUMJ4yFICL3RIvR4eh/H2BTTvlligmSTy+3kiA=
|
274 |
+
github.com/pion/sctp v1.8.2/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
|
275 |
+
github.com/pion/sdp/v3 v3.0.5 h1:ouvI7IgGl+V4CrqskVtr3AaTrPvPisEOxwgpdktctkU=
|
276 |
+
github.com/pion/sdp/v3 v3.0.5/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw=
|
277 |
+
github.com/pion/srtp/v2 v2.0.9 h1:JJq3jClmDFBPX/F5roEb0U19jSU7eUhyDqR/NZ34EKQ=
|
278 |
+
github.com/pion/srtp/v2 v2.0.9/go.mod h1:5TtM9yw6lsH0ppNCehB/EjEUli7VkUgKSPJqWVqbhQ4=
|
279 |
+
github.com/pion/stun v0.3.5 h1:uLUCBCkQby4S1cf6CGuR9QrVOKcvUwFeemaC865QHDg=
|
280 |
+
github.com/pion/stun v0.3.5/go.mod h1:gDMim+47EeEtfWogA37n6qXZS88L5V6LqFcf+DZA2UA=
|
281 |
+
github.com/pion/transport v0.12.2/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q=
|
282 |
+
github.com/pion/transport v0.12.3/go.mod h1:OViWW9SP2peE/HbwBvARicmAVnesphkNkCVZIWJ6q9A=
|
283 |
+
github.com/pion/transport v0.13.0/go.mod h1:yxm9uXpK9bpBBWkITk13cLo1y5/ur5VQpG22ny6EP7g=
|
284 |
+
github.com/pion/transport v0.13.1 h1:/UH5yLeQtwm2VZIPjxwnNFxjS4DFhyLfS4GlfuKUzfA=
|
285 |
+
github.com/pion/transport v0.13.1/go.mod h1:EBxbqzyv+ZrmDb82XswEE0BjfQFtuw1Nu6sjnjWCsGg=
|
286 |
+
github.com/pion/transport/v2 v2.0.0 h1:bsMYyqHCbkvHwj+eNCFBuxtlKndKfyGI2vaQmM3fIE4=
|
287 |
+
github.com/pion/transport/v2 v2.0.0/go.mod h1:HS2MEBJTwD+1ZI2eSXSvHJx/HnzQqRy2/LXxt6eVMHc=
|
288 |
+
github.com/pion/turn/v2 v2.0.8 h1:KEstL92OUN3k5k8qxsXHpr7WWfrdp7iJZHx99ud8muw=
|
289 |
+
github.com/pion/turn/v2 v2.0.8/go.mod h1:+y7xl719J8bAEVpSXBXvTxStjJv3hbz9YFflvkpcGPw=
|
290 |
+
github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M=
|
291 |
+
github.com/pion/udp v0.1.4 h1:OowsTmu1Od3sD6i3fQUJxJn2fEvJO6L1TidgadtbTI8=
|
292 |
+
github.com/pion/udp v0.1.4/go.mod h1:G8LDo56HsFwC24LIcnT4YIDU5qcB6NepqqjP0keL2us=
|
293 |
+
github.com/pion/webrtc/v3 v3.1.42 h1:wJEQFIXVanptnQcHOLTuIo4AtGB2+mG2x4OhIhnITOA=
|
294 |
+
github.com/pion/webrtc/v3 v3.1.42/go.mod h1:ffD9DulDrPxyWvDPUIPAOSAWx9GUlOExiJPf7cCcMLA=
|
295 |
+
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
296 |
+
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
297 |
+
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
298 |
+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
299 |
+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
300 |
+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
301 |
+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
302 |
+
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
303 |
+
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
304 |
+
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
305 |
+
github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
306 |
+
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
307 |
+
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
308 |
+
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
309 |
+
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
310 |
+
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
311 |
+
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
312 |
+
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
|
313 |
+
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
314 |
+
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
315 |
+
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
316 |
+
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
317 |
+
github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
318 |
+
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
319 |
+
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
320 |
+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
321 |
+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
322 |
+
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
323 |
+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
324 |
+
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
325 |
+
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
326 |
+
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
327 |
+
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
328 |
+
github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 h1:Lt9DzQALzHoDwMBGJ6v8ObDPR0dzr2a6sXTB1Fq7IHs=
|
329 |
+
github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA=
|
330 |
+
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 h1:GHRpF1pTW19a8tTFrMLUcfWwyC0pnifVo2ClaLq+hP8=
|
331 |
+
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8=
|
332 |
+
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
333 |
+
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
334 |
+
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
335 |
+
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
336 |
+
github.com/smartystreets/assertions v0.0.0-20190215210624-980c5ac6f3ac/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
337 |
+
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
|
338 |
+
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff/go.mod h1:KSQcGKpxUMHk3nbYzs/tIBAM2iDooCn0BmttHOJEbLs=
|
339 |
+
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ=
|
340 |
+
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
341 |
+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
342 |
+
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
343 |
+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
344 |
+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
345 |
+
github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
346 |
+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
347 |
+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
348 |
+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
349 |
+
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
350 |
+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
351 |
+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
352 |
+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
353 |
+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
354 |
+
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
355 |
+
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
356 |
+
github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg=
|
357 |
+
github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
|
358 |
+
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
359 |
+
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
360 |
+
github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
361 |
+
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
362 |
+
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
363 |
+
github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA=
|
364 |
+
github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g=
|
365 |
+
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
|
366 |
+
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
367 |
+
github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
368 |
+
github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
369 |
+
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
370 |
+
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
371 |
+
github.com/zeebo/bencode v1.0.0 h1:zgop0Wu1nu4IexAZeCZ5qbsjU4O1vMrfCrVgUjbHVuA=
|
372 |
+
github.com/zeebo/bencode v1.0.0/go.mod h1:Ct7CkrWIQuLWAy9M3atFHYq4kG9Ao/SsY5cdtCXmp9Y=
|
373 |
+
go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
|
374 |
+
go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
|
375 |
+
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
376 |
+
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
377 |
+
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
378 |
+
go.opentelemetry.io/otel v1.8.0 h1:zcvBFizPbpa1q7FehvFiHbQwGzmPILebO0tyqIR5Djg=
|
379 |
+
go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM=
|
380 |
+
go.opentelemetry.io/otel/trace v1.8.0 h1:cSy0DF9eGI5WIfNwZ1q2iUyGj00tGzP24dE1lOlHrfY=
|
381 |
+
go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4=
|
382 |
+
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
383 |
+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
384 |
+
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
385 |
+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
386 |
+
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
387 |
+
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
388 |
+
golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
389 |
+
golang.org/x/crypto v0.0.0-20220516162934-403b01795ae8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
390 |
+
golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
|
391 |
+
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
|
392 |
+
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
393 |
+
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
394 |
+
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
|
395 |
+
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
396 |
+
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
397 |
+
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
398 |
+
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
399 |
+
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
400 |
+
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
401 |
+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
402 |
+
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
403 |
+
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
404 |
+
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
405 |
+
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
406 |
+
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
407 |
+
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
408 |
+
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
409 |
+
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
410 |
+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
411 |
+
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
412 |
+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
413 |
+
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
414 |
+
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
415 |
+
golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
416 |
+
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
417 |
+
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
418 |
+
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
419 |
+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
420 |
+
golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
421 |
+
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
422 |
+
golang.org/x/net v0.0.0-20220401154927-543a649e0bdd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
423 |
+
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
424 |
+
golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
425 |
+
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
426 |
+
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
427 |
+
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
|
428 |
+
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
429 |
+
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
|
430 |
+
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
431 |
+
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
432 |
+
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
433 |
+
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
434 |
+
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
435 |
+
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
436 |
+
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
437 |
+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
438 |
+
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
439 |
+
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
440 |
+
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
441 |
+
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
442 |
+
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
443 |
+
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
444 |
+
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
445 |
+
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
446 |
+
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
447 |
+
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
448 |
+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
449 |
+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
450 |
+
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
451 |
+
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
452 |
+
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
453 |
+
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
454 |
+
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
455 |
+
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
456 |
+
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
457 |
+
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
458 |
+
golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
459 |
+
golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
460 |
+
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
461 |
+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
462 |
+
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
463 |
+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
464 |
+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
465 |
+
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
466 |
+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
467 |
+
golang.org/x/sys v0.0.0-20220608164250-635b8c9b7f68/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
468 |
+
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
469 |
+
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
470 |
+
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
471 |
+
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
472 |
+
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
473 |
+
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
474 |
+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
475 |
+
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
|
476 |
+
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
477 |
+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
478 |
+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
479 |
+
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
480 |
+
golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
|
481 |
+
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
482 |
+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
483 |
+
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
484 |
+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
485 |
+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
486 |
+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
487 |
+
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
488 |
+
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
489 |
+
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
490 |
+
golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U=
|
491 |
+
golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
492 |
+
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
493 |
+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
494 |
+
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
495 |
+
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
496 |
+
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
497 |
+
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
498 |
+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
499 |
+
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
500 |
+
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
501 |
+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
502 |
+
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
503 |
+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
504 |
+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
505 |
+
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
506 |
+
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
507 |
+
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
508 |
+
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
509 |
+
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
510 |
+
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
511 |
+
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
512 |
+
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
513 |
+
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
514 |
+
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
515 |
+
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
516 |
+
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
517 |
+
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
518 |
+
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
519 |
+
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
520 |
+
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
521 |
+
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
522 |
+
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
523 |
+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
524 |
+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
525 |
+
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
526 |
+
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
527 |
+
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
528 |
+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
529 |
+
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
530 |
+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
531 |
+
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
532 |
+
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
533 |
+
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
534 |
+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
535 |
+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
536 |
+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
537 |
+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
538 |
+
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
539 |
+
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
540 |
+
modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY=
|
541 |
+
modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw=
|
542 |
+
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
|
543 |
+
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
|
544 |
+
modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds=
|
545 |
+
modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
|
546 |
+
modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU=
|
547 |
+
modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI=
|
548 |
+
zombiezen.com/go/sqlite v0.13.1 h1:qDzxyWWmMtSSEH5qxamqBFmqA2BLSSbtODi3ojaE02o=
|
549 |
+
zombiezen.com/go/sqlite v0.13.1/go.mod h1:Ht/5Rg3Ae2hoyh1I7gbWtWAl89CNocfqeb/aAMTkJr4=
|
helpers.go
ADDED
@@ -0,0 +1,217 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package main
|
2 |
+
|
3 |
+
import (
|
4 |
+
_ "embed"
|
5 |
+
"encoding/json"
|
6 |
+
"fmt"
|
7 |
+
"os"
|
8 |
+
"slices"
|
9 |
+
"strings"
|
10 |
+
|
11 |
+
"github.com/daniwalter001/jackett_fiber/types"
|
12 |
+
)
|
13 |
+
|
14 |
+
func PrettyPrint(i interface{}) string {
|
15 |
+
enc := json.NewEncoder(os.Stdout)
|
16 |
+
enc.SetEscapeHTML(false)
|
17 |
+
s, err := json.MarshalIndent(i, "", "\t")
|
18 |
+
if err != nil {
|
19 |
+
return ""
|
20 |
+
}
|
21 |
+
return string(s)
|
22 |
+
}
|
23 |
+
|
24 |
+
func containEandS(name string, s string, e string, abs bool, abs_season string, abs_episode string) bool {
|
25 |
+
lower := strings.ToLower(name)
|
26 |
+
return strings.Contains(lower, fmt.Sprintf("s%02se%02s ", s, e)) ||
|
27 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%02s.", s, e)) ||
|
28 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%02s-", s, e)) ||
|
29 |
+
// -----
|
30 |
+
strings.Contains(lower, fmt.Sprintf("s%se%02s ", s, e)) ||
|
31 |
+
strings.Contains(lower, fmt.Sprintf("s%se%02s.", s, e)) ||
|
32 |
+
strings.Contains(lower, fmt.Sprintf("s%se%02s-", s, e)) ||
|
33 |
+
// -----
|
34 |
+
strings.Contains(lower, fmt.Sprintf("s%sx%s", s, e)) ||
|
35 |
+
// -----
|
36 |
+
strings.Contains(lower, fmt.Sprintf("s%02s - e%02s ", s, e)) ||
|
37 |
+
strings.Contains(lower, fmt.Sprintf("s%02s.e%02s ", s, e)) ||
|
38 |
+
// -----
|
39 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%s ", s, e)) ||
|
40 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%s.", s, e)) ||
|
41 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%s-", s, e)) ||
|
42 |
+
// -----
|
43 |
+
strings.Contains(lower, fmt.Sprintf("season %s e%s", s, e)) ||
|
44 |
+
// ----- abs
|
45 |
+
(abs &&
|
46 |
+
(strings.Contains(lower, fmt.Sprintf("s%02se%02s", abs_season, abs_episode)) ||
|
47 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%03s", abs_season, abs_episode)) ||
|
48 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%04s", abs_season, abs_episode)) ||
|
49 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%02s", s, abs_episode)) ||
|
50 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%03s", s, abs_episode)) ||
|
51 |
+
strings.Contains(lower, fmt.Sprintf("season %s e%s", s, e)) ||
|
52 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%s-", s, e)) ||
|
53 |
+
strings.Contains(lower, fmt.Sprintf("s%02se%s-", s, e)) ||
|
54 |
+
false))
|
55 |
+
}
|
56 |
+
|
57 |
+
func containE_S(name string, s string, e string, abs bool, abs_season string, abs_episode string) bool {
|
58 |
+
lower := strings.ToLower(name)
|
59 |
+
return strings.Contains(lower, fmt.Sprintf("s%02s - %02s", s, e)) ||
|
60 |
+
strings.Contains(lower, fmt.Sprintf("s%s - %02s", s, e)) ||
|
61 |
+
strings.Contains(lower, fmt.Sprintf("season %s - %02s", s, e)) ||
|
62 |
+
strings.Contains(lower, fmt.Sprintf("season %s - %03s", s, e))
|
63 |
+
}
|
64 |
+
|
65 |
+
func containsAbsoluteE(name string, s string, e string, abs bool, abs_season string, abs_episode string) bool {
|
66 |
+
lower := strings.ToLower(name)
|
67 |
+
return strings.Contains(lower, fmt.Sprintf("%02s ", abs_episode)) ||
|
68 |
+
strings.Contains(lower, fmt.Sprintf("%03s ", abs_episode)) ||
|
69 |
+
strings.Contains(lower, fmt.Sprintf("0%s ", abs_episode)) ||
|
70 |
+
strings.Contains(lower, fmt.Sprintf("%04s ", abs_episode)) ||
|
71 |
+
strings.Contains(lower, fmt.Sprintf("e%02s ", abs_episode)) ||
|
72 |
+
strings.Contains(lower, fmt.Sprintf("e%03s ", abs_episode)) ||
|
73 |
+
strings.Contains(lower, fmt.Sprintf("e0%s ", abs_episode)) ||
|
74 |
+
strings.Contains(lower, fmt.Sprintf("e%04s ", abs_episode))
|
75 |
+
}
|
76 |
+
|
77 |
+
func containsAbsoluteE_(name string, s string, e string, abs bool, abs_season string, abs_episode string) bool {
|
78 |
+
lower := strings.ToLower(name)
|
79 |
+
return strings.Contains(lower, fmt.Sprintf(" %02s.", abs_episode)) ||
|
80 |
+
strings.Contains(lower, fmt.Sprintf(" %03s.", abs_episode)) ||
|
81 |
+
strings.Contains(lower, fmt.Sprintf(" 0%s.", abs_episode)) ||
|
82 |
+
strings.Contains(lower, fmt.Sprintf(" %04s.", abs_episode)) ||
|
83 |
+
strings.Contains(lower, fmt.Sprintf(" %02s-", abs_episode)) ||
|
84 |
+
strings.Contains(lower, fmt.Sprintf(" %03s-", abs_episode)) ||
|
85 |
+
strings.Contains(lower, fmt.Sprintf(" 0%s-", abs_episode)) ||
|
86 |
+
strings.Contains(lower, fmt.Sprintf(" %04s-", abs_episode))
|
87 |
+
}
|
88 |
+
|
89 |
+
func isVideo(name string) bool {
|
90 |
+
lower := strings.ToLower(name)
|
91 |
+
|
92 |
+
return strings.Contains(lower, ".mp4") ||
|
93 |
+
strings.Contains(lower, ".mkv") ||
|
94 |
+
strings.Contains(lower, ".avi") ||
|
95 |
+
strings.Contains(lower, ".ts") ||
|
96 |
+
strings.Contains(lower, ".m3u") ||
|
97 |
+
strings.Contains(lower, ".m3u8") ||
|
98 |
+
strings.Contains(lower, ".flv")
|
99 |
+
}
|
100 |
+
|
101 |
+
func getQuality(name string) string {
|
102 |
+
lower := strings.ToLower(name)
|
103 |
+
|
104 |
+
if slices.ContainsFunc([]string{"2160", "4k", "uhd"}, func(e string) bool {
|
105 |
+
return strings.Contains(lower, e)
|
106 |
+
}) {
|
107 |
+
return " 🌟4k"
|
108 |
+
}
|
109 |
+
|
110 |
+
if slices.ContainsFunc([]string{"1080", "fhd"}, func(e string) bool {
|
111 |
+
return strings.Contains(lower, e)
|
112 |
+
}) {
|
113 |
+
return " 🎥FHD"
|
114 |
+
}
|
115 |
+
|
116 |
+
if slices.ContainsFunc([]string{"720", "hd"}, func(e string) bool {
|
117 |
+
return strings.Contains(lower, e)
|
118 |
+
}) {
|
119 |
+
return " 📺HD"
|
120 |
+
}
|
121 |
+
|
122 |
+
if slices.ContainsFunc([]string{"480p", "380p", "sd"}, func(e string) bool {
|
123 |
+
return strings.Contains(lower, e)
|
124 |
+
}) {
|
125 |
+
return " 📱SD"
|
126 |
+
}
|
127 |
+
|
128 |
+
return ""
|
129 |
+
}
|
130 |
+
|
131 |
+
// function getSize(size) {
|
132 |
+
// var gb = 1024 * 1024 * 1024;
|
133 |
+
// var mb = 1024 * 1024;
|
134 |
+
|
135 |
+
// return (
|
136 |
+
// "💾 " +
|
137 |
+
// (size / gb > 1
|
138 |
+
// ? `${(size / gb).toFixed(2)} GB`
|
139 |
+
// : `${(size / mb).toFixed(2)} MB`)
|
140 |
+
// );
|
141 |
+
// }
|
142 |
+
|
143 |
+
func getSize(size int) string {
|
144 |
+
gb := 1024 * 1024 * 1024
|
145 |
+
mb := 1024 * 1024
|
146 |
+
kb := 1024
|
147 |
+
|
148 |
+
size_ := "💾 "
|
149 |
+
|
150 |
+
if size/gb > 1 {
|
151 |
+
size_ = size_ + fmt.Sprintf("%.2f GB", float32(size/gb))
|
152 |
+
} else if size/mb > 1 {
|
153 |
+
size_ = size_ + fmt.Sprintf("%.2f MB", float32(size/mb))
|
154 |
+
} else {
|
155 |
+
size_ = size_ + fmt.Sprintf("%.2f KB", float32(size/kb))
|
156 |
+
}
|
157 |
+
return size_
|
158 |
+
|
159 |
+
}
|
160 |
+
|
161 |
+
func removeDuplicates(strList []types.ItemsParsed) []types.ItemsParsed {
|
162 |
+
list := []types.ItemsParsed{}
|
163 |
+
for _, item := range strList {
|
164 |
+
if !(contains(list, item)) {
|
165 |
+
list = append(list, item)
|
166 |
+
}
|
167 |
+
}
|
168 |
+
return list
|
169 |
+
}
|
170 |
+
|
171 |
+
func contains(s []types.ItemsParsed, e types.ItemsParsed) bool {
|
172 |
+
for _, a := range s {
|
173 |
+
if a.Title == e.Title {
|
174 |
+
return true
|
175 |
+
}
|
176 |
+
}
|
177 |
+
return false
|
178 |
+
}
|
179 |
+
|
180 |
+
func filter[T any](slice []T, cb func(T) bool) (ret []T) {
|
181 |
+
for _, v := range slice {
|
182 |
+
if cb(v) {
|
183 |
+
ret = append(ret, v)
|
184 |
+
}
|
185 |
+
}
|
186 |
+
return ret
|
187 |
+
}
|
188 |
+
|
189 |
+
//go:embed assets/servers.db
|
190 |
+
var servers string
|
191 |
+
|
192 |
+
func getServers() []types.Server {
|
193 |
+
|
194 |
+
serversArr := strings.Split(servers, "\n")
|
195 |
+
var servers []types.Server
|
196 |
+
|
197 |
+
for _, line := range serversArr {
|
198 |
+
servers = append(servers, types.Server{
|
199 |
+
Host: strings.Split(line, "|")[0],
|
200 |
+
ApiKey: strings.Split(line, "|")[1],
|
201 |
+
})
|
202 |
+
}
|
203 |
+
|
204 |
+
return servers
|
205 |
+
}
|
206 |
+
|
207 |
+
func createIfNotExist(path string) bool {
|
208 |
+
if _, err := os.Stat(path); err != nil {
|
209 |
+
if os.IsNotExist(err) {
|
210 |
+
errMkdir := os.MkdirAll(path, 0755)
|
211 |
+
return errMkdir == nil
|
212 |
+
}
|
213 |
+
return false
|
214 |
+
}
|
215 |
+
fmt.Printf("%s already exists\n", path)
|
216 |
+
return true
|
217 |
+
}
|
main.go
ADDED
@@ -0,0 +1,420 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package main
|
2 |
+
|
3 |
+
import (
|
4 |
+
"encoding/json"
|
5 |
+
"fmt"
|
6 |
+
"log"
|
7 |
+
"os"
|
8 |
+
"slices"
|
9 |
+
"sort"
|
10 |
+
"strconv"
|
11 |
+
"strings"
|
12 |
+
"sync"
|
13 |
+
|
14 |
+
"github.com/daniwalter001/jackett_fiber/types"
|
15 |
+
"github.com/daniwalter001/jackett_fiber/types/rd"
|
16 |
+
"github.com/gofiber/fiber/v2"
|
17 |
+
"github.com/joho/godotenv"
|
18 |
+
)
|
19 |
+
|
20 |
+
func main() {
|
21 |
+
enc := json.NewEncoder(os.Stdout)
|
22 |
+
enc.SetEscapeHTML(false)
|
23 |
+
|
24 |
+
errDot := godotenv.Load("./.env")
|
25 |
+
if errDot != nil {
|
26 |
+
log.Fatalln("Error loading .env file")
|
27 |
+
}
|
28 |
+
|
29 |
+
fmt.Printf("Creating... %t\n", createIfNotExist("./temp"))
|
30 |
+
fmt.Printf("Creating... %t\n", createIfNotExist("./persistence"))
|
31 |
+
|
32 |
+
// ex, err := os.Executable()
|
33 |
+
// if err != nil {
|
34 |
+
// panic(err)
|
35 |
+
// }
|
36 |
+
// exPath := filepath.Dir(ex)
|
37 |
+
// fmt.Printf("Current: %s\n", exPath)
|
38 |
+
|
39 |
+
//read and parse cache file content
|
40 |
+
mapCache := make(map[string]types.StreamMeta)
|
41 |
+
|
42 |
+
cacheFile, _ := os.ReadFile("persistence/cache.json")
|
43 |
+
if len(cacheFile) > 0 {
|
44 |
+
json.Unmarshal(cacheFile, &mapCache)
|
45 |
+
}
|
46 |
+
|
47 |
+
// fmt.Println(PrettyPrint(mapCache))
|
48 |
+
|
49 |
+
// listd, _ := os.ReadDir(".")
|
50 |
+
|
51 |
+
// for _, v := range listd {
|
52 |
+
// fmt.Println(v.Name())
|
53 |
+
// }
|
54 |
+
|
55 |
+
app := fiber.New()
|
56 |
+
|
57 |
+
app.Get("/", func(c *fiber.Ctx) error {
|
58 |
+
return c.Status(200).SendString("Working")
|
59 |
+
})
|
60 |
+
|
61 |
+
app.Get("/manifest.json", func(c *fiber.Ctx) error {
|
62 |
+
a := types.StreamManifest{ID: "strem.go.nyaa", Description: "Random Golang version on stremio Addon", Name: "GoDon Nyaa", Resources: []string{"stream"}, Version: "1.0.1", Types: []string{"movie", "series", "anime"}, Logo: "https://upload.wikimedia.org/wikipedia/commons/2/23/Golang.png", IdPrefixes: []string{"tt", "kitsu"}, Catalogs: []string{}}
|
63 |
+
|
64 |
+
u, err := json.Marshal(a)
|
65 |
+
if err != nil {
|
66 |
+
return c.SendStatus(fiber.StatusOK)
|
67 |
+
}
|
68 |
+
|
69 |
+
c.Set("Access-Control-Allow-Origin", "*")
|
70 |
+
c.Set("Access-Control-Allow-Headers", "*")
|
71 |
+
c.Set("Content-Type", "application/json")
|
72 |
+
|
73 |
+
return c.Status(fiber.StatusOK).SendString(string(u))
|
74 |
+
})
|
75 |
+
|
76 |
+
app.Get("/stream/:type/:id.json", func(c *fiber.Ctx) error {
|
77 |
+
c.Set("Access-Control-Allow-Origin", "*")
|
78 |
+
c.Set("Access-Control-Allow-Headers", "*")
|
79 |
+
c.Set("Content-Type", "application/json")
|
80 |
+
|
81 |
+
fmt.Printf("Id: %s\n", c.Params("id"))
|
82 |
+
fmt.Printf("Type: %s\n", c.Params("type"))
|
83 |
+
|
84 |
+
var s, e, abs_season, abs_episode int
|
85 |
+
var tt string
|
86 |
+
abs := "false"
|
87 |
+
|
88 |
+
id := c.Params("id")
|
89 |
+
id = strings.ReplaceAll(id, "%3A", ":")
|
90 |
+
|
91 |
+
//Reading the cache
|
92 |
+
streams, exists := mapCache[id]
|
93 |
+
if exists {
|
94 |
+
fmt.Printf("Sending that %s shit from cache\n", id)
|
95 |
+
return c.Status(fiber.StatusOK).JSON(streams)
|
96 |
+
}
|
97 |
+
|
98 |
+
type_ := c.Params("type")
|
99 |
+
|
100 |
+
var tmp []string
|
101 |
+
|
102 |
+
if strings.Contains(id, "kitsu") {
|
103 |
+
tmp = getImdbFromKitsu(id)
|
104 |
+
} else {
|
105 |
+
tmp = strings.Split(id, ":")
|
106 |
+
}
|
107 |
+
|
108 |
+
fmt.Println(tmp)
|
109 |
+
|
110 |
+
tt = tmp[0]
|
111 |
+
if len(tmp) > 1 {
|
112 |
+
s, _ = strconv.Atoi(tmp[1])
|
113 |
+
e, _ = strconv.Atoi(tmp[2])
|
114 |
+
if len(tmp) > 3 {
|
115 |
+
abs_season, _ = strconv.Atoi(tmp[3])
|
116 |
+
abs_episode, _ = strconv.Atoi(tmp[4])
|
117 |
+
abs = tmp[5]
|
118 |
+
}
|
119 |
+
}
|
120 |
+
|
121 |
+
// fmt.Println("----------------------------")
|
122 |
+
// fmt.Println(tt)
|
123 |
+
// fmt.Println(strconv.Itoa(s))
|
124 |
+
// fmt.Println(strconv.Itoa(e))
|
125 |
+
// fmt.Println(abs)
|
126 |
+
// fmt.Println(strconv.Itoa(abs_season))
|
127 |
+
// fmt.Println(strconv.Itoa(abs_episode))
|
128 |
+
// fmt.Println("----------------------------")
|
129 |
+
|
130 |
+
name, year := getMeta(tt, type_)
|
131 |
+
|
132 |
+
var results []types.ItemsParsed
|
133 |
+
|
134 |
+
wg := sync.WaitGroup{}
|
135 |
+
l := 5
|
136 |
+
if type_ == "series" {
|
137 |
+
if abs == "true" {
|
138 |
+
l = l + 2
|
139 |
+
}
|
140 |
+
if s == 1 {
|
141 |
+
l = l + 2
|
142 |
+
}
|
143 |
+
} else if type_ == "movie" {
|
144 |
+
l = 1
|
145 |
+
}
|
146 |
+
fmt.Printf("Requests: %d\n", l)
|
147 |
+
|
148 |
+
wg.Add(l)
|
149 |
+
|
150 |
+
//=========================================================
|
151 |
+
|
152 |
+
if type_ == "movie" {
|
153 |
+
go func() {
|
154 |
+
defer wg.Done()
|
155 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s %s", name, year), type_)...)
|
156 |
+
}()
|
157 |
+
} else {
|
158 |
+
|
159 |
+
go func() {
|
160 |
+
defer wg.Done()
|
161 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s S%02d", name, s), type_)...)
|
162 |
+
}()
|
163 |
+
go func() {
|
164 |
+
defer wg.Done()
|
165 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s integrale", name), type_)...)
|
166 |
+
}()
|
167 |
+
go func() {
|
168 |
+
defer wg.Done()
|
169 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s batch", name), type_)...)
|
170 |
+
}()
|
171 |
+
go func() {
|
172 |
+
defer wg.Done()
|
173 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s complet", name), type_)...)
|
174 |
+
}()
|
175 |
+
|
176 |
+
go func() {
|
177 |
+
defer wg.Done()
|
178 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s S%02dE%02d", name, s, e), type_)...)
|
179 |
+
}()
|
180 |
+
|
181 |
+
if s == 1 {
|
182 |
+
go func() {
|
183 |
+
defer wg.Done()
|
184 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s E%02d", name, e), type_)...)
|
185 |
+
}()
|
186 |
+
go func() {
|
187 |
+
defer wg.Done()
|
188 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s %02d", name, e), type_)...)
|
189 |
+
}()
|
190 |
+
}
|
191 |
+
|
192 |
+
if abs == "true" {
|
193 |
+
go func() {
|
194 |
+
defer wg.Done()
|
195 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s E%03d", name, abs_episode), type_)...)
|
196 |
+
}()
|
197 |
+
|
198 |
+
go func() {
|
199 |
+
defer wg.Done()
|
200 |
+
results = append(results, fetchTorrent(fmt.Sprintf("%s %03d", name, abs_episode), type_)...)
|
201 |
+
}()
|
202 |
+
}
|
203 |
+
}
|
204 |
+
|
205 |
+
//=========================================================
|
206 |
+
|
207 |
+
wg.Wait()
|
208 |
+
|
209 |
+
sort.Slice(results, func(i, j int) bool {
|
210 |
+
iv, _ := strconv.Atoi(results[i].Peers)
|
211 |
+
jv, _ := strconv.Atoi(results[j].Peers)
|
212 |
+
return iv > jv
|
213 |
+
})
|
214 |
+
|
215 |
+
results = removeDuplicates(results)
|
216 |
+
|
217 |
+
fmt.Printf("Results:%d\n", len(results))
|
218 |
+
|
219 |
+
maxRes, _ := strconv.Atoi(os.Getenv("MAX_RES"))
|
220 |
+
|
221 |
+
if len(results) > maxRes {
|
222 |
+
results = results[:maxRes]
|
223 |
+
}
|
224 |
+
|
225 |
+
// for index, el := range results {
|
226 |
+
// fmt.Printf("%d. %s => %s\n", index, el.MagnetURI, el.Seeders)
|
227 |
+
// }
|
228 |
+
|
229 |
+
fmt.Printf("Retenus:%d\n", len(results))
|
230 |
+
|
231 |
+
var parsedTorrentFiles []types.ItemsParsed
|
232 |
+
|
233 |
+
wg = sync.WaitGroup{}
|
234 |
+
wg.Add(len(results))
|
235 |
+
|
236 |
+
for i := 0; i < len(results); i++ {
|
237 |
+
go func(item types.ItemsParsed) {
|
238 |
+
defer wg.Done()
|
239 |
+
r := item
|
240 |
+
if strings.Contains(item.MagnetURI, "magnet:?xt") {
|
241 |
+
r = readTorrentFromMagnet(item)
|
242 |
+
} else {
|
243 |
+
r = readTorrent(item)
|
244 |
+
}
|
245 |
+
|
246 |
+
if len(r.TorrentData) != 0 {
|
247 |
+
parsedTorrentFiles = append(parsedTorrentFiles, r)
|
248 |
+
}
|
249 |
+
}(results[i])
|
250 |
+
}
|
251 |
+
wg.Wait()
|
252 |
+
|
253 |
+
var parsedSuitableTorrentFiles []types.TorrentFile
|
254 |
+
// var parsedSuitableTorrentFilesIndex = make([]int, len(parsedTorrentFiles))
|
255 |
+
var parsedSuitableTorrentFilesIndex = make(map[string]int, 0)
|
256 |
+
|
257 |
+
for index, el := range parsedTorrentFiles {
|
258 |
+
parsedSuitableTorrentFiles = make([]types.TorrentFile, 0)
|
259 |
+
|
260 |
+
for _index, ell := range el.TorrentData {
|
261 |
+
lower := strings.ToLower(ell.Name)
|
262 |
+
|
263 |
+
if !isVideo(ell.Name) {
|
264 |
+
continue
|
265 |
+
}
|
266 |
+
|
267 |
+
if type_ == "movie" {
|
268 |
+
parsedSuitableTorrentFiles = append(parsedSuitableTorrentFiles, ell)
|
269 |
+
parsedSuitableTorrentFilesIndex[ell.Name] = _index + 1
|
270 |
+
|
271 |
+
break
|
272 |
+
} else {
|
273 |
+
if isVideo(ell.Name) && (containEandS(lower, strconv.Itoa(s), strconv.Itoa(e), abs == "true", strconv.Itoa(abs_season), strconv.Itoa(abs_episode)) ||
|
274 |
+
containE_S(lower, strconv.Itoa(s), strconv.Itoa(e), abs == "true", strconv.Itoa(abs_season), strconv.Itoa(abs_episode)) ||
|
275 |
+
(s == 1 && (containsAbsoluteE(lower, strconv.Itoa(s), strconv.Itoa(e), true, strconv.Itoa(s), strconv.Itoa(e)) ||
|
276 |
+
containsAbsoluteE_(lower, strconv.Itoa(s), strconv.Itoa(e), true, strconv.Itoa(s), strconv.Itoa(e)))) ||
|
277 |
+
// false ||
|
278 |
+
(((abs == "true" && containsAbsoluteE(lower, strconv.Itoa(s), strconv.Itoa(e), true, strconv.Itoa(abs_season), strconv.Itoa(abs_episode))) ||
|
279 |
+
(abs == "true" && containsAbsoluteE_(lower, strconv.Itoa(s), strconv.Itoa(e), true, strconv.Itoa(abs_season), strconv.Itoa(abs_episode)))) &&
|
280 |
+
!(strings.Contains(lower, "s0") && strings.Contains(lower, "e0") && strings.Contains(lower, "season") && strings.Contains(lower, fmt.Sprintf("s%d", abs_season)) && strings.Contains(lower, fmt.Sprintf("e%d", abs_episode))))) {
|
281 |
+
parsedSuitableTorrentFiles = append(parsedSuitableTorrentFiles, ell)
|
282 |
+
parsedSuitableTorrentFilesIndex[ell.Name] = _index + 1
|
283 |
+
break
|
284 |
+
}
|
285 |
+
}
|
286 |
+
}
|
287 |
+
parsedTorrentFiles[index].TorrentData = parsedSuitableTorrentFiles
|
288 |
+
}
|
289 |
+
|
290 |
+
var ttttt types.StreamMeta
|
291 |
+
|
292 |
+
parsedTorrentFiles = filter[types.ItemsParsed](parsedTorrentFiles, func(ip types.ItemsParsed) bool {
|
293 |
+
return len(ip.TorrentData) != 0
|
294 |
+
})
|
295 |
+
|
296 |
+
fmt.Printf("Response %d\n", len(parsedTorrentFiles))
|
297 |
+
|
298 |
+
fmt.Println("Parsing that shit")
|
299 |
+
|
300 |
+
wg = sync.WaitGroup{}
|
301 |
+
wg.Add(len(parsedTorrentFiles))
|
302 |
+
|
303 |
+
nbreAdded := 0
|
304 |
+
|
305 |
+
for _, el := range parsedTorrentFiles {
|
306 |
+
go func(item types.ItemsParsed) {
|
307 |
+
defer wg.Done()
|
308 |
+
for _, ell := range el.TorrentData {
|
309 |
+
fmt.Println(ell.Name)
|
310 |
+
if !isVideo(ell.Name) {
|
311 |
+
continue
|
312 |
+
}
|
313 |
+
|
314 |
+
// ========================== RD =============================
|
315 |
+
fmt.Printf("Trynna some RD...\n")
|
316 |
+
|
317 |
+
infoHash := ell.InfoHash
|
318 |
+
// infoHash := ell.Torrent().InfoHash().String()
|
319 |
+
// magnet := fmt.Sprint(ell.Torrent().Metainfo().Magnet(nil, ell.Torrent().Info()))
|
320 |
+
var folderId string
|
321 |
+
var details []rd.UnrestrictLinkResponse
|
322 |
+
var data rd.AddTorrentResponse
|
323 |
+
|
324 |
+
available, err := checkTorrentFileinRD(infoHash)
|
325 |
+
|
326 |
+
if err.Error != "" {
|
327 |
+
continue
|
328 |
+
}
|
329 |
+
|
330 |
+
v, availableCheck := available[infoHash]
|
331 |
+
|
332 |
+
if !availableCheck {
|
333 |
+
continue
|
334 |
+
}
|
335 |
+
|
336 |
+
v_ := v["rd"]
|
337 |
+
availableCheck = len(v_) > 0
|
338 |
+
|
339 |
+
if availableCheck || nbreAdded < 3 {
|
340 |
+
data, err = addTorrentFileinRD2(fmt.Sprintf("magnet:?xt=urn:btih:%s", infoHash))
|
341 |
+
if availableCheck {
|
342 |
+
fmt.Println("Cached")
|
343 |
+
} else {
|
344 |
+
fmt.Println("Added")
|
345 |
+
nbreAdded = nbreAdded + 1
|
346 |
+
}
|
347 |
+
}
|
348 |
+
|
349 |
+
folderId = data.ID
|
350 |
+
selected, err := selectFilefromRD(folderId, "all")
|
351 |
+
if folderId != "" && selected {
|
352 |
+
torrentDetails, err_ := getTorrentInfofromRD(folderId)
|
353 |
+
//fmt.Println((PrettyPrint(torrentDetails)))
|
354 |
+
if err.Error != "" {
|
355 |
+
fmt.Println("Error")
|
356 |
+
fmt.Println(err_.Error)
|
357 |
+
}
|
358 |
+
var files []rd.Files
|
359 |
+
if len(torrentDetails.Files) > 0 {
|
360 |
+
files = filter[rd.Files](torrentDetails.Files, func(f rd.Files) bool {
|
361 |
+
return f.Selected == 1
|
362 |
+
})
|
363 |
+
links := torrentDetails.Links
|
364 |
+
selectedIndex := 0
|
365 |
+
|
366 |
+
if len(files) > 1 {
|
367 |
+
selectedIndex = slices.IndexFunc[[]rd.Files](files, func(t rd.Files) bool {
|
368 |
+
return strings.Contains(strings.ToLower(t.Path), strings.ToLower(ell.Name))
|
369 |
+
})
|
370 |
+
}
|
371 |
+
if selectedIndex == -1 || len(links) <= selectedIndex {
|
372 |
+
selectedIndex = 0
|
373 |
+
}
|
374 |
+
if len(links) > 0 {
|
375 |
+
unrestrictLink, errun := unrestrictLinkfromRD(links[selectedIndex])
|
376 |
+
details = append(details, unrestrictLink)
|
377 |
+
// fmt.Println(PrettyPrint(errun.Error))
|
378 |
+
// fmt.Println(PrettyPrint(details[len(details)-1]))
|
379 |
+
if errun.Error != "" {
|
380 |
+
continue
|
381 |
+
}
|
382 |
+
}
|
383 |
+
}
|
384 |
+
|
385 |
+
}
|
386 |
+
|
387 |
+
if len(details) > 0 {
|
388 |
+
ttttt.Streams = append(ttttt.Streams, types.TorrentStreams{Title: fmt.Sprintf("%s\n%s\n%s | %s", ell.TorrentName, ell.Name, getQuality(ell.Name), getSize(ell.Length)), Name: fmt.Sprintf("RD.%s\n S:%s, P:%s", item.Tracker, item.Seeders, item.Peers), Type: type_, BehaviorHints: types.BehaviorHints{BingeGroup: fmt.Sprintf("Jackett|%s", ell.InfoHash), NotWebReady: true}, URL: details[0].Download})
|
389 |
+
|
390 |
+
// ========================== END RD =============================
|
391 |
+
} else if os.Getenv("PUBLIC") == "1" {
|
392 |
+
|
393 |
+
announceList := append(ell.AnnounceList, fmt.Sprintf("dht:%s", ell.InfoHash))
|
394 |
+
ttttt.Streams = append(ttttt.Streams, types.TorrentStreams{Title: fmt.Sprintf("%s\n%s\n%s | %s", ell.TorrentName, ell.Name, getQuality(ell.Name), getSize(int(ell.Length))), Name: fmt.Sprintf("%s\n S:%s, P:%s", item.Tracker, item.Seeders, item.Peers), Type: type_, InfoHash: ell.InfoHash, Sources: announceList, BehaviorHints: types.BehaviorHints{BingeGroup: fmt.Sprintf("Jackett|%s", ell.InfoHash), NotWebReady: true}, FileIdx: parsedSuitableTorrentFilesIndex[ell.Name] - 1})
|
395 |
+
}
|
396 |
+
|
397 |
+
}
|
398 |
+
}(el)
|
399 |
+
}
|
400 |
+
|
401 |
+
wg.Wait()
|
402 |
+
|
403 |
+
if len(ttttt.Streams) > 0 {
|
404 |
+
mapCache[id] = ttttt
|
405 |
+
toFile, _ := json.MarshalIndent(mapCache, "", " ")
|
406 |
+
os.WriteFile("./persistence/cache.json", toFile, 0666)
|
407 |
+
}
|
408 |
+
|
409 |
+
fmt.Println("Sending that shit")
|
410 |
+
return c.Status(fiber.StatusOK).JSON(ttttt)
|
411 |
+
})
|
412 |
+
|
413 |
+
port := "3000"
|
414 |
+
|
415 |
+
if os.Getenv("PORT") != "" {
|
416 |
+
port = os.Getenv("PORT")
|
417 |
+
}
|
418 |
+
|
419 |
+
app.Listen(fmt.Sprintf(":%s", port))
|
420 |
+
}
|
persistence/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
*
|
rd.go
ADDED
@@ -0,0 +1,175 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package main
|
2 |
+
|
3 |
+
import (
|
4 |
+
"encoding/json"
|
5 |
+
"fmt"
|
6 |
+
"io"
|
7 |
+
"math/rand"
|
8 |
+
"net/http"
|
9 |
+
"strings"
|
10 |
+
"time"
|
11 |
+
|
12 |
+
"github.com/daniwalter001/jackett_fiber/types/rd"
|
13 |
+
"github.com/gofiber/fiber/v2"
|
14 |
+
)
|
15 |
+
|
16 |
+
var keys = []string{"N4LZTV4IC4MUUJBFQMNFHSR4OCT4EV2SL4OTDPDPBMQYEFQML3GQ",
|
17 |
+
"SKY26TG4NFOE4QJX55ISNVITB7Q2S7ZGKFOB34RUUJOBWHABJUHQ",
|
18 |
+
"2ILZOV4OXUWH2V3D276BLKVV6XRACRRVH4DPL4XSDRPB2V6QALXA",
|
19 |
+
"W665ORDQWJBT7OUT2UARA3SZYFARHVNIBBQ6ZBBEBCBBFHW5GECQ"}
|
20 |
+
|
21 |
+
var rdApikey = keys[rand.Intn(len(keys))]
|
22 |
+
|
23 |
+
func bearer() string {
|
24 |
+
return fmt.Sprintf("Bearer %s", rdApikey)
|
25 |
+
}
|
26 |
+
|
27 |
+
func checkTorrentFileinRD(hash string) (rd.AvailabilityResponse, rd.RdError) {
|
28 |
+
if len(hash) == 0 {
|
29 |
+
return rd.AvailabilityResponse{}, rd.RdError{}
|
30 |
+
|
31 |
+
}
|
32 |
+
api := fmt.Sprintf("https://api.real-debrid.com/rest/1.0/torrents/instantAvailability/%s", hash)
|
33 |
+
|
34 |
+
request := fiber.Get(api).Timeout(5 * time.Second)
|
35 |
+
request.Set("Authorization", bearer())
|
36 |
+
|
37 |
+
status, data, err := request.Bytes()
|
38 |
+
|
39 |
+
if err != nil {
|
40 |
+
return rd.AvailabilityResponse{}, rd.RdError{}
|
41 |
+
}
|
42 |
+
|
43 |
+
if status >= 400 {
|
44 |
+
var resErr rd.RdError
|
45 |
+
json.Unmarshal(data, &resErr)
|
46 |
+
return rd.AvailabilityResponse{}, resErr
|
47 |
+
}
|
48 |
+
var resJson rd.AvailabilityResponse
|
49 |
+
json.Unmarshal(data, &resJson)
|
50 |
+
return resJson, rd.RdError{}
|
51 |
+
|
52 |
+
}
|
53 |
+
|
54 |
+
func addTorrentFileinRD2(magnet string) (rd.AddTorrentResponse, rd.RdError) {
|
55 |
+
if len(magnet) == 0 {
|
56 |
+
return rd.AddTorrentResponse{}, rd.RdError{Error: "magnet not defined"}
|
57 |
+
}
|
58 |
+
|
59 |
+
url := "https://api.real-debrid.com/rest/1.0/torrents/addMagnet"
|
60 |
+
|
61 |
+
payload := strings.NewReader(fmt.Sprintf("magnet=%s", magnet))
|
62 |
+
|
63 |
+
req, _ := http.NewRequest("POST", url, payload)
|
64 |
+
|
65 |
+
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
66 |
+
req.Header.Add("User-Agent", "insomnia/8.6.1")
|
67 |
+
req.Header.Add("Authorization", bearer())
|
68 |
+
|
69 |
+
res, _ := http.DefaultClient.Do(req)
|
70 |
+
|
71 |
+
body, _ := io.ReadAll(res.Body)
|
72 |
+
|
73 |
+
if res.StatusCode >= 400 {
|
74 |
+
var resErr rd.RdError
|
75 |
+
json.Unmarshal(body, &resErr)
|
76 |
+
return rd.AddTorrentResponse{}, resErr
|
77 |
+
}
|
78 |
+
var resJson rd.AddTorrentResponse
|
79 |
+
json.Unmarshal(body, &resJson)
|
80 |
+
defer res.Body.Close()
|
81 |
+
return resJson, rd.RdError{}
|
82 |
+
|
83 |
+
}
|
84 |
+
|
85 |
+
func getTorrentInfofromRD(id string) (rd.TorrentInfoResponse, rd.RdError) {
|
86 |
+
if len(id) == 0 {
|
87 |
+
return rd.TorrentInfoResponse{}, rd.RdError{}
|
88 |
+
|
89 |
+
}
|
90 |
+
|
91 |
+
api := fmt.Sprintf("https://api.real-debrid.com/rest/1.0/torrents/info/%s", id)
|
92 |
+
|
93 |
+
request := fiber.Get(api).Timeout(5 * time.Second)
|
94 |
+
request.Set("Authorization", bearer())
|
95 |
+
|
96 |
+
status, data, err := request.Bytes()
|
97 |
+
|
98 |
+
if err != nil {
|
99 |
+
return rd.TorrentInfoResponse{}, rd.RdError{}
|
100 |
+
}
|
101 |
+
|
102 |
+
if status != fiber.StatusOK {
|
103 |
+
var resErr rd.RdError
|
104 |
+
json.Unmarshal(data, &resErr)
|
105 |
+
return rd.TorrentInfoResponse{}, resErr
|
106 |
+
}
|
107 |
+
var resJson rd.TorrentInfoResponse
|
108 |
+
json.Unmarshal(data, &resJson)
|
109 |
+
return resJson, rd.RdError{}
|
110 |
+
|
111 |
+
}
|
112 |
+
|
113 |
+
func selectFilefromRD(id string, files string) (bool, rd.RdError) {
|
114 |
+
if len(id) == 0 {
|
115 |
+
return false, rd.RdError{Error: "id not defined"}
|
116 |
+
}
|
117 |
+
if len(files) == 0 {
|
118 |
+
files = "all"
|
119 |
+
}
|
120 |
+
|
121 |
+
api := fmt.Sprintf("https://api.real-debrid.com/rest/1.0/torrents/selectFiles/%s", id)
|
122 |
+
|
123 |
+
payload := strings.NewReader(fmt.Sprintf("files=%s", files))
|
124 |
+
|
125 |
+
req, _ := http.NewRequest("POST", api, payload)
|
126 |
+
|
127 |
+
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
128 |
+
req.Header.Add("User-Agent", "insomnia/8.6.1")
|
129 |
+
req.Header.Add("Authorization", bearer())
|
130 |
+
|
131 |
+
res, _ := http.DefaultClient.Do(req)
|
132 |
+
|
133 |
+
body, _ := io.ReadAll(res.Body)
|
134 |
+
|
135 |
+
if res.StatusCode >= 400 {
|
136 |
+
var resErr rd.RdError
|
137 |
+
json.Unmarshal(body, &resErr)
|
138 |
+
return false, resErr
|
139 |
+
}
|
140 |
+
defer res.Body.Close()
|
141 |
+
return true, rd.RdError{}
|
142 |
+
|
143 |
+
}
|
144 |
+
|
145 |
+
func unrestrictLinkfromRD(link string) (rd.UnrestrictLinkResponse, rd.RdError) {
|
146 |
+
if len(link) == 0 {
|
147 |
+
return rd.UnrestrictLinkResponse{}, rd.RdError{}
|
148 |
+
}
|
149 |
+
|
150 |
+
api := "https://api.real-debrid.com/rest/1.0/unrestrict/link"
|
151 |
+
|
152 |
+
payload := strings.NewReader(fmt.Sprintf("link=%s", link))
|
153 |
+
|
154 |
+
req, _ := http.NewRequest("POST", api, payload)
|
155 |
+
|
156 |
+
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
157 |
+
req.Header.Add("User-Agent", "insomnia/8.6.1")
|
158 |
+
req.Header.Add("Authorization", bearer())
|
159 |
+
|
160 |
+
res, _ := http.DefaultClient.Do(req)
|
161 |
+
|
162 |
+
body, _ := io.ReadAll(res.Body)
|
163 |
+
|
164 |
+
if res.StatusCode >= 400 {
|
165 |
+
var resErr rd.RdError
|
166 |
+
json.Unmarshal(body, &resErr)
|
167 |
+
return rd.UnrestrictLinkResponse{}, resErr
|
168 |
+
}
|
169 |
+
|
170 |
+
var resJson rd.UnrestrictLinkResponse
|
171 |
+
json.Unmarshal(body, &resJson)
|
172 |
+
defer res.Body.Close()
|
173 |
+
return resJson, rd.RdError{}
|
174 |
+
|
175 |
+
}
|
temp/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
*
|
torrent.client.go
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package main
|
2 |
+
|
3 |
+
import (
|
4 |
+
"github.com/anacrolix/torrent"
|
5 |
+
)
|
6 |
+
|
7 |
+
func TorrentClient() *torrent.Client {
|
8 |
+
config := torrent.NewDefaultClientConfig()
|
9 |
+
|
10 |
+
// config.DataDir = "temp"
|
11 |
+
// config.DefaultStorage
|
12 |
+
config.ListenHost = func(network string) string { return "localhost" }
|
13 |
+
client, err := torrent.NewClient(config)
|
14 |
+
|
15 |
+
if err != nil {
|
16 |
+
_c, _ := torrent.NewClient(nil)
|
17 |
+
return _c
|
18 |
+
}
|
19 |
+
|
20 |
+
return client
|
21 |
+
}
|
types/imdb.meta.go
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package types
|
2 |
+
|
3 |
+
import (
|
4 |
+
"encoding/json"
|
5 |
+
"time"
|
6 |
+
)
|
7 |
+
|
8 |
+
func UnmarshalMeta(data []byte) (IMDBMeta, error) {
|
9 |
+
var r IMDBMeta
|
10 |
+
err := json.Unmarshal(data, &r)
|
11 |
+
return r, err
|
12 |
+
}
|
13 |
+
|
14 |
+
func (r *IMDBMeta) Marshal() ([]byte, error) {
|
15 |
+
return json.Marshal(r)
|
16 |
+
}
|
17 |
+
|
18 |
+
type IMDBMeta struct {
|
19 |
+
Meta struct {
|
20 |
+
Awards *string `json:"awards,omitempty"`
|
21 |
+
Cast []string `json:"cast,omitempty"`
|
22 |
+
Country *string `json:"country,omitempty"`
|
23 |
+
Description *string `json:"description,omitempty"`
|
24 |
+
Director interface{} `json:"director"`
|
25 |
+
DVDRelease interface{} `json:"dvdRelease"`
|
26 |
+
Genre []string `json:"genre,omitempty"`
|
27 |
+
ImdbRating *string `json:"imdbRating,omitempty"`
|
28 |
+
ImdbID *string `json:"imdb_id,omitempty"`
|
29 |
+
Name *string `json:"name,omitempty"`
|
30 |
+
Popularity *float64 `json:"popularity,omitempty"`
|
31 |
+
Poster *string `json:"poster,omitempty"`
|
32 |
+
Released *time.Time `json:"released,omitempty"`
|
33 |
+
Runtime *string `json:"runtime,omitempty"`
|
34 |
+
Status *string `json:"status,omitempty"`
|
35 |
+
TvdbID *int64 `json:"tvdb_id,omitempty"`
|
36 |
+
Type *string `json:"type,omitempty"`
|
37 |
+
Writer []string `json:"writer,omitempty"`
|
38 |
+
Year *string `json:"year,omitempty"`
|
39 |
+
Background *string `json:"background,omitempty"`
|
40 |
+
Logo *string `json:"logo,omitempty"`
|
41 |
+
Popularities map[string]float64 `json:"popularities,omitempty"`
|
42 |
+
MoviedbID *int64 `json:"moviedb_id,omitempty"`
|
43 |
+
Slug *string `json:"slug,omitempty"`
|
44 |
+
Trailers []struct {
|
45 |
+
Source *string `json:"source,omitempty"`
|
46 |
+
Type *string `json:"type,omitempty"`
|
47 |
+
} `json:"trailers,omitempty"`
|
48 |
+
ID *string `json:"id,omitempty"`
|
49 |
+
Genres []string `json:"genres,omitempty"`
|
50 |
+
ReleaseInfo *string `json:"releaseInfo,omitempty"`
|
51 |
+
Videos []struct {
|
52 |
+
Name *string `json:"name,omitempty"`
|
53 |
+
Season *int64 `json:"season,omitempty"`
|
54 |
+
Number *int64 `json:"number,omitempty"`
|
55 |
+
FirstAired *time.Time `json:"firstAired,omitempty"`
|
56 |
+
TvdbID *int64 `json:"tvdb_id,omitempty"`
|
57 |
+
Rating *string `json:"rating,omitempty"`
|
58 |
+
Overview *string `json:"overview,omitempty"`
|
59 |
+
Thumbnail *string `json:"thumbnail,omitempty"`
|
60 |
+
ID *string `json:"id,omitempty"`
|
61 |
+
Released *time.Time `json:"released,omitempty"`
|
62 |
+
Episode *int64 `json:"episode,omitempty"`
|
63 |
+
Description *string `json:"description,omitempty"`
|
64 |
+
} `json:"videos,omitempty"`
|
65 |
+
TrailerStreams []struct {
|
66 |
+
Title *string `json:"title,omitempty"`
|
67 |
+
YtID *string `json:"ytId,omitempty"`
|
68 |
+
} `json:"trailerStreams,omitempty"`
|
69 |
+
Links []struct {
|
70 |
+
Name *string `json:"name,omitempty"`
|
71 |
+
Category *string `json:"category,omitempty"`
|
72 |
+
URL *string `json:"url,omitempty"`
|
73 |
+
} `json:"links,omitempty"`
|
74 |
+
BehaviorHints struct {
|
75 |
+
DefaultVideoID interface{} `json:"defaultVideoId"`
|
76 |
+
HasScheduledVideos *bool `json:"hasScheduledVideos,omitempty"`
|
77 |
+
} `json:"behaviorHints,omitempty"`
|
78 |
+
} `json:"meta,omitempty"`
|
79 |
+
}
|
types/jackett.rss.go
ADDED
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package types
|
2 |
+
|
3 |
+
import (
|
4 |
+
"encoding/xml"
|
5 |
+
)
|
6 |
+
|
7 |
+
type JackettRssReponse struct {
|
8 |
+
XMLName xml.Name `xml:"rss"`
|
9 |
+
Text string `xml:",chardata"`
|
10 |
+
Version string `xml:"version,attr"`
|
11 |
+
Atom string `xml:"atom,attr"`
|
12 |
+
Torznab string `xml:"torznab,attr"`
|
13 |
+
Channel struct {
|
14 |
+
Text string `xml:",chardata"`
|
15 |
+
Link struct {
|
16 |
+
Text string `xml:",chardata"`
|
17 |
+
Href string `xml:"href,attr"`
|
18 |
+
Rel string `xml:"rel,attr"`
|
19 |
+
Type string `xml:"type,attr"`
|
20 |
+
} `xml:"link"`
|
21 |
+
Title string `xml:"title"`
|
22 |
+
Description string `xml:"description"`
|
23 |
+
Language string `xml:"language"`
|
24 |
+
Category string `xml:"category"`
|
25 |
+
Item []struct {
|
26 |
+
Text string `xml:",chardata"`
|
27 |
+
Title string `xml:"title"`
|
28 |
+
Guid string `xml:"guid"`
|
29 |
+
Jackettindexer struct {
|
30 |
+
Text string `xml:",chardata"`
|
31 |
+
ID string `xml:"id,attr"`
|
32 |
+
} `xml:"jackettindexer"`
|
33 |
+
Type string `xml:"type"`
|
34 |
+
Comments string `xml:"comments"`
|
35 |
+
PubDate string `xml:"pubDate"`
|
36 |
+
Size string `xml:"size"`
|
37 |
+
Grabs string `xml:"grabs"`
|
38 |
+
Description string `xml:"description"`
|
39 |
+
Link string `xml:"link"`
|
40 |
+
Category []string `xml:"category"`
|
41 |
+
Enclosure struct {
|
42 |
+
Text string `xml:",chardata"`
|
43 |
+
URL string `xml:"url,attr"`
|
44 |
+
Length string `xml:"length,attr"`
|
45 |
+
Type string `xml:"type,attr"`
|
46 |
+
} `xml:"enclosure"`
|
47 |
+
Attr []struct {
|
48 |
+
Text string `xml:",chardata"`
|
49 |
+
Name string `xml:"name,attr"`
|
50 |
+
Value string `xml:"value,attr"`
|
51 |
+
} `xml:"attr"`
|
52 |
+
} `xml:"item"`
|
53 |
+
} `xml:"channel"`
|
54 |
+
}
|
55 |
+
|
56 |
+
type ItemsParsed struct {
|
57 |
+
Tracker string `json:"Tracker,omitempty"`
|
58 |
+
Title string `json:"Title,omitempty"`
|
59 |
+
Seeders string `json:"Seeders,omitempty"`
|
60 |
+
Peers string `json:"Peers,omitempty"`
|
61 |
+
Link string `json:"Link,omitempty"`
|
62 |
+
MagnetURI string `json:"MagnetUri,omitempty"`
|
63 |
+
TorrentData []TorrentFile `json:"TorrentData,omitempty"`
|
64 |
+
}
|
65 |
+
|
66 |
+
type TorrentFile struct {
|
67 |
+
Name string
|
68 |
+
TorrentName string
|
69 |
+
Path string
|
70 |
+
Length int
|
71 |
+
AnnounceList []string
|
72 |
+
InfoHash string
|
73 |
+
}
|
types/kitsu.meta.go
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package types
|
2 |
+
|
3 |
+
import (
|
4 |
+
"time"
|
5 |
+
)
|
6 |
+
|
7 |
+
type KitsuMeta struct {
|
8 |
+
Meta struct {
|
9 |
+
ID string `json:"id,omitempty"`
|
10 |
+
KitsuID string `json:"kitsu_id,omitempty"`
|
11 |
+
Type string `json:"type,omitempty"`
|
12 |
+
AnimeType string `json:"animeType,omitempty"`
|
13 |
+
Name string `json:"name,omitempty"`
|
14 |
+
Slug string `json:"slug,omitempty"`
|
15 |
+
Aliases []string `json:"aliases,omitempty"`
|
16 |
+
Genres []string `json:"genres,omitempty"`
|
17 |
+
Logo string `json:"logo,omitempty"`
|
18 |
+
Poster string `json:"poster,omitempty"`
|
19 |
+
Background string `json:"background,omitempty"`
|
20 |
+
Description string `json:"description,omitempty"`
|
21 |
+
ReleaseInfo string `json:"releaseInfo,omitempty"`
|
22 |
+
Year string `json:"year,omitempty"`
|
23 |
+
ImdbRating string `json:"imdbRating,omitempty"`
|
24 |
+
UserCount int `json:"userCount,omitempty"`
|
25 |
+
Status string `json:"status,omitempty"`
|
26 |
+
Runtime string `json:"runtime,omitempty"`
|
27 |
+
Trailers []struct {
|
28 |
+
Source string `json:"source,omitempty"`
|
29 |
+
Type string `json:"type,omitempty"`
|
30 |
+
} `json:"trailers,omitempty"`
|
31 |
+
Videos []Videos `json:"videos,omitempty"`
|
32 |
+
Links []struct {
|
33 |
+
Name string `json:"name,omitempty"`
|
34 |
+
Category string `json:"category,omitempty"`
|
35 |
+
URL string `json:"url,omitempty"`
|
36 |
+
} `json:"links,omitempty"`
|
37 |
+
ImdbID string `json:"imdb_id,omitempty"`
|
38 |
+
} `json:"meta,omitempty"`
|
39 |
+
CacheMaxAge int `json:"cacheMaxAge,omitempty"`
|
40 |
+
}
|
41 |
+
|
42 |
+
type Videos struct {
|
43 |
+
ID string `json:"id,omitempty"`
|
44 |
+
Title string `json:"title,omitempty"`
|
45 |
+
Released time.Time `json:"released,omitempty"`
|
46 |
+
Season int `json:"season,omitempty"`
|
47 |
+
Episode int `json:"episode,omitempty"`
|
48 |
+
Thumbnail string `json:"thumbnail,omitempty"`
|
49 |
+
ImdbID string `json:"imdb_id,omitempty"`
|
50 |
+
ImdbSeason int `json:"imdbSeason,omitempty"`
|
51 |
+
ImdbEpisode int `json:"imdbEpisode,omitempty"`
|
52 |
+
}
|
types/manifest.go
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package types
|
2 |
+
|
3 |
+
type StreamManifest struct {
|
4 |
+
Description string `json:"description"`
|
5 |
+
ID string `json:"id"`
|
6 |
+
Logo string `json:"logo"`
|
7 |
+
Name string `json:"name"`
|
8 |
+
Resources []string `json:"resources"`
|
9 |
+
IdPrefixes []string `json:"idPrefixes"`
|
10 |
+
Types []string `json:"types"`
|
11 |
+
Version string `json:"version"`
|
12 |
+
Catalogs []string `json:"catalogs"`
|
13 |
+
}
|
types/rd/addtorrent.rd.go
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package rd
|
2 |
+
|
3 |
+
type AddTorrentResponse struct {
|
4 |
+
ID string `json:"id,omitempty"`
|
5 |
+
URI string `json:"uri,omitempty"`
|
6 |
+
}
|
types/rd/availability.rd.go
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package rd
|
2 |
+
|
3 |
+
type AvailabilityFileInfo struct {
|
4 |
+
Filename string `json:"filename,omitempty"`
|
5 |
+
Filesize int64 `json:"filesize,omitempty"`
|
6 |
+
}
|
7 |
+
type AvailabilityHoster map[string][]map[string]AvailabilityFileInfo
|
8 |
+
type AvailabilityResponse map[string]AvailabilityHoster
|
types/rd/error.rd.go
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package rd
|
2 |
+
|
3 |
+
type RdError struct {
|
4 |
+
Error string `json:"error,omitempty"`
|
5 |
+
ErrorCode int `json:"error_code,omitempty"`
|
6 |
+
ErrorDetails string `json:"error_details,omitempty"`
|
7 |
+
}
|
types/rd/torrentInfo.rd.go
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package rd
|
2 |
+
|
3 |
+
type TorrentInfoResponse struct {
|
4 |
+
ID string `json:"id,omitempty"`
|
5 |
+
Filename string `json:"filename,omitempty"`
|
6 |
+
OriginalFilename string `json:"original_filename,omitempty"`
|
7 |
+
Hash string `json:"hash,omitempty"`
|
8 |
+
Bytes int64 `json:"bytes,omitempty"`
|
9 |
+
OriginalBytes int64 `json:"original_bytes,omitempty"`
|
10 |
+
Host string `json:"host,omitempty"`
|
11 |
+
Split int `json:"split,omitempty"`
|
12 |
+
Progress int `json:"progress,omitempty"`
|
13 |
+
Status string `json:"status,omitempty"`
|
14 |
+
Added string `json:"added,omitempty"`
|
15 |
+
Files []Files `json:"files,omitempty"`
|
16 |
+
Links []string `json:"links,omitempty"`
|
17 |
+
}
|
18 |
+
|
19 |
+
type Files struct {
|
20 |
+
ID int `json:"id,omitempty"`
|
21 |
+
Path string `json:"path,omitempty"`
|
22 |
+
Bytes int64 `json:"bytes,omitempty"`
|
23 |
+
Selected int `json:"selected,omitempty"`
|
24 |
+
}
|
types/rd/unrestrictLink.rd.go
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package rd
|
2 |
+
|
3 |
+
type UnrestrictLinkResponse struct {
|
4 |
+
ID string `json:"id,omitempty"`
|
5 |
+
Filename string `json:"filename,omitempty"`
|
6 |
+
MimeType string `json:"mimeType,omitempty"`
|
7 |
+
Filesize int64 `json:"filesize,omitempty"`
|
8 |
+
Link string `json:"link,omitempty"`
|
9 |
+
Host string `json:"host,omitempty"`
|
10 |
+
HostIcon string `json:"host_icon,omitempty"`
|
11 |
+
Chunks int `json:"chunks,omitempty"`
|
12 |
+
Crc int `json:"crc,omitempty"`
|
13 |
+
Download string `json:"download,omitempty"`
|
14 |
+
Streamable int `json:"streamable,omitempty"`
|
15 |
+
}
|
types/server.go
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package types
|
2 |
+
|
3 |
+
type Server struct {
|
4 |
+
Host string
|
5 |
+
ApiKey string
|
6 |
+
}
|
types/stream.meta.go
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package types
|
2 |
+
|
3 |
+
type StreamMeta struct {
|
4 |
+
Streams []TorrentStreams `json:"streams,omitempty"`
|
5 |
+
}
|
6 |
+
|
7 |
+
type TorrentStreams struct {
|
8 |
+
Name string `json:"name,omitempty"`
|
9 |
+
Type string `json:"type,omitempty"`
|
10 |
+
InfoHash string `json:"infoHash,omitempty"`
|
11 |
+
FileIdx int `json:"fileIdx,omitempty"`
|
12 |
+
Sources []string `json:"sources,omitempty"`
|
13 |
+
Title string `json:"title,omitempty"`
|
14 |
+
URL string `json:"url,omitempty"`
|
15 |
+
BehaviorHints BehaviorHints `json:"behaviorHints,omitempty"`
|
16 |
+
}
|
17 |
+
|
18 |
+
type BehaviorHints struct {
|
19 |
+
BingeGroup string `json:"bingeGroup,omitempty"`
|
20 |
+
NotWebReady bool `json:"notWebReady,omitempty"`
|
21 |
+
}
|
utils.go
ADDED
@@ -0,0 +1,288 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package main
|
2 |
+
|
3 |
+
import (
|
4 |
+
"bytes"
|
5 |
+
"encoding/json"
|
6 |
+
"encoding/xml"
|
7 |
+
"fmt"
|
8 |
+
"math/rand"
|
9 |
+
"os"
|
10 |
+
"strings"
|
11 |
+
"time"
|
12 |
+
|
13 |
+
"github.com/daniwalter001/jackett_fiber/types"
|
14 |
+
"github.com/gofiber/fiber/v2"
|
15 |
+
gotorrentparser "github.com/j-muller/go-torrent-parser"
|
16 |
+
)
|
17 |
+
|
18 |
+
func getMeta(id string, type_ string) (string, string) {
|
19 |
+
|
20 |
+
enc := json.NewEncoder(os.Stdout)
|
21 |
+
enc.SetEscapeHTML(false)
|
22 |
+
|
23 |
+
splitedId := strings.Split(id, ":")
|
24 |
+
// api := "https://v3-cinemeta.strem.io/meta/" + type_ + "/" + splitedId[0] + ".json"
|
25 |
+
api := "https://cinemeta-live.strem.io/meta/" + type_ + "/" + splitedId[0] + ".json"
|
26 |
+
fmt.Println(api)
|
27 |
+
request := fiber.Get(api)
|
28 |
+
|
29 |
+
status, data, err := request.Bytes()
|
30 |
+
|
31 |
+
if err != nil {
|
32 |
+
panic(err)
|
33 |
+
}
|
34 |
+
|
35 |
+
fmt.Printf("Status code: %d\n", status)
|
36 |
+
|
37 |
+
if status >= 400 {
|
38 |
+
return "", ""
|
39 |
+
}
|
40 |
+
|
41 |
+
var res types.IMDBMeta
|
42 |
+
|
43 |
+
jsonErr := json.Unmarshal(data, &res)
|
44 |
+
|
45 |
+
if jsonErr != nil {
|
46 |
+
return "", ""
|
47 |
+
}
|
48 |
+
|
49 |
+
var year string
|
50 |
+
|
51 |
+
if res.Meta.Year != nil {
|
52 |
+
year = *res.Meta.Year
|
53 |
+
} else if res.Meta.ReleaseInfo != nil {
|
54 |
+
year = (*res.Meta.ReleaseInfo)[:4]
|
55 |
+
} else {
|
56 |
+
year = ""
|
57 |
+
}
|
58 |
+
|
59 |
+
return *res.Meta.Name, year
|
60 |
+
}
|
61 |
+
|
62 |
+
func getImdbFromKitsu(id string) []string {
|
63 |
+
enc := json.NewEncoder(os.Stdout)
|
64 |
+
enc.SetEscapeHTML(false)
|
65 |
+
|
66 |
+
splitedId := strings.Split(id, ":")
|
67 |
+
api := "https://anime-kitsu.strem.fun/meta/anime/" + splitedId[0] + ":" + splitedId[1] + ".json"
|
68 |
+
request := fiber.Get(api)
|
69 |
+
status, data, err := request.Bytes()
|
70 |
+
if err != nil {
|
71 |
+
panic(err)
|
72 |
+
}
|
73 |
+
|
74 |
+
fmt.Printf("Status code: %d\n", status)
|
75 |
+
|
76 |
+
if status >= 400 {
|
77 |
+
return make([]string, 0)
|
78 |
+
}
|
79 |
+
|
80 |
+
var res types.KitsuMeta
|
81 |
+
|
82 |
+
jsonErr := json.Unmarshal(data, &res)
|
83 |
+
|
84 |
+
if jsonErr != nil {
|
85 |
+
panic(jsonErr)
|
86 |
+
}
|
87 |
+
|
88 |
+
imdb := res.Meta.ImdbID
|
89 |
+
var meta types.Videos
|
90 |
+
|
91 |
+
for i := 0; i < len(res.Meta.Videos); i++ {
|
92 |
+
a := res.Meta.Videos[i]
|
93 |
+
// fmt.Println("-------------------------")
|
94 |
+
// fmt.Println(a.ID)
|
95 |
+
// fmt.Println(a.Episode)
|
96 |
+
// fmt.Println(a.Season)
|
97 |
+
// fmt.Println(a.ImdbSeason)
|
98 |
+
// fmt.Println(a.ImdbEpisode)
|
99 |
+
// fmt.Println("-------------------------")
|
100 |
+
|
101 |
+
if a.ID == id {
|
102 |
+
meta = res.Meta.Videos[i]
|
103 |
+
}
|
104 |
+
}
|
105 |
+
var resArray []string
|
106 |
+
|
107 |
+
var e int
|
108 |
+
var abs string
|
109 |
+
|
110 |
+
if meta.Episode != meta.ImdbSeason || meta.ImdbSeason == 1 {
|
111 |
+
abs = "true"
|
112 |
+
} else {
|
113 |
+
abs = "false"
|
114 |
+
}
|
115 |
+
|
116 |
+
if meta.ImdbSeason == 1 {
|
117 |
+
e = meta.ImdbEpisode
|
118 |
+
} else {
|
119 |
+
e = meta.Episode
|
120 |
+
}
|
121 |
+
|
122 |
+
resArray = append(resArray, imdb, fmt.Sprint(meta.ImdbSeason), fmt.Sprint(meta.ImdbEpisode), fmt.Sprint(meta.Season), fmt.Sprint(e), abs)
|
123 |
+
|
124 |
+
return resArray
|
125 |
+
|
126 |
+
}
|
127 |
+
|
128 |
+
func fetchTorrent(query string, type_ string) []types.ItemsParsed {
|
129 |
+
enc := json.NewEncoder(os.Stdout)
|
130 |
+
enc.SetEscapeHTML(false)
|
131 |
+
|
132 |
+
servers := getServers()
|
133 |
+
randomInt := rand.Intn(len(servers))
|
134 |
+
host := servers[randomInt].Host
|
135 |
+
apiKey := servers[randomInt].ApiKey
|
136 |
+
//
|
137 |
+
category := "5000"
|
138 |
+
if type_ == "movie" {
|
139 |
+
category = "2000"
|
140 |
+
}
|
141 |
+
query = strings.ReplaceAll(query, " ", "+")
|
142 |
+
|
143 |
+
override := os.Getenv("OVERRIDE_API_URL")
|
144 |
+
api := fmt.Sprintf("%s/api/v2.0/indexers/yggtorrent/results/torznab/api?cache=false&cat=%s&apikey=%s&q=%s", host, category, apiKey, query)
|
145 |
+
|
146 |
+
if override != "" {
|
147 |
+
api = fmt.Sprintf("%s%s&apikey=%s&q=%s", host, override, apiKey, query)
|
148 |
+
}
|
149 |
+
|
150 |
+
fmt.Println(api)
|
151 |
+
|
152 |
+
request := fiber.Get(api)
|
153 |
+
|
154 |
+
status, data, err := request.Bytes()
|
155 |
+
if err != nil {
|
156 |
+
panic(err)
|
157 |
+
}
|
158 |
+
fmt.Printf("Status code: %d\n", status)
|
159 |
+
if status >= 400 {
|
160 |
+
return make([]types.ItemsParsed, 0)
|
161 |
+
}
|
162 |
+
|
163 |
+
var res types.JackettRssReponse
|
164 |
+
|
165 |
+
xmlErr := xml.Unmarshal(data, &res)
|
166 |
+
|
167 |
+
if xmlErr != nil {
|
168 |
+
panic(xmlErr)
|
169 |
+
}
|
170 |
+
|
171 |
+
items := res.Channel.Item
|
172 |
+
var parsedItems []types.ItemsParsed
|
173 |
+
for i := 0; i < len(items); i++ {
|
174 |
+
var a types.ItemsParsed
|
175 |
+
a.Title = items[i].Title
|
176 |
+
a.Link = items[i].Enclosure.URL
|
177 |
+
a.Tracker = items[i].Jackettindexer.Text
|
178 |
+
a.MagnetURI = items[i].Link
|
179 |
+
attr := items[i].Attr
|
180 |
+
for ii := 0; ii < len(attr); ii++ {
|
181 |
+
if attr[ii].Name == "seeders" {
|
182 |
+
a.Seeders = attr[ii].Value
|
183 |
+
}
|
184 |
+
if attr[ii].Name == "peers" {
|
185 |
+
a.Peers = attr[ii].Value
|
186 |
+
}
|
187 |
+
}
|
188 |
+
parsedItems = append(parsedItems, a)
|
189 |
+
}
|
190 |
+
|
191 |
+
// fmt.Println(PrettyPrint(parsedItems))
|
192 |
+
|
193 |
+
return parsedItems
|
194 |
+
}
|
195 |
+
|
196 |
+
func readTorrent(item types.ItemsParsed) types.ItemsParsed {
|
197 |
+
url := item.Link
|
198 |
+
|
199 |
+
request := fiber.Get(url).Timeout(15 * time.Second)
|
200 |
+
|
201 |
+
status, data, err := request.Bytes()
|
202 |
+
|
203 |
+
if status >= 400 {
|
204 |
+
return item
|
205 |
+
}
|
206 |
+
|
207 |
+
if err != nil {
|
208 |
+
fmt.Printf("%s\n", err)
|
209 |
+
return item
|
210 |
+
}
|
211 |
+
|
212 |
+
if err != nil {
|
213 |
+
fmt.Println(err)
|
214 |
+
return item
|
215 |
+
}
|
216 |
+
|
217 |
+
var files []types.TorrentFile
|
218 |
+
|
219 |
+
fileReader := bytes.NewReader(data)
|
220 |
+
torrentFile, _ := gotorrentparser.Parse(fileReader)
|
221 |
+
|
222 |
+
for _, file := range torrentFile.Files {
|
223 |
+
|
224 |
+
files = append(files, types.TorrentFile{
|
225 |
+
Name: file.Path[len(file.Path)-1],
|
226 |
+
TorrentName: file.Path[len(file.Path)-1],
|
227 |
+
Path: "/" + file.Path[len(file.Path)-1],
|
228 |
+
Length: int(file.Length),
|
229 |
+
AnnounceList: torrentFile.Announce,
|
230 |
+
InfoHash: torrentFile.InfoHash,
|
231 |
+
})
|
232 |
+
}
|
233 |
+
|
234 |
+
item.TorrentData = files
|
235 |
+
|
236 |
+
return item
|
237 |
+
|
238 |
+
}
|
239 |
+
|
240 |
+
func readTorrentFromMagnet(item types.ItemsParsed) types.ItemsParsed {
|
241 |
+
|
242 |
+
// fmt.Println(item.Link)
|
243 |
+
|
244 |
+
c := TorrentClient()
|
245 |
+
|
246 |
+
t, addErr := c.AddMagnet(item.MagnetURI)
|
247 |
+
|
248 |
+
if addErr != nil {
|
249 |
+
fmt.Printf("ErrMagnet: %s\n", addErr)
|
250 |
+
return item
|
251 |
+
}
|
252 |
+
|
253 |
+
ed := make(chan string, 1)
|
254 |
+
go func() {
|
255 |
+
<-t.GotInfo()
|
256 |
+
ed <- "done"
|
257 |
+
}()
|
258 |
+
|
259 |
+
select {
|
260 |
+
case <-time.After(15 * time.Second):
|
261 |
+
return item
|
262 |
+
case res := <-ed:
|
263 |
+
if res == "done" {
|
264 |
+
|
265 |
+
var files []types.TorrentFile
|
266 |
+
for i := 0; i < len(t.Files()); i++ {
|
267 |
+
file := t.Files()[i]
|
268 |
+
var announceList []string
|
269 |
+
for i := 0; i < len(file.Torrent().Metainfo().AnnounceList); i++ {
|
270 |
+
for j := 0; j < len(file.Torrent().Metainfo().AnnounceList[i]); j++ {
|
271 |
+
announceList = append(announceList, fmt.Sprintf("tracker:%s", file.Torrent().Metainfo().AnnounceList[i][j]))
|
272 |
+
}
|
273 |
+
}
|
274 |
+
files = append(files, types.TorrentFile{
|
275 |
+
Name: file.DisplayPath(),
|
276 |
+
TorrentName: file.Torrent().Name(),
|
277 |
+
Path: file.Path(),
|
278 |
+
Length: int(file.Length()),
|
279 |
+
AnnounceList: announceList,
|
280 |
+
InfoHash: file.Torrent().InfoHash().String(),
|
281 |
+
})
|
282 |
+
}
|
283 |
+
item.TorrentData = files
|
284 |
+
}
|
285 |
+
return item
|
286 |
+
}
|
287 |
+
|
288 |
+
}
|
utils.go.old
ADDED
@@ -0,0 +1,308 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
package main
|
2 |
+
|
3 |
+
import (
|
4 |
+
"encoding/base64"
|
5 |
+
"encoding/json"
|
6 |
+
"encoding/xml"
|
7 |
+
"fmt"
|
8 |
+
"math/rand"
|
9 |
+
"os"
|
10 |
+
"strings"
|
11 |
+
"time"
|
12 |
+
|
13 |
+
"github.com/anacrolix/torrent"
|
14 |
+
"github.com/daniwalter001/jackett_fiber/types"
|
15 |
+
"github.com/gofiber/fiber/v2"
|
16 |
+
)
|
17 |
+
|
18 |
+
func getMeta(id string, type_ string) (string, string) {
|
19 |
+
|
20 |
+
enc := json.NewEncoder(os.Stdout)
|
21 |
+
enc.SetEscapeHTML(false)
|
22 |
+
|
23 |
+
splitedId := strings.Split(id, ":")
|
24 |
+
// api := "https://v3-cinemeta.strem.io/meta/" + type_ + "/" + splitedId[0] + ".json"
|
25 |
+
api := "https://cinemeta-live.strem.io/meta/" + type_ + "/" + splitedId[0] + ".json"
|
26 |
+
fmt.Println(api)
|
27 |
+
request := fiber.Get(api)
|
28 |
+
|
29 |
+
status, data, err := request.Bytes()
|
30 |
+
|
31 |
+
if err != nil {
|
32 |
+
panic(err)
|
33 |
+
}
|
34 |
+
|
35 |
+
fmt.Printf("Status code: %d\n", status)
|
36 |
+
|
37 |
+
if status >= 400 {
|
38 |
+
return "", ""
|
39 |
+
}
|
40 |
+
|
41 |
+
var res types.IMDBMeta
|
42 |
+
|
43 |
+
jsonErr := json.Unmarshal(data, &res)
|
44 |
+
|
45 |
+
if jsonErr != nil {
|
46 |
+
return "", ""
|
47 |
+
}
|
48 |
+
|
49 |
+
var year string
|
50 |
+
|
51 |
+
if res.Meta.Year != nil {
|
52 |
+
year = *res.Meta.Year
|
53 |
+
} else if res.Meta.ReleaseInfo != nil {
|
54 |
+
year = (*res.Meta.ReleaseInfo)[:4]
|
55 |
+
} else {
|
56 |
+
year = ""
|
57 |
+
}
|
58 |
+
|
59 |
+
return *res.Meta.Name, year
|
60 |
+
}
|
61 |
+
|
62 |
+
func getImdbFromKitsu(id string) []string {
|
63 |
+
enc := json.NewEncoder(os.Stdout)
|
64 |
+
enc.SetEscapeHTML(false)
|
65 |
+
|
66 |
+
splitedId := strings.Split(id, ":")
|
67 |
+
api := "https://anime-kitsu.strem.fun/meta/anime/" + splitedId[0] + ":" + splitedId[1] + ".json"
|
68 |
+
request := fiber.Get(api)
|
69 |
+
status, data, err := request.Bytes()
|
70 |
+
if err != nil {
|
71 |
+
panic(err)
|
72 |
+
}
|
73 |
+
|
74 |
+
fmt.Printf("Status code: %d\n", status)
|
75 |
+
|
76 |
+
if status >= 400 {
|
77 |
+
return make([]string, 0)
|
78 |
+
}
|
79 |
+
|
80 |
+
var res types.KitsuMeta
|
81 |
+
|
82 |
+
jsonErr := json.Unmarshal(data, &res)
|
83 |
+
|
84 |
+
if jsonErr != nil {
|
85 |
+
panic(jsonErr)
|
86 |
+
}
|
87 |
+
|
88 |
+
imdb := res.Meta.ImdbID
|
89 |
+
var meta types.Videos
|
90 |
+
|
91 |
+
for i := 0; i < len(res.Meta.Videos); i++ {
|
92 |
+
a := res.Meta.Videos[i]
|
93 |
+
// fmt.Println("-------------------------")
|
94 |
+
// fmt.Println(a.ID)
|
95 |
+
// fmt.Println(a.Episode)
|
96 |
+
// fmt.Println(a.Season)
|
97 |
+
// fmt.Println(a.ImdbSeason)
|
98 |
+
// fmt.Println(a.ImdbEpisode)
|
99 |
+
// fmt.Println("-------------------------")
|
100 |
+
|
101 |
+
if a.ID == id {
|
102 |
+
meta = res.Meta.Videos[i]
|
103 |
+
}
|
104 |
+
}
|
105 |
+
var resArray []string
|
106 |
+
|
107 |
+
var e int
|
108 |
+
var abs string
|
109 |
+
|
110 |
+
if meta.Episode != meta.ImdbSeason || meta.ImdbSeason == 1 {
|
111 |
+
abs = "true"
|
112 |
+
} else {
|
113 |
+
abs = "false"
|
114 |
+
}
|
115 |
+
|
116 |
+
if meta.ImdbSeason == 1 {
|
117 |
+
e = meta.ImdbEpisode
|
118 |
+
} else {
|
119 |
+
e = meta.Episode
|
120 |
+
}
|
121 |
+
|
122 |
+
resArray = append(resArray, imdb, fmt.Sprint(meta.ImdbSeason), fmt.Sprint(meta.ImdbEpisode), fmt.Sprint(meta.Season), fmt.Sprint(e), abs)
|
123 |
+
|
124 |
+
return resArray
|
125 |
+
|
126 |
+
}
|
127 |
+
|
128 |
+
func fetchTorrent(query string, type_ string) []types.ItemsParsed {
|
129 |
+
enc := json.NewEncoder(os.Stdout)
|
130 |
+
enc.SetEscapeHTML(false)
|
131 |
+
|
132 |
+
servers := getServers()
|
133 |
+
randomInt := rand.Intn(len(servers))
|
134 |
+
host := servers[randomInt].Host
|
135 |
+
apiKey := servers[randomInt].ApiKey
|
136 |
+
//
|
137 |
+
category := "5000"
|
138 |
+
if type_ == "movie" {
|
139 |
+
category = "2000"
|
140 |
+
}
|
141 |
+
query = strings.ReplaceAll(query, " ", "+")
|
142 |
+
|
143 |
+
override := os.Getenv("OVERRIDE_API_URL")
|
144 |
+
api := fmt.Sprintf("%s/api/v2.0/indexers/yggtorrent/results/torznab/api?cache=false&cat=%s&apikey=%s&q=%s", host, category, apiKey, query)
|
145 |
+
|
146 |
+
if override != "" {
|
147 |
+
api = fmt.Sprintf("%s%s&apikey=%s&q=%s", host, override, apiKey, query)
|
148 |
+
}
|
149 |
+
|
150 |
+
fmt.Println(api)
|
151 |
+
|
152 |
+
request := fiber.Get(api)
|
153 |
+
|
154 |
+
status, data, err := request.Bytes()
|
155 |
+
if err != nil {
|
156 |
+
panic(err)
|
157 |
+
}
|
158 |
+
fmt.Printf("Status code: %d\n", status)
|
159 |
+
if status >= 400 {
|
160 |
+
return make([]types.ItemsParsed, 0)
|
161 |
+
}
|
162 |
+
|
163 |
+
var res types.JackettRssReponse
|
164 |
+
|
165 |
+
xmlErr := xml.Unmarshal(data, &res)
|
166 |
+
|
167 |
+
if xmlErr != nil {
|
168 |
+
panic(xmlErr)
|
169 |
+
}
|
170 |
+
|
171 |
+
items := res.Channel.Item
|
172 |
+
var parsedItems []types.ItemsParsed
|
173 |
+
for i := 0; i < len(items); i++ {
|
174 |
+
var a types.ItemsParsed
|
175 |
+
a.Title = items[i].Title
|
176 |
+
a.Link = items[i].Enclosure.URL
|
177 |
+
a.Tracker = items[i].Jackettindexer.Text
|
178 |
+
a.MagnetURI = items[i].Link
|
179 |
+
attr := items[i].Attr
|
180 |
+
for ii := 0; ii < len(attr); ii++ {
|
181 |
+
if attr[ii].Name == "seeders" {
|
182 |
+
a.Seeders = attr[ii].Value
|
183 |
+
}
|
184 |
+
if attr[ii].Name == "peers" {
|
185 |
+
a.Peers = attr[ii].Value
|
186 |
+
}
|
187 |
+
}
|
188 |
+
parsedItems = append(parsedItems, a)
|
189 |
+
}
|
190 |
+
|
191 |
+
// fmt.Println(PrettyPrint(parsedItems))
|
192 |
+
|
193 |
+
return parsedItems
|
194 |
+
}
|
195 |
+
|
196 |
+
func readTorrent(item types.ItemsParsed) types.ItemsParsed {
|
197 |
+
url := item.MagnetURI
|
198 |
+
c := TorrentClient()
|
199 |
+
defer c.Close()
|
200 |
+
|
201 |
+
fileName := strings.ReplaceAll((strings.Split(url, "&file="))[len(strings.Split(url, "&file="))-1], "+", "_") + ".torrent"
|
202 |
+
|
203 |
+
if len(fileName) > 100 {
|
204 |
+
fileName = base64.StdEncoding.EncodeToString([]byte(fileName)) + ".torrent"
|
205 |
+
|
206 |
+
fileName = fileName[len(fileName)-100:]
|
207 |
+
}
|
208 |
+
// fmt.Printf("Name: %s\n", fileName)
|
209 |
+
file, errFile := os.Create(fmt.Sprintf("./temp/%s", fileName))
|
210 |
+
|
211 |
+
if errFile != nil {
|
212 |
+
fmt.Println(errFile)
|
213 |
+
fmt.Printf("1Removing...%s\n", file.Name())
|
214 |
+
os.Remove(file.Name())
|
215 |
+
return item
|
216 |
+
}
|
217 |
+
|
218 |
+
request := fiber.Get(url).Timeout(15 * time.Second)
|
219 |
+
|
220 |
+
status, data, err := request.Bytes()
|
221 |
+
|
222 |
+
if status >= 400 {
|
223 |
+
// fmt.Printf("1.5Removing...%d %s\n", status, file.Name())
|
224 |
+
os.Remove(file.Name())
|
225 |
+
return item
|
226 |
+
}
|
227 |
+
|
228 |
+
if err != nil {
|
229 |
+
fmt.Printf("%s\n", err)
|
230 |
+
// fmt.Printf("2Removing...%s\n", file.Name())
|
231 |
+
os.Remove(file.Name())
|
232 |
+
return item
|
233 |
+
}
|
234 |
+
|
235 |
+
if err != nil {
|
236 |
+
fmt.Println(err)
|
237 |
+
// fmt.Printf("3Removing...%s\n", file.Name())
|
238 |
+
os.Remove(file.Name())
|
239 |
+
return item
|
240 |
+
}
|
241 |
+
|
242 |
+
fileError := os.WriteFile(file.Name(), data, 0666)
|
243 |
+
|
244 |
+
if fileError != nil {
|
245 |
+
fmt.Println(fileError)
|
246 |
+
fmt.Printf("4Removing...%s\n", file.Name())
|
247 |
+
os.Remove(file.Name())
|
248 |
+
return item
|
249 |
+
}
|
250 |
+
|
251 |
+
t, addErr := c.AddTorrentFromFile(file.Name())
|
252 |
+
// <-t.GotInfo()
|
253 |
+
|
254 |
+
if addErr != nil {
|
255 |
+
fmt.Printf("Err: %s\n", addErr)
|
256 |
+
fmt.Printf("5Removing...%s\n", file.Name())
|
257 |
+
os.Remove(file.Name())
|
258 |
+
return item
|
259 |
+
}
|
260 |
+
// fmt.Printf("6Removing...%s\n", file.Name())
|
261 |
+
os.Remove(file.Name())
|
262 |
+
|
263 |
+
var files []torrent.File
|
264 |
+
|
265 |
+
for i := 0; i < len(t.Files()); i++ {
|
266 |
+
file := t.Files()[i]
|
267 |
+
files = append(files, *file)
|
268 |
+
}
|
269 |
+
// fmt.Println(PrettyPrint(files))
|
270 |
+
item.TorrentData = files
|
271 |
+
|
272 |
+
return item
|
273 |
+
|
274 |
+
}
|
275 |
+
|
276 |
+
func readTorrentFromMagnet(item types.ItemsParsed) types.ItemsParsed {
|
277 |
+
|
278 |
+
c := TorrentClient()
|
279 |
+
|
280 |
+
t, addErr := c.AddMagnet(item.MagnetURI)
|
281 |
+
|
282 |
+
if addErr != nil {
|
283 |
+
fmt.Printf("ErrMagnet: %s\n", addErr)
|
284 |
+
return item
|
285 |
+
}
|
286 |
+
|
287 |
+
ed := make(chan string, 1)
|
288 |
+
go func() {
|
289 |
+
<-t.GotInfo()
|
290 |
+
ed <- "done"
|
291 |
+
}()
|
292 |
+
|
293 |
+
select {
|
294 |
+
case <-time.After(15 * time.Second):
|
295 |
+
return item
|
296 |
+
case res := <-ed:
|
297 |
+
if res == "done" {
|
298 |
+
var files []torrent.File
|
299 |
+
for i := 0; i < len(t.Files()); i++ {
|
300 |
+
file := t.Files()[i]
|
301 |
+
files = append(files, *file)
|
302 |
+
}
|
303 |
+
item.TorrentData = files
|
304 |
+
}
|
305 |
+
return item
|
306 |
+
}
|
307 |
+
|
308 |
+
}
|