diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index e5e618ca9..718c922a2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -23,7 +23,7 @@ jobs: node-version: '12' - name: Checkout code - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - name: Check code formatting using gofmt uses: Jerome1337/gofmt-action@v1.0.5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04f012c11..5b7ad8db1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: submodules: 'true' fetch-depth: 0 diff --git a/go.mod b/go.mod index 1ec3bd19f..1987dc434 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,12 @@ go 1.21 require ( github.com/ProtonMail/go-appdir v1.1.0 - github.com/PuerkitoBio/goquery v1.8.1 + github.com/PuerkitoBio/goquery v1.9.2 github.com/abbot/go-http-auth v0.4.0 github.com/anacrolix/ffprobe v1.1.0 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de - github.com/avast/retry-go/v4 v4.5.1 - github.com/blevesearch/bleve/v2 v2.4.0 + github.com/avast/retry-go/v4 v4.6.0 + github.com/blevesearch/bleve/v2 v2.4.1 github.com/bregydoc/gtranslate v0.0.0-20200913051839-1bd07f6c1fc5 github.com/creasty/defaults v1.7.0 github.com/darwayne/go-timecode v1.1.0 @@ -17,15 +17,15 @@ require ( github.com/djherbis/times v1.6.0 github.com/dustin/go-humanize v1.0.1 github.com/emicklei/go-restful-openapi/v2 v2.10.2 - github.com/emicklei/go-restful/v3 v3.12.0 + github.com/emicklei/go-restful/v3 v3.12.1 github.com/gammazero/nexus/v3 v3.2.2 github.com/getlantern/systray v1.2.2 - github.com/go-openapi/spec v0.20.14 - github.com/go-resty/resty/v2 v2.11.0 - github.com/go-test/deep v1.1.0 + github.com/go-openapi/spec v0.21.0 + github.com/go-resty/resty/v2 v2.13.1 + github.com/go-test/deep v1.1.1 github.com/gocolly/colly/v2 v2.1.0 github.com/gorilla/mux v1.8.1 - github.com/gosimple/slug v1.13.1 + github.com/gosimple/slug v1.14.0 github.com/gowww/log v1.0.0 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 github.com/jinzhu/gorm v1.9.16 @@ -46,44 +46,44 @@ require ( github.com/peterbourgon/diskv v2.0.1+incompatible github.com/pkg/errors v0.9.1 github.com/putdotio/go-putio v1.7.1 - github.com/robertkrimen/otto v0.3.0 + github.com/robertkrimen/otto v0.4.0 github.com/robfig/cron/v3 v3.0.1 - github.com/rs/cors v1.10.1 + github.com/rs/cors v1.11.0 github.com/sirupsen/logrus v1.9.3 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/thoas/go-funk v0.9.3 github.com/tidwall/gjson v1.17.1 github.com/x-cray/logrus-prefixed-formatter v0.5.2 github.com/xo/dburl v0.21.1 - golang.org/x/crypto v0.21.0 - golang.org/x/net v0.23.0 - golang.org/x/oauth2 v0.17.0 - golang.org/x/sys v0.18.0 - golang.org/x/text v0.14.0 + golang.org/x/crypto v0.25.0 + golang.org/x/net v0.27.0 + golang.org/x/oauth2 v0.21.0 + golang.org/x/sys v0.22.0 + golang.org/x/text v0.16.0 gopkg.in/gormigrate.v1 v1.6.0 - willnorris.com/go/imageproxy v0.11.3-0.20231113231555-ef50c1f9a64e + willnorris.com/go/imageproxy v0.11.3-0.20240601234520-572ad2db78ed ) require ( - github.com/blevesearch/go-faiss v1.0.13 // indirect - github.com/blevesearch/zapx/v16 v16.0.12 // indirect + github.com/blevesearch/go-faiss v1.0.19 // indirect + github.com/blevesearch/zapx/v16 v16.1.4 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( - github.com/RoaringBitmap/roaring v1.2.3 // indirect - github.com/andybalholm/cascadia v1.3.1 // indirect + github.com/RoaringBitmap/roaring v1.9.3 // indirect + github.com/andybalholm/cascadia v1.3.2 // indirect github.com/antchfx/htmlquery v1.2.3 // indirect github.com/antchfx/xmlquery v1.3.1 // indirect github.com/antchfx/xpath v1.1.10 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.2.0 // indirect - github.com/blevesearch/bleve_index_api v1.1.6 + github.com/bits-and-blooms/bitset v1.12.0 // indirect + github.com/blevesearch/bleve_index_api v1.1.9 github.com/blevesearch/geo v0.1.20 // indirect github.com/blevesearch/go-porterstemmer v1.0.3 // indirect github.com/blevesearch/gtreap v0.1.1 // indirect github.com/blevesearch/mmap-go v1.0.4 // indirect - github.com/blevesearch/scorch_segment_api/v2 v2.2.9 // indirect + github.com/blevesearch/scorch_segment_api/v2 v2.2.14 // indirect github.com/blevesearch/segment v0.9.1 // indirect github.com/blevesearch/snowballstem v0.9.0 // indirect github.com/blevesearch/upsidedown_store_api v1.0.2 // indirect @@ -93,7 +93,7 @@ require ( github.com/blevesearch/zapx/v13 v13.3.10 // indirect github.com/blevesearch/zapx/v14 v14.3.10 // indirect github.com/blevesearch/zapx/v15 v15.3.13 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/dsnet/compress v0.0.1 // indirect github.com/fcjr/aia-transport-go v1.2.2 github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 // indirect @@ -102,15 +102,15 @@ require ( github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 // indirect github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 // indirect github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/swag v0.22.6 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-sql-driver/mysql v1.5.0 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.3 // indirect github.com/google/btree v1.1.2 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -121,7 +121,6 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.1 // indirect github.com/mattn/go-isatty v0.0.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -133,10 +132,10 @@ require ( github.com/onsi/gomega v1.4.3 // indirect github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect github.com/pierrec/lz4 v2.0.5+incompatible // indirect - github.com/prometheus/client_golang v1.16.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.1 // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.53.0 // indirect + github.com/prometheus/procfs v0.14.0 // indirect github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd // indirect github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 @@ -148,10 +147,10 @@ require ( github.com/ulikunitz/xz v0.5.8 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect go.etcd.io/bbolt v1.3.7 // indirect - golang.org/x/image v0.10.0 // indirect - golang.org/x/term v0.18.0 // indirect + golang.org/x/image v0.18.0 // indirect + golang.org/x/term v0.22.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect willnorris.com/go/gifresize v1.0.0 // indirect ) diff --git a/go.sum b/go.sum index e2c875516..bec0f80f0 100644 --- a/go.sum +++ b/go.sum @@ -5,10 +5,10 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/ProtonMail/go-appdir v1.1.0 h1:9hdNDlU9kTqRKVNzmoqah8qqrj5QZyLByQdwQNlFWig= github.com/ProtonMail/go-appdir v1.1.0/go.mod h1:3d8Y9F5mbEUjrYbcJ3rcDxcWbqbttF+011nVZmdRdzc= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= -github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= -github.com/RoaringBitmap/roaring v1.2.3 h1:yqreLINqIrX22ErkKI0vY47/ivtJr6n+kMhVOVmhWBY= -github.com/RoaringBitmap/roaring v1.2.3/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE= +github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4yPeE= +github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk= +github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM= +github.com/RoaringBitmap/roaring v1.9.3/go.mod h1:6AXUsoIEzDTFFQCe1RbGA6uFONMhvejWj5rqITANK90= github.com/abbot/go-http-auth v0.4.0 h1:QjmvZ5gSC7jm3Zg54DqWE/T5m1t2AfDu6QlXJT0EVT0= github.com/abbot/go-http-auth v0.4.0/go.mod h1:Cz6ARTIzApMJDzh5bRMSUou6UMSp0IEXg9km/ci7TJM= github.com/anacrolix/envpprof v1.0.0 h1:AwZ+mBP4rQ5f7JSsrsN3h7M2xDW/xSE66IPVOqlnuUc= @@ -19,8 +19,8 @@ github.com/anacrolix/missinggo v1.1.0 h1:0lZbaNa6zTR1bELAIzCNmRGAtkHuLDPJqTiTtXo github.com/anacrolix/missinggo v1.1.0/go.mod h1:MBJu3Sk/k3ZfGYcS7z18gwfu72Ey/xopPFJJbTi5yIo= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= -github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= -github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= +github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= +github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/antchfx/htmlquery v1.2.3 h1:sP3NFDneHx2stfNXCKbhHFo8XgNjCACnU/4AO5gWz6M= github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0= github.com/antchfx/xmlquery v1.2.4/go.mod h1:KQQuESaxSlqugE2ZBcM/qn+ebIpt+d+4Xx7YcSGAIrM= @@ -32,28 +32,28 @@ github.com/antchfx/xpath v1.1.10 h1:cJ0pOvEdN/WvYXxvRrzQH9x5QWKpzHacYO8qzCcDYAg= github.com/antchfx/xpath v1.1.10/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= -github.com/avast/retry-go/v4 v4.5.1 h1:AxIx0HGi4VZ3I02jr78j5lZ3M6x1E0Ivxa6b0pUUh7o= -github.com/avast/retry-go/v4 v4.5.1/go.mod h1:/sipNsvNB3RRuT5iNcb6h73nw3IBmXJ/H3XrCQYSOpc= +github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= +github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/blevesearch/bleve/v2 v2.4.0 h1:2xyg+Wv60CFHYccXc+moGxbL+8QKT/dZK09AewHgKsg= -github.com/blevesearch/bleve/v2 v2.4.0/go.mod h1:IhQHoFAbHgWKYavb9rQgQEJJVMuY99cKdQ0wPpst2aY= -github.com/blevesearch/bleve_index_api v1.1.6 h1:orkqDFCBuNU2oHW9hN2YEJmet+TE9orml3FCGbl1cKk= -github.com/blevesearch/bleve_index_api v1.1.6/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8= +github.com/bits-and-blooms/bitset v1.12.0 h1:U/q1fAF7xXRhFCrhROzIfffYnu+dlS38vCZtmFVPHmA= +github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/blevesearch/bleve/v2 v2.4.1 h1:8QWqsifq693mN3h6cSigKqkKUsUfv5hu0FDgz/4bFuA= +github.com/blevesearch/bleve/v2 v2.4.1/go.mod h1:Ezmvsouspi+uVwnDzjIsCeUIT0WuBKlicP5JZnExWzo= +github.com/blevesearch/bleve_index_api v1.1.9 h1:Cpq0Lp3As0Gfk3+PmcoNDRKeI50C5yuFNpj0YlN/bOE= +github.com/blevesearch/bleve_index_api v1.1.9/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8= github.com/blevesearch/geo v0.1.20 h1:paaSpu2Ewh/tn5DKn/FB5SzvH0EWupxHEIwbCk/QPqM= github.com/blevesearch/geo v0.1.20/go.mod h1:DVG2QjwHNMFmjo+ZgzrIq2sfCh6rIHzy9d9d0B59I6w= -github.com/blevesearch/go-faiss v1.0.13 h1:zfFs7ZYD0NqXVSY37j0JZjZT1BhE9AE4peJfcx/NB4A= -github.com/blevesearch/go-faiss v1.0.13/go.mod h1:jrxHrbl42X/RnDPI+wBoZU8joxxuRwedrxqswQ3xfU8= +github.com/blevesearch/go-faiss v1.0.19 h1:UKoP8hS7DVsVSRRloNJb4qPfe2UQ99pP4D3oXd23g2A= +github.com/blevesearch/go-faiss v1.0.19/go.mod h1:jrxHrbl42X/RnDPI+wBoZU8joxxuRwedrxqswQ3xfU8= github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo= github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y= github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgYICSZ3w0tYk= github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc= github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs= -github.com/blevesearch/scorch_segment_api/v2 v2.2.9 h1:3nBaSBRFokjE4FtPW3eUDgcAu3KphBg1GP07zy/6Uyk= -github.com/blevesearch/scorch_segment_api/v2 v2.2.9/go.mod h1:ckbeb7knyOOvAdZinn/ASbB7EA3HoagnJkmEV3J7+sg= +github.com/blevesearch/scorch_segment_api/v2 v2.2.14 h1:fgMLMpGWR7u2TdRm7XSZVWhPvMAcdYHh25Lq1fQ6Fjo= +github.com/blevesearch/scorch_segment_api/v2 v2.2.14/go.mod h1:B7+a7vfpY4NsjuTkpv/eY7RZ91Xr90VaJzT2t7upZN8= github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU= github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw= github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s= @@ -72,15 +72,15 @@ github.com/blevesearch/zapx/v14 v14.3.10 h1:SG6xlsL+W6YjhX5N3aEiL/2tcWh3DO75Bnz7 github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns= github.com/blevesearch/zapx/v15 v15.3.13 h1:6EkfaZiPlAxqXz0neniq35my6S48QI94W/wyhnpDHHQ= github.com/blevesearch/zapx/v15 v15.3.13/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg= -github.com/blevesearch/zapx/v16 v16.0.12 h1:Uccxvjmn+hQ6ywQP+wIiTpdq9LnAviGoryJOmGwAo/I= -github.com/blevesearch/zapx/v16 v16.0.12/go.mod h1:MYnOshRfSm4C4drxx1LGRI+MVFByykJ2anDY1fxdk9Q= +github.com/blevesearch/zapx/v16 v16.1.4 h1:TBQfG77g2UUXwfjOVcEtB9pXkg6JBmGXkeZKI67+TiA= +github.com/blevesearch/zapx/v16 v16.1.4/go.mod h1:+Q+Z89Iv7ewhdX2jyE6Qs/RUnN4tZuokaQ0xvTaFmx8= github.com/bradfitz/iter v0.0.0-20140124041915-454541ec3da2 h1:1B/+1BcRhOMG1KH/YhNIU8OppSWk5d/NGyfRla88CuY= github.com/bradfitz/iter v0.0.0-20140124041915-454541ec3da2/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo= github.com/bregydoc/gtranslate v0.0.0-20200913051839-1bd07f6c1fc5 h1:fpVDaadW68V+6vqxJHU9jrW0/z1i2MQYJZyk9w2cjpw= github.com/bregydoc/gtranslate v0.0.0-20200913051839-1bd07f6c1fc5/go.mod h1:153ZQv0q0e2+tPGhDsQsYTRlVRTWIYMicEvriLNX2ZY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA= @@ -105,8 +105,8 @@ github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+m github.com/emicklei/go-restful-openapi/v2 v2.10.2 h1:RfxWvGmASIwVoZIEncvXLi5HxYQ0S8rNBkPresDMt1c= github.com/emicklei/go-restful-openapi/v2 v2.10.2/go.mod h1:4CTuOXHFg3jkvCpnXN+Wkw5prVUnP8hIACssJTYorWo= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= -github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= @@ -114,8 +114,6 @@ github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a github.com/fcjr/aia-transport-go v1.2.2 h1:sIZqXcM+YhTd2BDtkV2OJaqbcIVcPv1oKru3VJPIPc8= github.com/fcjr/aia-transport-go v1.2.2/go.mod h1:onSqSq3tGkM14WusDx7q9FTheS9R1KBtD+QBWI6zG/w= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gammazero/nexus/v3 v3.2.1 h1:9sqURks8EBEYkyEmkCtw85oApQ4ou0FCfh/jUG+Jq4I= -github.com/gammazero/nexus/v3 v3.2.1/go.mod h1:SvrRjMwDP4S9RSx52Ks39ksmYA1FQQ0OuGKcleMJTQ0= github.com/gammazero/nexus/v3 v3.2.2 h1:uEBe4rKIcbBcbdP6XuyKUhnWBXxT0BnJrecG9+yZSTs= github.com/gammazero/nexus/v3 v3.2.2/go.mod h1:55oZwPZFgRFCEjpMj1kdzffiPORKKmRsipSY8BeKRvY= github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4= @@ -134,27 +132,27 @@ github.com/getlantern/systray v1.2.2 h1:dCEHtfmvkJG7HZ8lS/sLklTH4RKUcIsKrAD9sTho github.com/getlantern/systray v1.2.2/go.mod h1:pXFOI1wwqwYXEhLPm9ZGjS2u/vVELeIgNMY5HvhHhcE= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= -github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.6 h1:dnqg1XfHXL9aBxSbktBqFR5CxVyVI+7fYWhAf1JOeTw= -github.com/go-openapi/swag v0.22.6/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0= -github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= -github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA= @@ -182,8 +180,8 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= @@ -194,15 +192,15 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q= -github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= +github.com/gosimple/slug v1.14.0 h1:RtTL/71mJNDfpUbCOmnf/XFkzKRtD6wL6Uy+3akm4Es= +github.com/gosimple/slug v1.14.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= github.com/gowww/log v1.0.0 h1:lLjZlCS76PHslrV8bZ8gk/pOr2iFhUdB9G0cnrf1CQw= @@ -271,8 +269,6 @@ github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsO github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 h1:YocNLcTBdEdvY3iDK6jfWXvEaM5OCKkjxPKoJRdB3Gg= github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= @@ -314,26 +310,26 @@ 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= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= +github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/procfs v0.14.0 h1:Lw4VdGGoKEZilJsayHf0B+9YgLGREba2C6xr+Fdfq6s= +github.com/prometheus/procfs v0.14.0/go.mod h1:XL+Iwz8k8ZabyZfMFHPiilCniixqQarAy5Mu67pHlNQ= github.com/putdotio/go-putio v1.7.1 h1:316PpOMO2a7H73foRxlpHmekeLso07et26Z00YlwQ2A= github.com/putdotio/go-putio v1.7.1/go.mod h1:QhjpLhn3La/ea4FeJlp1qsiaFZDC0EIO8VUe8VEKMV0= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/robertkrimen/otto v0.3.0 h1:5RI+8860NSxvXywDY9ddF5HcPw0puRsd8EgbXV0oqRE= -github.com/robertkrimen/otto v0.3.0/go.mod h1:uW9yN1CYflmUQYvAMS0m+ZiNo3dMzRUDQJX0jWbzgxw= +github.com/robertkrimen/otto v0.4.0 h1:/c0GRrK1XDPcgIasAsnlpBT5DelIeB9U/Z/JCQsgr7E= +github.com/robertkrimen/otto v0.4.0/go.mod h1:uW9yN1CYflmUQYvAMS0m+ZiNo3dMzRUDQJX0jWbzgxw= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd h1:CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI= @@ -351,8 +347,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/temoto/robotstxt v1.1.1 h1:Gh8RCs8ouX3hRSxxK7B1mO5RFByQ4CmJZDwgom++JaA= github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= github.com/thoas/go-funk v0.9.3 h1:7+nAEx3kn5ZJcnDm2Bh23N2yOtweO14bi//dvRtgLpw= @@ -388,13 +384,14 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.10.0 h1:gXjUUtwtx5yOE0VKWq1CH4IJAClq4UGgUA3i+rpON9M= -golang.org/x/image v0.10.0/go.mod h1:jtrku+n79PfroUbvDdeUWMAI+heR786BofxrbiSF+J0= +golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= +golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -415,22 +412,21 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.2.0/go.mod h1:Cwn6afJ8jrQwYMxQDTpISoXmXW9I6qF6vDeuuoX3Ibs= -golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -442,7 +438,6 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -451,32 +446,35 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +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.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -512,8 +510,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -541,5 +539,5 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= willnorris.com/go/gifresize v1.0.0 h1:GKS68zjNhHMqkgNTv4iFAO/j/sNcVSOHQ7SqmDAIAmM= willnorris.com/go/gifresize v1.0.0/go.mod h1:eBM8gogBGCcaH603vxSpnfjwXIpq6nmnj/jauBDKtAk= -willnorris.com/go/imageproxy v0.11.3-0.20231113231555-ef50c1f9a64e h1:TF6FfnbyfLJJG3/xHBxbZralOo+wB0LMD0fFz30G9YU= -willnorris.com/go/imageproxy v0.11.3-0.20231113231555-ef50c1f9a64e/go.mod h1:dWeBm4q0BA+XSs5ZEp0Aab4M55uu1daFMrbewDqEO1w= +willnorris.com/go/imageproxy v0.11.3-0.20240601234520-572ad2db78ed h1:/fAfb8NTgCj4tjPkOfkCTM+SrSzxf0j7wVQJRs+ZJXk= +willnorris.com/go/imageproxy v0.11.3-0.20240601234520-572ad2db78ed/go.mod h1:whpQpsPSZ1Ud3zkAWbyTr5nXPhs3SNFyHNRWHNVn/mo= diff --git a/package.json b/package.json index 8c788c6e7..6b3cf781f 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "wampy": "6.4.2" }, "devDependencies": { - "@babel/core": "7.24.5", - "@babel/eslint-parser": "7.24.5", + "@babel/core": "7.24.9", + "@babel/eslint-parser": "7.24.8", "@vue/cli-plugin-babel": "5.0.8", "@vue/cli-plugin-eslint": "5.0.8", "@vue/cli-service": "5.0.8", @@ -46,18 +46,18 @@ "eslint": "8.57.0", "eslint-plugin-import": "2.29.1", "eslint-plugin-n": "14.0.0", - "eslint-plugin-promise": "6.1.1", + "eslint-plugin-promise": "6.4.0", "eslint-plugin-standard": "4.1.0", - "eslint-plugin-vue": "9.25.0", + "eslint-plugin-vue": "9.27.0", "less": "4.2.0", "less-loader": "12.2.0", - "sass": "1.76.0", + "sass": "1.77.8", "sass-loader": "14.2.1", "simple-progress-webpack-plugin": "2.0.0", "vue-cli-plugin-i18n": "2.3.2", "vue-i18n-extract": "2.0.7", "vue-template-compiler": "2.7.16", - "webpack": "5.91.0" + "webpack": "5.93.0" }, "eslintConfig": { "root": true, diff --git a/pkg/api/deovr.go b/pkg/api/deovr.go index 1678f0cb4..4a1a2cb5f 100644 --- a/pkg/api/deovr.go +++ b/pkg/api/deovr.go @@ -419,17 +419,19 @@ func (i DeoVRResource) getDeoScene(req *restful.Request, resp *restful.Response) var deoScriptFiles []DeoSceneScriptFile var scriptFiles []models.File - scriptFiles, err = scene.GetScriptFiles() + scriptFiles, err = scene.GetScriptFilesSorted(config.Config.Interfaces.Players.ScriptSortSeq) if err != nil { log.Error(err) return } for _, file := range scriptFiles { - deoScriptFiles = append(deoScriptFiles, DeoSceneScriptFile{ - Title: file.Filename, - URL: fmt.Sprintf("%v/api/dms/file/%v", session.DeoRequestHost, file.ID), - }) + if strings.HasSuffix(file.Filename, ".funscript") { + deoScriptFiles = append(deoScriptFiles, DeoSceneScriptFile{ + Title: file.Filename, + URL: fmt.Sprintf("%v/api/dms/file/%v", session.DeoRequestHost, file.ID), + }) + } } var deoHSPFiles []DeoSceneHSPFile diff --git a/pkg/api/files.go b/pkg/api/files.go index 12f39a877..1699097b1 100644 --- a/pkg/api/files.go +++ b/pkg/api/files.go @@ -3,6 +3,8 @@ package api import ( "context" "encoding/json" + "errors" + "io/fs" "net/http" "os" "path/filepath" @@ -55,12 +57,31 @@ func (i FilesResource) WebService() *restful.WebService { ws.Route(ws.POST("/unmatch").To(i.unmatchFile). Metadata(restfulspec.KeyOpenAPITags, tags)) + ws.Route(ws.GET("/file/{file-id}").To(i.getFile). + Param(ws.PathParameter("file-id", "File ID").DataType("int")). + Metadata(restfulspec.KeyOpenAPITags, tags). + Writes(models.File{})) + ws.Route(ws.DELETE("/file/{file-id}").To(i.removeFile). Metadata(restfulspec.KeyOpenAPITags, tags)) return ws } +func (i FilesResource) getFile(req *restful.Request, resp *restful.Response) { + var file models.File + + id, err := strconv.Atoi(req.PathParameter("file-id")) + if err != nil { + log.Error(err) + return + } + + _ = file.GetIfExistByPK(uint(id)) + + resp.WriteHeaderAndEntity(http.StatusOK, file) +} + func (i FilesResource) listFiles(req *restful.Request, resp *restful.Response) { db, _ := models.GetDB() defer db.Close() @@ -328,7 +349,7 @@ func removeFileByFileId(fileId uint) models.Scene { switch file.Volume.Type { case "local": err := os.Remove(filepath.Join(file.Path, file.Filename)) - if err == nil { + if err == nil || errors.Is(err, fs.ErrNotExist) { deleted = true } else { log.Errorf("error deleting file: %v", err) diff --git a/pkg/api/heresphere.go b/pkg/api/heresphere.go index d45699fd2..4037393b5 100644 --- a/pkg/api/heresphere.go +++ b/pkg/api/heresphere.go @@ -229,7 +229,7 @@ func (i HeresphereResource) getHeresphereFile(req *restful.Request, resp *restfu Height: height, Width: width, Size: file.Size, - URL: fmt.Sprintf("%v://%v/api/dms/file/%v/%v", getProto(req), req.Request.Host, file.ID, dnt), + URL: fmt.Sprintf("%v://%v/api/dms/file/%v%v", getProto(req), req.Request.Host, file.ID, dnt), }, }, }) @@ -344,7 +344,7 @@ func (i HeresphereResource) getHeresphereScene(req *restful.Request, resp *restf Height: height, Width: width, Size: file.Size, - URL: fmt.Sprintf("%v://%v/api/dms/file/%v/%v", getProto(req), req.Request.Host, file.ID, dnt), + URL: fmt.Sprintf("%v://%v/api/dms/file/%v%v", getProto(req), req.Request.Host, file.ID, dnt), }, }, } @@ -567,7 +567,7 @@ func (i HeresphereResource) getHeresphereScene(req *restful.Request, resp *restf var heresphereSubtitlesFiles []HeresphereSubtitles var subtitlesFiles []models.File - subtitlesFiles, err = scene.GetSubtitlesFiles() + subtitlesFiles, err = scene.GetSubtitlesFilesSorted(config.Config.Interfaces.Players.SubtitleSortSeq) if err != nil { log.Error(err) return diff --git a/pkg/api/options.go b/pkg/api/options.go index 0e918ed3d..543c670a1 100644 --- a/pkg/api/options.go +++ b/pkg/api/options.go @@ -102,6 +102,7 @@ type RequestSaveOptionsDeoVR struct { MultitrackCuepoints bool `json:"multitrack_cuepoints"` VideoSortSeq string `json:"video_sort_seq"` ScriptSortSeq string `json:"script_sort_seq"` + SubtitleSortSeq string `json:"subtitle_sort_seq"` MultitrackCastCuepoints bool `json:"multitrack_cast_cuepoints"` RetainNonHSPCuepoints bool `json:"retain_non_hsp_cuepoints"` } @@ -536,6 +537,7 @@ func (i ConfigResource) saveOptionsDeoVR(req *restful.Request, resp *restful.Res config.Config.Interfaces.Heresphere.MultitrackCuepoints = r.MultitrackCuepoints config.Config.Interfaces.Players.VideoSortSeq = r.VideoSortSeq config.Config.Interfaces.Players.ScriptSortSeq = r.ScriptSortSeq + config.Config.Interfaces.Players.SubtitleSortSeq = r.SubtitleSortSeq config.Config.Interfaces.Heresphere.MultitrackCastCuepoints = r.MultitrackCastCuepoints config.Config.Interfaces.Heresphere.RetainNonHSPCuepoints = r.RetainNonHSPCuepoints if r.Password != config.Config.Interfaces.DeoVR.Password && r.Password != "" { diff --git a/pkg/config/config.go b/pkg/config/config.go index f96f3b5f3..a7a77fe6b 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -97,8 +97,9 @@ type ObjectConfig struct { RetainNonHSPCuepoints bool `default:"true" json:"retain_non_hsp_cuepoints"` } `json:"heresphere"` Players struct { - VideoSortSeq string `default:"" json:"video_sort_seq"` - ScriptSortSeq string `default:"" json:"script_sort_seq"` + VideoSortSeq string `default:"" json:"video_sort_seq"` + ScriptSortSeq string `default:"" json:"script_sort_seq"` + SubtitleSortSeq string `default:"" json:"subtitle_sort_seq"` } `json:"players"` } `json:"interfaces"` Library struct { diff --git a/pkg/migrations/migrations.go b/pkg/migrations/migrations.go index 66f48ba2a..e63ff8da3 100644 --- a/pkg/migrations/migrations.go +++ b/pkg/migrations/migrations.go @@ -1945,6 +1945,24 @@ func Migrate() { return nil }, }, + { + // Some invalid VirtualTaboo scene IDs were added to the database, this removes them + ID: "0078-remove-invalid-virtualtaboo-scenes", + Migrate: func(tx *gorm.DB) error { + var scenes []models.Scene + db.Where("scene_id = ?", "virtualtaboo-").Find(&scenes) + + for _, obj := range scenes { + files, _ := obj.GetFiles() + for _, file := range files { + file.SceneID = 0 + file.Save() + } + } + + return db.Where("scene_id = ?", "virtualtaboo-").Delete(&models.Scene{}).Error + }, + }, }) if err := m.Migrate(); err != nil { diff --git a/pkg/models/model_scene.go b/pkg/models/model_scene.go index 07417bb99..d697947fb 100644 --- a/pkg/models/model_scene.go +++ b/pkg/models/model_scene.go @@ -280,11 +280,15 @@ func (o *Scene) GetHSPFiles() ([]File, error) { return files, nil } -func (o *Scene) GetSubtitlesFiles() ([]File, error) { +func (o *Scene) GetSubtitlesFilesSorted(sort string) ([]File, error) { commonDb, _ := GetCommonDB() var files []File - commonDb.Preload("Volume").Where("scene_id = ? AND type = ?", o.ID, "subtitles").Find(&files) + if sort == "" { + commonDb.Preload("Volume").Where("scene_id = ? AND type = ?", o.ID, "subtitles").Find(&files) + } else { + commonDb.Preload("Volume").Where("scene_id = ? AND type = ?", o.ID, "subtitles").Order(sort).Find(&files) + } return files, nil } diff --git a/pkg/scrape/badoink.go b/pkg/scrape/badoink.go index ccc4201c0..c547da02b 100644 --- a/pkg/scrape/badoink.go +++ b/pkg/scrape/badoink.go @@ -62,7 +62,7 @@ func BadoinkSite(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out } }) // Cover URLs for free videos - e.ForEach(`div#videoPreviewContainer dl8-video`, func(id int, e *colly.HTMLElement) { + e.ForEach(`div#videoPreviewContainer dl8-video,video`, func(id int, e *colly.HTMLElement) { if id == 0 { sc.Covers = append(sc.Covers, strings.Split(e.Attr("poster"), "?")[0]) } @@ -292,6 +292,6 @@ func init() { registerScraper("badoinkvr", "BadoinkVR", "https://pbs.twimg.com/profile_images/618071358933610497/QaMV81nF_200x200.png", "badoinkvr.com", BadoinkVR) registerScraper("18vr", "18VR", "https://pbs.twimg.com/profile_images/989481761783545856/w-iKqgqV_200x200.jpg", "18vr.com", B18VR) registerScraper("vrcosplayx", "VRCosplayX", "https://pbs.twimg.com/profile_images/900675974039298049/ofMytpkQ_200x200.jpg", "vrcosplayx.com", VRCosplayX) - registerScraper("babevr", "BabeVR", "https://babevr.com/babevr_icons/apple-touch-icon.png", "babevr.com", BabeVR) - registerScraper("kinkvr", "KinkVR", "https://kinkvr.com/kinkvr_icons/apple-touch-icon.png", "kinkvr.com", KinkVR) + registerScraper("babevr", "BabeVR", "https://babevr.com/icons/babevr/apple-touch-icon.png", "babevr.com", BabeVR) + registerScraper("kinkvr", "KinkVR", "https://kinkvr.com/icons/kinkvr/apple-touch-icon.png", "kinkvr.com", KinkVR) } diff --git a/pkg/scrape/fuckpassvr.go b/pkg/scrape/fuckpassvr.go index 73be9dc36..a0ff8229f 100644 --- a/pkg/scrape/fuckpassvr.go +++ b/pkg/scrape/fuckpassvr.go @@ -3,16 +3,14 @@ package scrape import ( "encoding/json" "net/url" - "path" "regexp" - "strconv" "strings" "sync" "github.com/go-resty/resty/v2" "github.com/gocolly/colly/v2" + "github.com/nleeper/goment" "github.com/thoas/go-funk" - "github.com/tidwall/gjson" "github.com/xbapps/xbvr/pkg/models" ) @@ -23,61 +21,77 @@ func FuckPassVR(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out c logScrapeStart(scraperID, siteID) sceneCollector := createCollector("www.fuckpassvr.com") + siteCollector := createCollector("www.fuckpassvr.com") client := resty.New() client.SetHeader("User-Agent", UserAgent) - sceneCollector.OnResponse(func(r *colly.Response) { - if r.StatusCode != 200 { - return - } - res := gjson.ParseBytes(r.Body) - scenedata := res.Get("data.scene") - previewVideoURL := r.Ctx.Get("preview_video_url") - + sceneCollector.OnHTML(`html`, func(e *colly.HTMLElement) { sc := models.ScrapedScene{} sc.ScraperID = scraperID sc.SceneType = "VR" sc.Studio = "FuckPassVR" sc.Site = siteID + sc.HomepageURL = strings.Split(e.Request.URL.String(), "?")[0] + + e.ForEach(`meta[property="og:image"]`, func(id int, e *colly.HTMLElement) { + if id == 0 { + url := strings.Split(e.Request.AbsoluteURL(e.Attr("content")), "?")[0] + re := regexp.MustCompile(`FPVR(\d+)`) + matches := re.FindStringSubmatch(url) + if len(matches) > 1 { + sc.SiteID = matches[1] + sc.SceneID = "fpvr-" + matches[1] + } + } + }) - slug := scenedata.Get("slug").String() - sc.HomepageURL = "https://www.fuckpassvr.com/video/" + slug - - sc.SiteID = scenedata.Get("cms_id").String() - if sc.SiteID == "" || !strings.HasPrefix(sc.SiteID, "FPVR") { - return - } - sc.SceneID = "fpvr-" + strings.Replace(sc.SiteID, "FPVR", "", 1) + e.ForEach(`h2.video__title`, func(id int, e *colly.HTMLElement) { + if id == 0 { + sc.Title = strings.TrimSpace(e.Text) + } + }) - sc.Released = scenedata.Get("active_schedule").String()[:10] - sc.Title = scenedata.Get("name").String() - sc.Duration = int(scenedata.Get("duration").Int()) - sc.Covers = append(sc.Covers, scenedata.Get("thumbnail_url").String()) + e.ForEach(`web-vr-video-player`, func(id int, e *colly.HTMLElement) { + sc.Covers = append(sc.Covers, strings.Trim(e.Attr("coverimage"), " '")) + }) - desc := scenedata.Get("description").String() - desc = strings.ReplaceAll(desc, "

", "") - desc = strings.ReplaceAll(desc, "

", "\n\n") - re := regexp.MustCompile(`<(.|\n)*?>`) // strip_tags - sc.Synopsis = re.ReplaceAllString(desc, "") + e.ForEach(`div.profile__gallery a.profile__galleryElement`, func(id int, e *colly.HTMLElement) { + sc.Gallery = append(sc.Gallery, strings.TrimSpace(e.Attr("href"))) + }) sc.ActorDetails = make(map[string]models.ActorDetails) - scenedata.Get("porn_star_lead").ForEach(func(_, star gjson.Result) bool { - name := star.Get("name").String() - sc.Cast = append(sc.Cast, name) - sc.ActorDetails[name] = models.ActorDetails{Source: sc.ScraperID + " scrape", ProfileUrl: "https://www.fuckpassvr.com/api/api/seo?porn_star_slug=" + star.Get("slug").String()} - return true + e.ForEach(`div.models a`, func(id int, e *colly.HTMLElement) { + sc.Cast = append(sc.Cast, strings.TrimSpace(e.Attr("title"))) + sc.ActorDetails[strings.TrimSpace(e.Attr("title"))] = models.ActorDetails{Source: sc.ScraperID + " scrape", ProfileUrl: e.Request.AbsoluteURL(e.Attr("href"))} }) - scenedata.Get("porn_star").ForEach(func(_, star gjson.Result) bool { - name := star.Get("name").String() - sc.Cast = append(sc.Cast, name) - sc.ActorDetails[name] = models.ActorDetails{Source: sc.ScraperID + " scrape", ProfileUrl: "https://www.fuckpassvr.com/api/api/seo?porn_star_slug=" + star.Get("slug").String()} - return true + + e.ForEach(`a.tag`, func(id int, e *colly.HTMLElement) { + sc.Tags = append(sc.Tags, strings.TrimSpace(e.Attr("title"))) }) - scenedata.Get("tag_input").ForEach(func(_, tag gjson.Result) bool { - sc.Tags = append(sc.Tags, tag.String()) - return true + e.ForEach(`div.readMoreWrapper2`, func(id int, e *colly.HTMLElement) { + sc.Synopsis = strings.TrimSpace(e.Text) + }) + + e.ForEach(`div.video__addons p.wrapper__text`, func(id int, e *colly.HTMLElement) { + s := strings.TrimSpace(e.Text) + if strings.HasPrefix(s, "Released:") { + tmpDate, _ := goment.New(strings.TrimSpace(strings.TrimPrefix(s, "Released:")), "MMM DD YYYY") + sc.Released = tmpDate.Format("YYYY-MM-DD") + } + }) + + e.ForEach(`div.wrapper__download a.wrapper__downloadLink`, func(id int, e *colly.HTMLElement) { + url, err := url.Parse(e.Attr("href")) + if err == nil { + parts := strings.Split(url.Path, "/") + if len(parts) > 0 { + fn := parts[len(parts)-1] + fn = strings.Replace(fn, "2min", "FULL", -1) + sc.Filenames = append(sc.Filenames, fn) + } + } }) // trailer details @@ -86,82 +100,27 @@ func FuckPassVR(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out c strParams, _ := json.Marshal(params) sc.TrailerSrc = string(strParams) - resolutions := []string{"8kUHD", "8kHD", "4k", "2k", "1k"} - parsedFileNameURL, err := url.Parse(previewVideoURL) - if err == nil { - fileNameBase := path.Base(parsedFileNameURL.Path) - if strings.HasSuffix(strings.ToLower(fileNameBase), "_rollover.mp4") { - for i := range resolutions { - fn := fileNameBase[:len(fileNameBase)-len("_rollover.mp4")] + "-FULL_" + resolutions[i] + ".mp4" - sc.Filenames = append(sc.Filenames, fn) - } - } - } else { - log.Error(err) - } + out <- sc + }) - resp, err := client.R(). - SetQueryParams(map[string]string{ - "scene_id": scenedata.Get("id").String(), - }). - Get("https://www.fuckpassvr.com/api/api/storyboard/show") - - if err == nil { - res := gjson.ParseBytes(resp.Body()) - res.Get("data.storyboards.#.image_origin_url").ForEach(func(_, url gjson.Result) bool { - sc.Gallery = append(sc.Gallery, url.String()) - return true - }) - } else { - log.Error(err) + siteCollector.OnHTML(`section.pagination a`, func(e *colly.HTMLElement) { + if !limitScraping { + siteCollector.Visit(e.Attr("href")) } - - out <- sc }) - var page int64 = 1 - var lastPage int64 = 1 - if limitScraping { - lastPage = 1 - } + siteCollector.OnHTML(`div.videos__element a.videos__videoTitle`, func(e *colly.HTMLElement) { + sceneURL := e.Request.AbsoluteURL(e.Attr("href")) + + if !funk.ContainsString(knownScenes, sceneURL) { + sceneCollector.Visit(sceneURL) + } + }) if singleSceneURL != "" { - ctx := colly.NewContext() - ctx.Put("preview_video_url", "") - slug := strings.Replace(singleSceneURL, "https://www.fuckpassvr.com/video/", "", 1) - sceneDetail := "https://www.fuckpassvr.com/api/api/scene/show?slug=" + slug - sceneCollector.Request("GET", sceneDetail, nil, ctx, nil) + sceneCollector.Visit(singleSceneURL) } else { - for page <= lastPage { - resp, err := client.R(). - SetQueryParams(map[string]string{ - "size": "24", - "sortBy": "newest", - "page": strconv.FormatInt(page, 10), - }). - Get("https://www.fuckpassvr.com/api/api/scene") - - if err == nil { - res := gjson.ParseBytes(resp.Body()) - res.Get("data.scenes.data").ForEach(func(_, scenedata gjson.Result) bool { - ctx := colly.NewContext() - ctx.Put("preview_video_url", scenedata.Get("preview_video_url").String()) - - sceneURL := "https://www.fuckpassvr.com/video/" + scenedata.Get("slug").String() - sceneDetail := "https://www.fuckpassvr.com/api/api/scene/show?slug=" + scenedata.Get("slug").String() - - if !funk.ContainsString(knownScenes, sceneURL) { - sceneCollector.Request("GET", sceneDetail, nil, ctx, nil) - } - - return true - }) - lastPage = res.Get("data.scenes.last_page").Int() - page = page + 1 - } else { - log.Error(err) - } - } + siteCollector.Visit("https://www.fuckpassvr.com/destination") } if updateSite { diff --git a/pkg/scrape/javdatabase.go b/pkg/scrape/javdatabase.go index c30b79d41..c0d99d338 100644 --- a/pkg/scrape/javdatabase.go +++ b/pkg/scrape/javdatabase.go @@ -94,6 +94,66 @@ func ScrapeJavDB(out *[]models.ScrapedScene, queryString string) { }) + html.ForEach(`p.mb-1`, func(id int, p *colly.HTMLElement) { + tr := strings.Split(p.Text, ": ") + label := tr[0] + + if label == `Studio` { + // Studio + sc.Studio = tr[1] + + } else if label == `DVD ID` { + // Title, SceneID and SiteID all like 'VRKM-821' format + dvdId := strings.ToUpper(tr[1]) + sc.Title = dvdId + sc.SceneID = dvdId + sc.SiteID = dvdId + + // Set 'Site' to first part of the ID (e.g. `VRKM for `vrkm-821`) + siteParts := strings.Split(dvdId, `-`) + if len(siteParts) > 0 { + sc.Site = siteParts[0] + } + + } else if label == `Release Date` { + // Release date + dateStr := tr[1] + tmpDate, _ := goment.New(strings.TrimSpace(dateStr), "YYYY-MM-DD") + sc.Released = tmpDate.Format("YYYY-MM-DD") + + } else if label == `Genre(s)` { + // Tags + /* NOTE: + "Tags are technically incomplete vs. what you'd get translating dmm.co.jp + tags/correlating them back to their old equivalents on r18 using something + like Javinizer's tag CSV" + */ + p.ForEach("a", func(id int, anchor *colly.HTMLElement) { + href := anchor.Attr("href") + if strings.Contains(href, "javdatabase.com/genres/") { + // Tags + tag := ProcessJavrTag(anchor.Text) + + if tag != "" { + sc.Tags = append(sc.Tags, tag) + } + } + }) + + } else if label == `Translated Title` { + // Synopsis / description + sc.Synopsis = tr[1] + + } else if label == `Content ID` { + contentId = tr[1] + + } else if label == "Runtime" { + // Duration + sc.Duration, _ = strconv.Atoi(strings.Split(tr[1], " ")[0]) + } + + }) + // Screenshots html.ForEach("a[href]", func(_ int, anchor *colly.HTMLElement) { linkHref := anchor.Attr(`href`) diff --git a/pkg/scrape/littlecaprice.go b/pkg/scrape/littlecaprice.go index 8ec4b01c4..a0387df0e 100644 --- a/pkg/scrape/littlecaprice.go +++ b/pkg/scrape/littlecaprice.go @@ -1,8 +1,7 @@ package scrape import ( - "regexp" - "strconv" + "net/url" "strings" "sync" "time" @@ -23,12 +22,7 @@ func LittleCaprice(wg *sync.WaitGroup, updateSite bool, knownScenes []string, ou siteCollector := createCollector("www.littlecaprice-dreams.com") galleryCollector := cloneCollector(sceneCollector) - // RegEx Patterns - coverRegEx := regexp.MustCompile(`\.vid_bg {\nbackground: url\('(.+?)'`) - durationRegEx := regexp.MustCompile(`(\d+):(\d+)`) - descriptionRegEx := regexp.MustCompile(`(?i)^e(?:nglish)?:`) - - sceneCollector.OnHTML(`article.project`, func(e *colly.HTMLElement) { + sceneCollector.OnHTML(`html`, func(e *colly.HTMLElement) { sc := models.ScrapedScene{} sc.ScraperID = scraperID sc.SceneType = "VR" @@ -37,52 +31,52 @@ func LittleCaprice(wg *sync.WaitGroup, updateSite bool, knownScenes []string, ou sc.HomepageURL = strings.Split(e.Request.URL.String(), "?")[0] // Scene ID - Generate randomly - sc.SiteID = strings.Split(e.Attr("id"), "-")[1] + e.ForEach(`link[rel="shortlink"]`, func(id int, e *colly.HTMLElement) { + link := e.Request.AbsoluteURL(e.Attr("href")) + tmpurl, _ := url.Parse(link) + sc.SiteID = tmpurl.Query().Get("p") + }) sc.SceneID = slugify.Slugify(sc.Site + "-" + sc.SiteID) // Title - sc.Title = strings.TrimSpace(e.ChildText(`.vid_title`)) + e.ForEach(`.project-header h1`, func(id int, e *colly.HTMLElement) { + if id == 0 { + sc.Title = strings.TrimSpace(e.Text) + } + }) // Cover - cover := e.Request.Ctx.GetAny("cover").(string) - if len(cover) == 0 { - cover = coverRegEx.FindStringSubmatch(e.DOM.Find(`style`).Text())[1] - } - cover = strings.Replace(cover, "media.", "", -1) - sc.Covers = append(sc.Covers, e.Request.AbsoluteURL(cover)) + e.ForEach(`meta[name="og:image"]`, func(id int, e *colly.HTMLElement) { + if id == 0 { + sc.Covers = append(sc.Covers, strings.Split(e.Request.AbsoluteURL(e.Attr("content")), "?")[0]) + } + }) // Duration - minutes := durationRegEx.FindStringSubmatch(e.ChildText(`.vid_length`))[1] - sc.Duration, _ = strconv.Atoi(minutes) // Released - dt, _ := time.Parse("January 2, 2006", e.ChildText(`.vid_date`)) - sc.Released = dt.Format("2006-01-02") + e.ForEach(`meta[name="og:published_time"]`, func(id int, e *colly.HTMLElement) { + dt, _ := time.Parse("2006-01-02", e.Attr("content")[:10]) + sc.Released = dt.Format("2006-01-02") + }) // Synopsis - sc.Synopsis = strings.TrimSpace( - descriptionRegEx.ReplaceAllString( // Some scene descriptions include a redundant prefix. We remove it. - e.ChildText(`.vid_desc`), "")) + e.ForEach(`.desc-text`, func(id int, e *colly.HTMLElement) { + sc.Synopsis = strings.TrimSpace(e.Text) + }) // Cast and tags - e.ForEach(`.vid_infos .vid_info_content a`, func(id int, e *colly.HTMLElement) { - if e.Attr("rel") == "tag" { - sc.Tags = append(sc.Tags, strings.TrimSpace(e.Text)) - } else { - sc.Cast = append(sc.Cast, strings.TrimSpace(e.Text)) - } + e.ForEach(`.project-models .list a`, func(id int, e *colly.HTMLElement) { + sc.Cast = append(sc.Cast, strings.TrimSpace(e.Text)) }) - // Gallery - galleryPage, _ := e.DOM.Find(`.vid_buttons a[href*="project"]`).Attr("href") - ctx := colly.NewContext() - ctx.Put("scene", sc) - - galleryCollector.Request("GET", galleryPage, nil, ctx, nil) + // Tags + e.ForEach(`meta[name="og:video:tag"]`, func(id int, e *colly.HTMLElement) { + sc.Tags = append(sc.Tags, e.Attr("content")) + }) - if galleryPage == "" { - out <- sc - } + // Gallery + out <- sc }) galleryCollector.OnHTML(`html`, func(e *colly.HTMLElement) { @@ -96,16 +90,13 @@ func LittleCaprice(wg *sync.WaitGroup, updateSite bool, knownScenes []string, ou out <- sc }) - siteCollector.OnHTML(`.et_pb_portfolio_item`, func(e *colly.HTMLElement) { - sceneURL := e.Request.AbsoluteURL(e.ChildAttr(`a`, "href")) + siteCollector.OnHTML(`.project-preview`, func(e *colly.HTMLElement) { + sceneURL := e.Request.AbsoluteURL(e.Attr("href")) // If scene exists in database, there's no need to scrape if !funk.ContainsString(knownScenes, sceneURL) { - ctx := colly.NewContext() - ctx.Put("cover", e.ChildAttr("img", "src")) - //sceneCollector.Visit(sceneURL) - sceneCollector.Request("GET", sceneURL, nil, ctx, nil) + sceneCollector.Request("GET", sceneURL, nil, nil, nil) } }) @@ -114,7 +105,7 @@ func LittleCaprice(wg *sync.WaitGroup, updateSite bool, knownScenes []string, ou ctx.Put("cover", "") sceneCollector.Request("GET", singleSceneURL, nil, ctx, nil) } else { - siteCollector.Visit("https://www.littlecaprice-dreams.com/virtual-reality-little-caprice-dreams/") + siteCollector.Visit("https://www.littlecaprice-dreams.com/collection/virtual-reality/") } // Missing "Me and You" (my-first-time) scene @@ -124,7 +115,7 @@ func LittleCaprice(wg *sync.WaitGroup, updateSite bool, knownScenes []string, ou ctx.Put("cover", "https://www.littlecaprice-dreams.com/wp-content/uploads/2021/08/wpp_Little-Caprice-Virtual-Reality_.jpg") //sceneCollector.Visit(sceneURL) - sceneCollector.Request("GET", sceneURL, nil, ctx, nil) + sceneCollector.Visit(sceneURL) } if updateSite { @@ -135,5 +126,5 @@ func LittleCaprice(wg *sync.WaitGroup, updateSite bool, knownScenes []string, ou } func init() { - registerScraper("littlecaprice", "Little Caprice Dreams", "https://littlecaprice-dreams.com/wp-content/uploads/2019/03/cropped-lcd-heart-180x180.png", "littlecaprice-dreams.com", LittleCaprice) + registerScraper("littlecaprice", "Little Caprice Dreams", "https://www.littlecaprice-dreams.com/wp-content/uploads/2019/03/cropped-lcd-heart-192x192.png", "littlecaprice-dreams.com", LittleCaprice) } diff --git a/pkg/scrape/realjamvr.go b/pkg/scrape/realjamvr.go index 913cc0b03..d2ea92306 100644 --- a/pkg/scrape/realjamvr.go +++ b/pkg/scrape/realjamvr.go @@ -3,7 +3,6 @@ package scrape import ( "encoding/json" "net/http" - "net/url" "regexp" "strconv" "strings" @@ -120,38 +119,23 @@ func RealJamSite(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out }) // Filenames - fileMask := "" - // any "download/" links on the public site will be for trailers, use one trailer to get the basis of the scenes filenames - e.ForEachWithBreak(`a[href^='download/']`, func(id int, e *colly.HTMLElement) bool { - trailerurl := sc.HomepageURL + "/" + e.Attr("href") - // url does not point directly to a file, need to resolve redirects with http.Head - resp, err := http.Head(trailerurl) - if err == nil { - params, err := url.ParseQuery(resp.Request.URL.RawQuery) - if err == nil { - if fileMaskTmp, ok := params["bcdn_filename"]; ok { - tmp := strings.Split(fileMaskTmp[0], "_") - if len(tmp) > 4 { - fileMask = strings.TrimSuffix(tmp[0], "-Trailer") + "-Full_$res_$fps_" + tmp[3] + "_" + tmp[4] - return false - } - } - } - } - return true - }) + fileMasktmp := strings.Split(sc.HomepageURL, "/") + fileMask := strings.Replace(sc.Site, " ", "", -1) + "-" + fileMasktmp[len(fileMasktmp)-1] + "-Full$res_$fps_LR_180.mp4" // any "/join/" links on the public site will be for for the full movie uniqueFilenames := make(map[string]bool) e.ForEach(`a[href='/join/']`, func(id int, e *colly.HTMLElement) { resolution := "" - fps := "" + fps := "60" e.ForEach(`div div`, func(id int, e *colly.HTMLElement) { txt := strings.TrimSpace(e.Text) if strings.HasPrefix(txt, "Full ") { index := strings.Index(txt, "p") if index != -1 { - resolution = txt[5:index] + resolution = "_" + txt[5:index] + } + if strings.HasSuffix(txt, "HBR") { + resolution = "-HBR" + resolution } } else { if strings.HasSuffix(txt, "fps") { diff --git a/pkg/scrape/slrstudios.go b/pkg/scrape/slrstudios.go index 17ae67331..4eb488502 100644 --- a/pkg/scrape/slrstudios.go +++ b/pkg/scrape/slrstudios.go @@ -427,6 +427,10 @@ func appendFilenames(sc *models.ScrapedScene, siteID string, filenameRegEx *rege // Only shown for logged in users so need to generate them // Format: SLR_siteID_Title__SceneID__<180/360>.mp4 if !isTransScene { + // Force siteID when scraping individual scenes without a custom site + if siteID == "" { + siteID = gjson.Get(JsonMetadataA, "paysite.name").String() + } viewAngle := gjson.Get(JsonMetadataA, "viewAngle").String() projSuffix := "_LR_180.mp4" if viewAngle == "190" || viewAngle == "200" || viewAngle == "220" { diff --git a/pkg/scrape/stasyqvr.go b/pkg/scrape/stasyqvr.go index a634d00ea..e131badb1 100644 --- a/pkg/scrape/stasyqvr.go +++ b/pkg/scrape/stasyqvr.go @@ -101,7 +101,6 @@ func StasyQVR(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out cha base = strings.Replace(base, "\"", "", -1) if !funk.ContainsString(sc.Filenames, base) { sc.Filenames = append(sc.Filenames, base) - sc.Filenames = append(sc.Filenames, strings.Replace(base, "original_", "original_"+sc.SiteID, -1)) } }) diff --git a/pkg/scrape/virtualtaboo.go b/pkg/scrape/virtualtaboo.go index a284eb3e6..c997d1918 100644 --- a/pkg/scrape/virtualtaboo.go +++ b/pkg/scrape/virtualtaboo.go @@ -34,9 +34,15 @@ func VirtualTaboo(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out sc.HomepageURL = strings.Split(e.Request.URL.String(), "?")[0] // Scene ID - get from URL - e.ForEach(`#player`, func(id int, e *colly.HTMLElement) { - sc.SiteID = strings.Split(e.Attr("data-poster-index"), ":")[0] - sc.SceneID = slugify.Slugify(sc.Site) + "-" + sc.SiteID + e.ForEach(`script`, func(id int, e *colly.HTMLElement) { + if strings.Contains(e.Text, "var video =") { + r := regexp.MustCompile(`id: (\d+),`) + m := r.FindStringSubmatch(e.Text) + if len(m) > 0 { + sc.SiteID = m[1] + sc.SceneID = slugify.Slugify(sc.Site) + "-" + sc.SiteID + } + } }) // Title @@ -107,7 +113,9 @@ func VirtualTaboo(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out sc.Duration = tmpDuration }) - out <- sc + if sc.SiteID != "" { + out <- sc + } }) siteCollector.OnHTML(`ul.pagination a`, func(e *colly.HTMLElement) { diff --git a/pkg/tasks/heatmap.go b/pkg/tasks/heatmap.go index 3f7e829a1..52150cb61 100644 --- a/pkg/tasks/heatmap.go +++ b/pkg/tasks/heatmap.go @@ -10,6 +10,7 @@ import ( "os" "path/filepath" "sort" + "strings" "github.com/lucasb-eyer/go-colorful" "github.com/sirupsen/logrus" @@ -20,7 +21,7 @@ import ( // Script is the Funscript container type holding Launch data. type Script struct { // Version of Launchscript - Version string `json:"version"` + Version interface{} `json:"version"` // Inverted causes up and down movement to be flipped. Inverted bool `json:"inverted,omitempty"` // Range is the percentage of a full stroke to use. @@ -69,21 +70,24 @@ func GenerateHeatmaps(tlog *logrus.Entry) { tlog.Infof("Generating heatmaps (%v/%v)", i+1, len(scriptfiles)) } if file.Exists() { - log.Infof("Rendering %v", file.Filename) - destFile := filepath.Join(common.ScriptHeatmapDir, fmt.Sprintf("heatmap-%d.png", file.ID)) - err := RenderHeatmap( - file.GetPath(), - destFile, - 1000, - 10, - 250, - ) - if err == nil { - file.HasHeatmap = true - file.RefreshHeatmapCache = true - file.Save() - } else { - log.Warn(err) + path := file.GetPath() + if strings.HasSuffix(path, ".funscript") { + log.Infof("Rendering %v", file.Filename) + destFile := filepath.Join(common.ScriptHeatmapDir, fmt.Sprintf("heatmap-%d.png", file.ID)) + err := RenderHeatmap( + path, + destFile, + 1000, + 10, + 250, + ) + if err == nil { + file.HasHeatmap = true + file.RefreshHeatmapCache = true + file.Save() + } else { + log.Warn(err) + } } } } @@ -127,6 +131,9 @@ func RenderHeatmap(inputFile string, destFile string, width, height, numSegments if err != nil { return err } + if funscript.IsFunscriptToken() { + return fmt.Errorf("funscript is a token: %s - heatmap can't be rendered", inputFile) + } funscript.UpdateIntensity() gradient := funscript.getGradientTable(numSegments) @@ -256,21 +263,59 @@ func (funscript Script) getGradientTable(numSegments int) GradientTable { return gradient } +func (funscript *Script) IsFunscriptToken() bool { + if len(funscript.Actions) > 100 { + return false + } + actions := make([]Action, len(funscript.Actions)) + copy(actions, funscript.Actions) + sort.SliceStable(actions, func(i, j int) bool { return funscript.Actions[i].Pos < funscript.Actions[j].Pos }) + + if actions[0].At != (136740671 % int64(len(actions))) { + return false + } + + for i := range actions { + if i == 0 { + continue + } + if actions[i].Pos != actions[i-1].Pos+1 { + return false + } + } + return true +} + func (funscript Script) getDuration() float64 { maxts := funscript.Actions[len(funscript.Actions)-1].At duration := float64(maxts) / 1000.0 - if funscript.Metadata != nil && float64(funscript.Metadata.Duration) > duration { - duration = float64(funscript.Metadata.Duration) + if funscript.Metadata != nil { + metadataDuration := float64(funscript.Metadata.Duration) + + if metadataDuration > 50000 { + // large values are likely in milliseconds + metadataDuration = metadataDuration / 1000.0 + } + if metadataDuration > duration { + duration = metadataDuration + } } return duration } func getFunscriptDuration(path string) (float64, error) { + if !strings.HasSuffix(path, ".funscript") { + return 0.0, fmt.Errorf("not a funscript: %s", path) + } + funscript, err := LoadFunscriptData(path) if err != nil { return 0.0, err } + if funscript.IsFunscriptToken() { + return 0.0, fmt.Errorf("funscript is a token: %s", path) + } return funscript.getDuration(), nil } diff --git a/pkg/tasks/volume.go b/pkg/tasks/volume.go index 4c9def118..484c570bf 100644 --- a/pkg/tasks/volume.go +++ b/pkg/tasks/volume.go @@ -77,15 +77,16 @@ func RescanVolumes(id int) { filename := escape(unescapedFilename) filename2 := strings.Replace(filename, ".funscript", ".mp4", -1) filename3 := strings.Replace(filename, ".hsp", ".mp4", -1) - filename3 = strings.Replace(filename3, ".srt", ".mp4", -1) - err := db.Where("filenames_arr LIKE ? OR filenames_arr LIKE ? OR filenames_arr LIKE ?", `%"`+filename+`"%`, `%"`+filename2+`"%`, `%"`+filename3+`"%`).Find(&scenes).Error + filename4 := strings.Replace(filename, ".srt", ".mp4", -1) + filename5 := strings.Replace(filename, ".cmscript", ".mp4", -1) + err := db.Where("filenames_arr LIKE ? OR filenames_arr LIKE ? OR filenames_arr LIKE ? OR filenames_arr LIKE ? OR filenames_arr LIKE ?", `%"`+filename+`"%`, `%"`+filename2+`"%`, `%"`+filename3+`"%`, `%"`+filename4+`"%`, `%"`+filename5+`"%`).Find(&scenes).Error if err != nil { log.Error(err, " when matching "+unescapedFilename) } if len(scenes) == 0 && config.Config.Advanced.UseAltSrcInFileMatching { // check if the filename matches in external_reference record - db.Preload("XbvrLinks").Where("external_source like 'alternate scene %' and external_data LIKE ? OR external_data LIKE ? OR external_data LIKE ?", `%"`+filename+`%`, `%"`+filename2+`%`, `%"`+filename3+`%`).Find(&extrefs) + db.Preload("XbvrLinks").Where("external_source like 'alternate scene %' and external_data LIKE ? OR external_data LIKE ? OR external_data LIKE ? OR external_data LIKE ? OR external_data LIKE ?", `%"`+filename+`%`, `%"`+filename2+`%`, `%"`+filename3+`%`, `%"`+filename4+`%`, `%"`+filename5+`%`).Find(&extrefs) if len(extrefs) == 1 { if len(extrefs[0].XbvrLinks) == 1 { // the scene id will be the Internal DB Id from the associated link @@ -226,7 +227,7 @@ func scanLocalVolume(vol models.Volume, db *gorm.DB, tlog *logrus.Entry) { } } - if !strings.HasPrefix(filepath.Base(path), ".") && filepath.Ext(path) == ".funscript" { + if !strings.HasPrefix(filepath.Base(path), ".") && (filepath.Ext(path) == ".funscript" || strings.ToLower(filepath.Ext(path)) == ".cmscript") { scriptProcList = append(scriptProcList, path) } if !strings.HasPrefix(filepath.Base(path), ".") && filepath.Ext(path) == ".hsp" { diff --git a/ui/src/components/RescrapeButton.vue b/ui/src/components/RescrapeButton.vue new file mode 100644 index 000000000..dadc3e8e4 --- /dev/null +++ b/ui/src/components/RescrapeButton.vue @@ -0,0 +1,55 @@ + + + \ No newline at end of file diff --git a/ui/src/store/optionsDeoVR.js b/ui/src/store/optionsDeoVR.js index dfa3f8c92..1a15ca38f 100644 --- a/ui/src/store/optionsDeoVR.js +++ b/ui/src/store/optionsDeoVR.js @@ -26,7 +26,8 @@ const state = { }, players: { video_sort_seq: '', - script_sort_seq: '' + script_sort_seq: '', + subtitle_sort_seq: '' } } @@ -56,6 +57,7 @@ const actions = { state.heresphere.multitrack_cuepoints = data.config.interfaces.heresphere.multitrack_cuepoints state.players.video_sort_seq = data.config.interfaces.players.video_sort_seq state.players.script_sort_seq = data.config.interfaces.players.script_sort_seq + state.players.subtitle_sort_seq = data.config.interfaces.players.subtitle_sort_seq state.heresphere.multitrack_cast_cuepoints = data.config.interfaces.heresphere.multitrack_cast_cuepoints state.heresphere.retain_non_hsp_cuepoints = data.config.interfaces.heresphere.retain_non_hsp_cuepoints state.loading = false diff --git a/ui/src/views/files/SceneMatch.vue b/ui/src/views/files/SceneMatch.vue index 5a09755c8..26139118e 100644 --- a/ui/src/views/files/SceneMatch.vue +++ b/ui/src/views/files/SceneMatch.vue @@ -142,7 +142,7 @@ export default { const commonWords = [ '180', '180x180', '2880x1440', '3d', '3dh', '3dv', '30fps', '30m', '360', '3840x1920', '4k', '5k', '5400x2700', '60fps', '6k', '7k', '7680x3840', - '8k', 'fb360', 'fisheye190', 'funscript', 'h264', 'h265', 'hevc', 'hq', 'hsp', 'lq', 'lr', + '8k', 'fb360', 'fisheye190', 'funscript', 'cmscript', 'h264', 'h265', 'hevc', 'hq', 'hsp', 'lq', 'lr', 'mkv', 'mkx200', 'mkx220', 'mono', 'mp4', 'oculus', 'oculus5k', 'oculusrift', 'original', 'rf52', 'smartphone', 'srt', 'ssa', 'tb', 'uhq', 'vrca220', 'vp9' ] diff --git a/ui/src/views/options/sections/InterfaceDeoVR.vue b/ui/src/views/options/sections/InterfaceDeoVR.vue index a9615fcf7..908f23ea3 100644 --- a/ui/src/views/options/sections/InterfaceDeoVR.vue +++ b/ui/src/views/options/sections/InterfaceDeoVR.vue @@ -55,7 +55,7 @@
- + @@ -85,7 +85,7 @@ - + @@ -110,6 +110,31 @@ + + + + + + + + + + Filename + Added + Updated + Selected + + + + Ascending + Descending + + +
@@ -152,7 +177,7 @@

Heresphere interface


@@ -248,7 +273,9 @@ export default { selectedVideoField: 'Filename', selectedVideoSequence: 'Ascending', selectedScriptField: 'Filename', - selectedScriptSequence: 'Ascending' + selectedScriptSequence: 'Ascending', + selectedSubtitleField: 'Filename', + selectedSubtitleSequence: 'Ascending' } }, methods: { @@ -269,8 +296,10 @@ export default { addVideoField(type) { let dbfield='' let field=this.selectedVideoField - if (type!='video'){ + if (type=='script') { field=this.selectedScriptField + } else if (type=='subtitle') { + field=this.selectedSubtitleField } switch (field) { @@ -301,21 +330,26 @@ export default { default: dbfield = field.toLowerCase() } - - if (type=='video'){ + + if (type=='video') { if (this.selectedVideoSequence=='Ascending') { this.videoSequence=[this.videoSequence, dbfield ].filter(Boolean).join(',') - }else{ + } else { this.videoSequence=[this.videoSequence, dbfield+' desc' ].filter(Boolean).join(',') } - }else{ + } else if (type=='script') { if (this.selectedScriptSequence=='Ascending') { this.scriptSequence=[this.scriptSequence, dbfield ].filter(Boolean).join(',') - }else{ + } else { this.scriptSequence=[this.scriptSequence, dbfield+' desc' ].filter(Boolean).join(',') } + } else { + if (this.selectedSubtitleSequence=='Ascending') { + this.subtitleSequence=[this.subtitleSequence, dbfield ].filter(Boolean).join(',') + } else { + this.subtitleSequence=[this.subtitleSequence, dbfield+' desc' ].filter(Boolean).join(',') + } } - } }, computed: { @@ -460,6 +494,14 @@ export default { this.$store.state.optionsDeoVR.players.script_sort_seq = value }, }, + subtitleSequence: { + get () { + return this.$store.state.optionsDeoVR.players.subtitle_sort_seq + }, + set (value) { + this.$store.state.optionsDeoVR.players.subtitle_sort_seq = value + }, + }, multiTrackCastCuepoints: { get () { return this.$store.state.optionsDeoVR.heresphere.multitrack_cast_cuepoints diff --git a/ui/src/views/scenes/Details.vue b/ui/src/views/scenes/Details.vue index 6208a3bac..df5fd1ced 100644 --- a/ui/src/views/scenes/Details.vue +++ b/ui/src/views/scenes/Details.vue @@ -29,7 +29,7 @@
+ v-bind:style='{backgroundImage: `url("${getImageURL(carousel.url, "700,fit")}")`, backgroundSize: "contain", backgroundPosition: "center", backgroundRepeat: "no-repeat"}'>