diff --git a/common/utils.go b/common/utils.go index 445a159..2ce2c5c 100644 --- a/common/utils.go +++ b/common/utils.go @@ -217,7 +217,7 @@ func NewLogger(prefix string, output *os.File) *log.Logger { func GetInfohashFromURL(url string) (string, error) { // Download the torrent file var magnetLink string - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() client := &http.Client{ Timeout: 30 * time.Second, diff --git a/go.mod b/go.mod index 1457939..f447972 100644 --- a/go.mod +++ b/go.mod @@ -9,38 +9,20 @@ require ( github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 + github.com/valyala/fasthttp v1.55.0 github.com/valyala/fastjson v1.6.4 golang.org/x/time v0.6.0 ) require ( - github.com/Code-Hex/pget v0.2.1 // indirect - github.com/Code-Hex/updater v0.0.0-20160712085121-c3f278672520 // indirect - github.com/Songmu/prompter v0.5.0 // indirect - github.com/VividCortex/ewma v1.1.1 // indirect github.com/anacrolix/missinggo v1.3.0 // indirect github.com/anacrolix/missinggo/v2 v2.7.3 // indirect github.com/andybalholm/brotli v1.1.0 // indirect - github.com/antonholmquist/jason v1.0.1-0.20160829104012-962e09b85496 // indirect - github.com/asaskevich/govalidator v0.0.0-20161001163130-7b3beb6df3c4 // indirect github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 // indirect - github.com/cheggaaa/pb/v3 v3.0.8 // indirect - github.com/fatih/color v1.10.0 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect - github.com/jessevdk/go-flags v1.5.0 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/mattn/go-colorable v0.1.8 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.12 // indirect - github.com/mcuadros/go-version v0.0.0-20141206211339-d52711f8d6be // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/rivo/uniseg v0.2.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.55.0 // indirect golang.org/x/net v0.27.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/term v0.22.0 // indirect golang.org/x/text v0.16.0 // indirect ) diff --git a/go.sum b/go.sum index ec6c510..891dd6d 100644 --- a/go.sum +++ b/go.sum @@ -3,19 +3,11 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT crawshaw.io/iox v0.0.0-20181124134642-c51c3df30797/go.mod h1:sXBiorCo8c46JlQV3oXPKINnZ8mcqnye1EkVkqsectk= crawshaw.io/sqlite v0.3.2/go.mod h1:igAO5JulrQ1DbdZdtVq48mnZUBAPOeFzer7VhDWNtW4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Code-Hex/pget v0.2.1 h1:1NLINikZSxqwRJN1ovZuyD1UvYvkqb4wOeNwbRibXXo= -github.com/Code-Hex/pget v0.2.1/go.mod h1:jcJWKwjmg022+6AxA8pJDX+7Jd0j3EUTP73fU3fW/aA= -github.com/Code-Hex/updater v0.0.0-20160712085121-c3f278672520 h1:AhI5ytq4dAam2scBpgeQY/9kz/covK9/NMyzO3e8350= -github.com/Code-Hex/updater v0.0.0-20160712085121-c3f278672520/go.mod h1:RZRMRhdqo/22EdcyGiDJdIdCrptsRDEbqQ8/bswHV1E= github.com/RoaringBitmap/roaring v0.4.7/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w= github.com/RoaringBitmap/roaring v0.4.17/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI= github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/Songmu/prompter v0.5.0 h1:uf60xlFItY5nW+rlLJ2XIUfaUReo4gUEeftuUeHpio8= -github.com/Songmu/prompter v0.5.0/go.mod h1:S4Eg25l60kPlnfB2ttFVpvBKYw7RKJexzB3gzpAansY= -github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= -github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -45,11 +37,7 @@ github.com/anacrolix/torrent v1.55.0 h1:s9yh/YGdPmbN9dTa+0Inh2dLdrLQRvEAj1jdFW/H github.com/anacrolix/torrent v1.55.0/go.mod h1:sBdZHBSZNj4de0m+EbYg7vvs/G/STubxu/GzzNbojsE= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/antonholmquist/jason v1.0.1-0.20160829104012-962e09b85496 h1:dESITdufxuiwgQh1YPiPupEXORHTYvY8tr40nvrWelo= -github.com/antonholmquist/jason v1.0.1-0.20160829104012-962e09b85496/go.mod h1:+GxMEKI0Va2U8h3os6oiUAetHAlGMvxjdpAH/9uvUMA= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/asaskevich/govalidator v0.0.0-20161001163130-7b3beb6df3c4 h1:roUAANycAr9TS5tnrZboqlI+bGfcY8n9nDyD1WDgn74= -github.com/asaskevich/govalidator v0.0.0-20161001163130-7b3beb6df3c4/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/benbjohnson/immutable v0.2.0/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -61,8 +49,6 @@ github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8/go.mod h1:spo1JLcs67 github.com/cavaliergopher/grab/v3 v3.0.1 h1:4z7TkBfmPjmLAAmkkAZNX/6QJ1nNFdv3SdIHXju0Fr4= github.com/cavaliergopher/grab/v3 v3.0.1/go.mod h1:1U/KNnD+Ft6JJiYoYBAimKH2XrYptb8Kl3DFGmsjpq4= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= -github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -77,8 +63,6 @@ github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380 h1:1NyRx2f4W4WBRyg github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380/go.mod h1:thX175TtLTzLj3p7N/Q9IiKZ7NF+p72cvL91emV0hzo= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= -github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -135,8 +119,6 @@ github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63 github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -154,16 +136,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mcuadros/go-version v0.0.0-20141206211339-d52711f8d6be h1:tj81VrKAa9Vv71Ugze2mtnOiU2ozpJau8itbf3XP3fo= -github.com/mcuadros/go-version v0.0.0-20141206211339-d52711f8d6be/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -179,7 +152,6 @@ github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -200,9 +172,6 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= @@ -261,8 +230,6 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -272,20 +239,8 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20210317153231-de623e64d2a6/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= diff --git a/pkg/proxy/proxy.go b/pkg/proxy/proxy.go index 177c003..80ee233 100644 --- a/pkg/proxy/proxy.go +++ b/pkg/proxy/proxy.go @@ -211,13 +211,6 @@ func (item Item) getHash() string { } infohash = hash if infohash == "" { - //Get torrent file from http link - //Takes too long, not worth it - //magnet, err := common.OpenMagnetHttpURL(magnetLink) - //if err == nil && magnet != nil && magnet.InfoHash != "" { - // log.Printf("Magnet: %s", magnet.InfoHash) - //} - if strings.Contains(magnetLink, "http") { h, _ := common.GetInfohashFromURL(magnetLink) if h != "" { @@ -325,9 +318,7 @@ func (p *Proxy) Start() { }) } - proxy.OnRequest( - goproxy.ReqHostMatches(regexp.MustCompile("^.443$")), - UrlMatches(regexp.MustCompile("^.*/api\\?t=(search|tvsearch|movie)(&.*)?$"))).HandleConnect(goproxy.AlwaysMitm) + proxy.OnRequest(goproxy.ReqHostMatches(regexp.MustCompile("^.443$"))).HandleConnect(goproxy.AlwaysMitm) proxy.OnResponse( UrlMatches(regexp.MustCompile("^.*/api\\?t=(search|tvsearch|movie)(&.*)?$")), goproxy.StatusCodeIs(http.StatusOK, http.StatusAccepted)).DoFunc( diff --git a/pkg/qbit/arr.go b/pkg/qbit/arr.go index 959e22f..089cd06 100644 --- a/pkg/qbit/arr.go +++ b/pkg/qbit/arr.go @@ -40,7 +40,9 @@ func (q *QBit) RefreshArr(arr *debrid.Arr) { if reqErr == nil { statusOk := strconv.Itoa(resp.StatusCode)[0] == '2' if statusOk { - q.logger.Printf("Refreshed monitored downloads for %s", cmp.Or(arr.Name, arr.Host)) + if q.debug { + q.logger.Printf("Refreshed monitored downloads for %s", cmp.Or(arr.Name, arr.Host)) + } } } if reqErr != nil { diff --git a/pkg/qbit/downloader.go b/pkg/qbit/downloader.go index 096774c..7b2704a 100644 --- a/pkg/qbit/downloader.go +++ b/pkg/qbit/downloader.go @@ -1,7 +1,6 @@ package qbit import ( - "github.com/cavaliergopher/grab/v3" "goBlack/common" "goBlack/pkg/debrid" "goBlack/pkg/qbit/downloaders" @@ -13,62 +12,35 @@ import ( func (q *QBit) processManualFiles(torrent *Torrent, debridTorrent *debrid.Torrent, arr *debrid.Arr) { q.logger.Printf("Downloading %d files...", len(debridTorrent.DownloadLinks)) - parent := common.RemoveInvalidChars(filepath.Join(q.DownloadFolder, debridTorrent.Arr.Name, torrent.Name)) + torrentPath := common.RemoveExtension(debridTorrent.OriginalFilename) + parent := common.RemoveInvalidChars(filepath.Join(q.DownloadFolder, debridTorrent.Arr.Name, torrentPath)) err := os.MkdirAll(parent, os.ModePerm) if err != nil { q.logger.Printf("Failed to create directory: %s\n", parent) q.MarkAsFailed(torrent) return } + torrent.TorrentPath = torrentPath q.downloadFiles(debridTorrent, parent) q.UpdateTorrent(torrent, debridTorrent) q.RefreshArr(arr) } -func (q *QBit) downloadFile(client *grab.Client, link debrid.TorrentDownloadLinks, parent string, wg *sync.WaitGroup, semaphore chan struct{}) { - url := link.DownloadLink - defer wg.Done() - defer func() { <-semaphore }() - req, _ := grab.NewRequest(parent, url) - resp := client.Do(req) - //t := time.NewTicker(5 * time.Second) - //defer t.Stop() - //Loop: - // for { - // select { - // case <-t.C: - // fmt.Printf(" %s: transferred %d / %d bytes (%.2f%%)\n", - // resp.Filename, - // resp.BytesComplete(), - // resp.Size, - // 100*resp.Progress()) - // - // case <-resp.Done: - // // download is complete - // break Loop - // } - // } - - // Check for errors - if err := resp.Err(); err != nil { - q.logger.Printf("Error downloading %v: %v\n", url, err) - return - } - q.logger.Printf("Downloaded %s successfully\n", link.DownloadLink) -} - func (q *QBit) downloadFiles(debridTorrent *debrid.Torrent, parent string) { var wg sync.WaitGroup - client := downloaders.GetFastHTTPClient() + semaphore := make(chan struct{}, 5) + client := downloaders.GetHTTPClient() for _, link := range debridTorrent.DownloadLinks { if link.DownloadLink == "" { q.logger.Printf("No download link found for %s\n", link.Filename) continue } wg.Add(1) + semaphore <- struct{}{} go func(link debrid.TorrentDownloadLinks) { defer wg.Done() - err := downloaders.NormalFastHTTP(client, link.DownloadLink, filepath.Join(parent, link.Filename)) + defer func() { <-semaphore }() + err := downloaders.NormalHTTP(client, link.DownloadLink, filepath.Join(parent, link.Filename)) if err != nil { q.logger.Printf("Error downloading %s: %v\n", link.DownloadLink, err) } else { diff --git a/pkg/qbit/downloaders/fasthttp.go b/pkg/qbit/downloaders/fasthttp.go index 9311825..4eca3c6 100644 --- a/pkg/qbit/downloaders/fasthttp.go +++ b/pkg/qbit/downloaders/fasthttp.go @@ -10,7 +10,8 @@ import ( func GetFastHTTPClient() *fasthttp.Client { return &fasthttp.Client{ - TLSConfig: &tls.Config{InsecureSkipVerify: true}, + TLSConfig: &tls.Config{InsecureSkipVerify: true}, + StreamResponseBody: true, } } @@ -35,19 +36,24 @@ func NormalFastHTTP(client *fasthttp.Client, url, filename string) error { if err != nil { return err } - defer file.Close() + defer func(file *os.File) { + err := file.Close() + if err != nil { + fmt.Println("Error closing file:", err) + return + } + }(file) bodyStream := resp.BodyStream() if bodyStream == nil { - return fmt.Errorf("bodyStream is nil") - } - defer func() { - if rc, ok := bodyStream.(io.Closer); ok { - rc.Close() + // Write to memory and then to file + _, err := file.Write(resp.Body()) + if err != nil { + return err + } + } else { + if _, err := io.Copy(file, bodyStream); err != nil { + return err } - }() - - if _, err := io.Copy(file, bodyStream); err != nil { - return err } return nil } diff --git a/pkg/qbit/downloaders/grab.go b/pkg/qbit/downloaders/grab.go new file mode 100644 index 0000000..483b12c --- /dev/null +++ b/pkg/qbit/downloaders/grab.go @@ -0,0 +1,55 @@ +package downloaders + +import ( + "crypto/tls" + "fmt" + "github.com/cavaliergopher/grab/v3" + "net/http" + "time" +) + +func GetGrabClient() *grab.Client { + tr := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + Proxy: http.ProxyFromEnvironment, + } + return &grab.Client{ + UserAgent: "qBitTorrent", + HTTPClient: &http.Client{ + Transport: tr, + }, + } +} + +func NormalGrab(client *grab.Client, url, filename string) error { + req, err := grab.NewRequest(filename, url) + if err != nil { + return err + } + resp := client.Do(req) + if err := resp.Err(); err != nil { + return err + } + + t := time.NewTicker(2 * time.Second) + defer t.Stop() +Loop: + for { + select { + case <-t.C: + fmt.Printf(" %s: transferred %d / %d bytes (%.2f%%)\n", + resp.Filename, + resp.BytesComplete(), + resp.Size, + 100*resp.Progress()) + + case <-resp.Done: + // download is complete + break Loop + } + } + if err := resp.Err(); err != nil { + return err + } + return nil +} diff --git a/pkg/qbit/handlers_app.go b/pkg/qbit/handlers_app.go index 15e74f3..0811f62 100644 --- a/pkg/qbit/handlers_app.go +++ b/pkg/qbit/handlers_app.go @@ -7,12 +7,10 @@ import ( func (q *QBit) handleVersion(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("v4.3.2")) - w.WriteHeader(http.StatusOK) } func (q *QBit) handleWebAPIVersion(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("2.7")) - w.WriteHeader(http.StatusOK) } func (q *QBit) handlePreferences(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/qbit/main.go b/pkg/qbit/main.go index 37dcf1f..48c4767 100644 --- a/pkg/qbit/main.go +++ b/pkg/qbit/main.go @@ -63,7 +63,9 @@ func NewQBit(config *common.Config, deb debrid.Service, cache *common.Cache) *QB func (q *QBit) Start() { r := chi.NewRouter() - r.Use(middleware.Logger) + if q.debug { + r.Use(middleware.Logger) + } r.Use(middleware.Recoverer) q.AddRoutes(r) diff --git a/pkg/qbit/storage.go b/pkg/qbit/storage.go index 063db2c..59f880b 100644 --- a/pkg/qbit/storage.go +++ b/pkg/qbit/storage.go @@ -77,7 +77,7 @@ func (ts *TorrentStorage) Get(hash string) *Torrent { func (ts *TorrentStorage) GetAll(category string, filter string, hashes []string) []*Torrent { ts.mu.RLock() defer ts.mu.RUnlock() - torrents := make([]*Torrent, 0, len(ts.torrents)) + torrents := make([]*Torrent, 0) for _, id := range ts.order { torrent := ts.torrents[id] if category != "" && torrent.Category != category { diff --git a/pkg/qbit/worker.go b/pkg/qbit/worker.go index 299691d..14852f9 100644 --- a/pkg/qbit/worker.go +++ b/pkg/qbit/worker.go @@ -20,17 +20,15 @@ func (q *QBit) StartRefreshWorker(ctx context.Context) { q.logger.Println("Qbit Refresh Worker stopped") return case <-refreshTicker.C: - q.RefreshArrs() + torrents := q.storage.GetAll("", "", nil) + if len(torrents) > 0 { + q.RefreshArrs() + } } } } func (q *QBit) RefreshArrs() { - torrents := q.storage.GetAll("", "", nil) - if len(torrents) == 0 { - return - } - q.arrs.Range(func(key, value interface{}) bool { host, ok := key.(string) token, ok2 := value.(string)