no1b4me commited on
Commit
866e5a0
·
verified ·
1 Parent(s): ecbe82b

Upload 26 files

Browse files
.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
+ }