diff --git a/.gitpod.dockerfile b/.gitpod.dockerfile index 1c3f74c3e..292dddf90 100644 --- a/.gitpod.dockerfile +++ b/.gitpod.dockerfile @@ -11,7 +11,7 @@ RUN export PATH=$(echo "$PATH" | sed -e 's|:/workspace/go/bin||' -e 's|:/home/gi ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH RUN go install -v \ - github.com/cosmtrek/air@latest && \ + github.com/air-verse/air@latest && \ sudo rm -rf $GOPATH/src && \ sudo rm -rf $GOPATH/pkg # user Go packages diff --git a/.gitpod.yml b/.gitpod.yml index 9a99bf403..762737219 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -2,7 +2,7 @@ image: file: .gitpod.dockerfile tasks: - name: Continuous Build - command: yarn config set ignore-engines true && yarn global add concurrently && go install github.com/cosmtrek/air@latest && cd /workspace/xbvr && go generate && go get && yarn && yarn dev + command: yarn config set ignore-engines true && yarn global add concurrently && go install github.com/air-verse/air@latest && cd /workspace/xbvr && go generate && go get && yarn && yarn dev ports: - port: 9999 onOpen: open-preview diff --git a/README.md b/README.md index bd4c2f7c7..2e7be8c5d 100644 --- a/README.md +++ b/README.md @@ -151,4 +151,4 @@ esc - closes details pane | `--web_port` | XBVR_WEB_PORT | Int| override default Web Page port 9999| | `--ws_addr` | XBVR_WS_ADDR | String| override default Websocket address from the default 0.0.0.0:9998| | `--db_connection_pool_size` | DB_CONNECTION_POOL_SIZE | Int| sets the connection pool size for mariadb databases| -| `--concurrent_scrapers` | CONCURRENT_SCRAPERS | String| set the number of scrapers that run concurrently default 9999| +| `--concurrent_scrapers` | CONCURRENT_SCRAPERS | Int| set the number of scrapers that run concurrently default 9999| diff --git a/go.mod b/go.mod index 3bc515ef5..1987dc434 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/anacrolix/ffprobe v1.1.0 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de github.com/avast/retry-go/v4 v4.6.0 - github.com/blevesearch/bleve/v2 v2.4.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,12 +17,12 @@ 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.21.0 github.com/go-resty/resty/v2 v2.13.1 - github.com/go-test/deep v1.1.0 + 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.14.0 @@ -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.23.0 - golang.org/x/net v0.25.0 - golang.org/x/oauth2 v0.20.0 - golang.org/x/sys v0.20.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.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/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 @@ -148,7 +148,7 @@ require ( github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/image v0.18.0 // indirect - golang.org/x/term v0.20.0 // indirect + golang.org/x/term v0.22.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.34.1 // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect diff --git a/go.sum b/go.sum index 2eb937d26..bec0f80f0 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,8 @@ github.com/ProtonMail/go-appdir v1.1.0/go.mod h1:3d8Y9F5mbEUjrYbcJ3rcDxcWbqbttF+ github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= 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.2.3 h1:yqreLINqIrX22ErkKI0vY47/ivtJr6n+kMhVOVmhWBY= -github.com/RoaringBitmap/roaring v1.2.3/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE= +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= @@ -36,24 +36,24 @@ github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinR 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,8 +72,8 @@ 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= @@ -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= @@ -151,8 +151,8 @@ github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gG 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= @@ -322,14 +322,14 @@ github.com/prometheus/procfs v0.14.0/go.mod h1:XL+Iwz8k8ZabyZfMFHPiilCniixqQarAy 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= @@ -385,8 +385,9 @@ golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPh 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.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= 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.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= @@ -417,12 +418,13 @@ golang.org/x/net v0.6.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.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= 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.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -447,8 +449,9 @@ 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.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= 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= @@ -456,8 +459,9 @@ 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.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= 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= diff --git a/package.json b/package.json index 5e7d39fd7..6b3cf781f 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "wampy": "6.4.2" }, "devDependencies": { - "@babel/core": "7.24.7", - "@babel/eslint-parser": "7.24.7", + "@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/actors.go b/pkg/api/actors.go index 2a28b4d3c..39ae8b39c 100644 --- a/pkg/api/actors.go +++ b/pkg/api/actors.go @@ -11,6 +11,7 @@ import ( restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" "github.com/xbapps/xbvr/pkg/models" + "github.com/xbapps/xbvr/pkg/scrape" ) type ResponseGetActors struct { @@ -194,6 +195,15 @@ func (i ActorResource) getFilters(req *restful.Request, resp *restful.Response) outAttributes = append(outAttributes, "Breast Type "+r.Result) } + db.Table("actors"). + Where("IFNULL(gender,'') <> ''"). + Select("distinct gender as result"). + Order("gender"). + Find(&results) + for _, r := range results { + outAttributes = append(outAttributes, "Gender "+r.Result) + } + resp.WriteHeaderAndEntity(http.StatusOK, ResponseGetActorFilters{ Attributes: outAttributes, Cast: outCast, @@ -731,7 +741,7 @@ func (i ActorResource) editActorExtRefs(req *restful.Request, resp *restful.Resp // add new links for _, url := range urls { var extref models.ExternalReference - extref.FindExternalUrl(extref.DetermineActorScraperByUrl(url), url) + commonDb.Preload("XbvrLinks").Where(&models.ExternalReference{ExternalURL: url}).First(&extref) if extref.ID == 0 { // create new extref + link extref.ExternalSource = extref.DetermineActorScraperByUrl(url) @@ -746,6 +756,9 @@ func (i ActorResource) editActorExtRefs(req *restful.Request, resp *restful.Resp ExternalReferenceID: extref.ID, ExternalSource: extref.ExternalSource, ExternalId: extref.ExternalId, MatchType: 0}) extref.Save() models.AddActionActor(actor.ID, "edit_actor", "add", "external_reference_link", url) + if extref.ExternalSource == "stashdb performer" { + scrape.RefreshPerformer(extref.ExternalId) + } } else { // external reference exists, but check it is linked to this actor found := false @@ -761,6 +774,9 @@ func (i ActorResource) editActorExtRefs(req *restful.Request, resp *restful.Resp ExternalReferenceID: extref.ID, ExternalSource: extref.ExternalSource, ExternalId: extref.ExternalId, MatchType: 0} newLink.Save() models.AddActionActor(actor.ID, "edit_actor", "add", "external_reference_link", url) + if extref.ExternalSource == "stashdb performer" { + scrape.RefreshPerformer(extref.ExternalId) + } } } } 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/heresphere.go b/pkg/api/heresphere.go index d072255dc..4037393b5 100644 --- a/pkg/api/heresphere.go +++ b/pkg/api/heresphere.go @@ -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/externalreference/stashdb.go b/pkg/externalreference/stashdb.go index 8918f3cdd..ac1e7bc23 100644 --- a/pkg/externalreference/stashdb.go +++ b/pkg/externalreference/stashdb.go @@ -249,7 +249,8 @@ func checkMatchedScenes() { // if len(ref.XbvrLinks) == 0 { for _, xbvrActor := range xbvrScene.Cast { - if strings.EqualFold(strings.TrimSpace(simplifyName(xbvrActor.Name)), strings.TrimSpace(simplifyName(performer.Performer.Name))) { + if strings.EqualFold(strings.TrimSpace(simplifyName(xbvrActor.Name)), strings.TrimSpace(simplifyName(performer.Performer.Name))) || + strings.EqualFold(strings.TrimSpace(simplifyName(xbvrActor.Name)), strings.TrimSpace(simplifyName(performer.As))) { // check if actor already matched exists := false for _, link := range ref.XbvrLinks { diff --git a/pkg/migrations/migrations.go b/pkg/migrations/migrations.go index 66f48ba2a..8b8419b11 100644 --- a/pkg/migrations/migrations.go +++ b/pkg/migrations/migrations.go @@ -53,6 +53,7 @@ func (i *RequestSceneList) ToJSON() string { } func Migrate() { + var retryMigration []string db, _ := models.GetDB() m := gormigrate.New(db, gormigrate.DefaultOptions, []*gormigrate.Migration{ @@ -1945,11 +1946,60 @@ 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 + }, + }, + { + // remove unreferenced tags created due to an error + ID: "0079-remove-unreferenced-tags", + Migrate: func(tx *gorm.DB) error { + // update tag counts + tasks.CountTags() + + // check there are no Tags with a count of 0 that are in use, should not happen if CountTags is working properly, + // but don't want to risk a referential integrity issue + type tagsInUse struct { + Cnt int + } + var result tagsInUse + db.Raw("select count(*) as cnt from scene_tags st join scenes s on s.id=st.scene_id join tags t on t.id=st.tag_id where t.`count` = 0 and s.deleted_at is NULL").Scan(&result) + if result.Cnt > 0 { + // this should never happen, but not deleting unreferenced tags will not break the system, so don't fail the migration, flag it to retry + retryMigration = append(retryMigration, "0079-remove-unreferenced-tags") + return nil + } + return tx.Model(&models.Tag{}).Exec("delete from tags where `count` = 0").Error + }, + }, }) if err := m.Migrate(); err != nil { common.Log.Fatalf("Could not migrate: %v", err) } + if len(retryMigration) > 0 { + for _, migration := range retryMigration { + common.Log.Warnf("*** MIGRATION WARNING ***: Could not migrate: '%v', this migration will retry the next time XBVR is started", migration) + err := db.Exec("DELETE FROM migrations WHERE id = ?", migration).Error + if err != nil { + common.Log.Fatalf("Failed to remove %v from the miigration table - will not be retried", err) + } + } + } common.Log.Printf("Migration did run successfully") db.Close() diff --git a/pkg/models/model_actor.go b/pkg/models/model_actor.go index 03ab9965f..eb978df26 100644 --- a/pkg/models/model_actor.go +++ b/pkg/models/model_actor.go @@ -204,7 +204,7 @@ func QueryActors(r RequestActorList, enablePreload bool) ResponseActorList { where := "" countries := GetCountryList() - attributes := [][2]string{{"Cup Size ", "cup_size"}, {"Hair Color ", "hair_color"}, {"Eye Color ", "eye_color"}, {"Nationality ", "nationality"}, {"Ethnicity ", "ethnicity"}, {"Breast Type ", "breast_type"}} + attributes := [][2]string{{"Cup Size ", "cup_size"}, {"Hair Color ", "hair_color"}, {"Eye Color ", "eye_color"}, {"Nationality ", "nationality"}, {"Gender ", "gender"}, {"Ethnicity ", "ethnicity"}, {"Breast Type ", "breast_type"}} for _, attribute := range attributes { if strings.HasPrefix(fieldName, attribute[0]) { value = fieldName[len(attribute[0]):] diff --git a/pkg/models/model_external_reference.go b/pkg/models/model_external_reference.go index 340c2f9e3..314ef6651 100644 --- a/pkg/models/model_external_reference.go +++ b/pkg/models/model_external_reference.go @@ -10,7 +10,6 @@ import ( "time" "github.com/avast/retry-go/v4" - "github.com/gocolly/colly/v2" "github.com/markphelps/optional" "github.com/xbapps/xbvr/pkg/common" @@ -962,31 +961,17 @@ func (scrapeRules ActorScraperConfig) buildGenericActorScraperRules() { siteDetails = GenericScraperRuleSet{} siteDetails.Domain = "vrspy.com" - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "biography", Selector: `.star-biography-description`}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "image_url", Selector: `.star-photo img`, ResultType: "attr", Attribute: "src", PostProcessing: []PostProcessing{{Function: "RemoveQueryParams"}}}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "images", Native: func(e interface{}) []string { - html := e.(*colly.HTMLElement) - var values []string - if mainPhotoURL := html.ChildAttr(`.star-photo img`, `src`); mainPhotoURL != "" { - partialURLRegex := regexp.MustCompile(`^(.*)/[^/]+.jpg`) - if partialURLMatch := partialURLRegex.FindStringSubmatch(mainPhotoURL); len(partialURLMatch) == 2 { - fullURLRegex := regexp.MustCompile(regexp.QuoteMeta(partialURLMatch[1]) + `/[^"]+.jpg`) - nuxtData := html.ChildText(`#__NUXT_DATA__`) - if imageURLs := fullURLRegex.FindAllString(nuxtData, -1); imageURLs != nil { - values = imageURLs - } - } - } - return values - }}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "height", Selector: `.about-me-mobile .stars-params-title:contains("Height:") + .stars-params-value`}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "weight", Selector: `.about-me-mobile .stars-params-title:contains("Weight:") + .stars-params-value`}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "band_size", Selector: `.about-me-mobile .stars-params-title:contains("Measurements:") + .stars-params-value`, PostProcessing: []PostProcessing{{Function: "RegexString", Params: []string{`(\d+)([A-Za-z]*)-(\d+)-(\d+)`, "1"}}}}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "cup_size", Selector: `.about-me-mobile .stars-params-title:contains("Measurements:") + .stars-params-value`, PostProcessing: []PostProcessing{{Function: "RegexString", Params: []string{`(\d+)([A-Za-z]*)-(\d+)-(\d+)`, "2"}}}}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "waist_size", Selector: `.about-me-mobile .stars-params-title:contains("Measurements:") + .stars-params-value`, PostProcessing: []PostProcessing{{Function: "RegexString", Params: []string{`(\d+)([A-Za-z]*)-(\d+)-(\d+)`, "3"}}}}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "hip_size", Selector: `.about-me-mobile .stars-params-title:contains("Measurements:") + .stars-params-value`, PostProcessing: []PostProcessing{{Function: "RegexString", Params: []string{`(\d+)([A-Za-z]*)-(\d+)-(\d+)`, "4"}}}}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "nationality", Selector: `.about-me-mobile .stars-params-title:contains("Nationality:") + .stars-params-value`, PostProcessing: []PostProcessing{{Function: "Lookup Country"}}}) - siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "hair_color", Selector: `.about-me-mobile .stars-params-title:contains("Hair Color:") + .stars-params-value`}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "biography", Selector: `.star-bio .show-more-text-container`}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "image_url", Selector: `.avatar img`, ResultType: "attr", Attribute: "src", PostProcessing: []PostProcessing{{Function: "RemoveQueryParams"}}}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "images", Selector: `.avatar img`, ResultType: "attr", Attribute: "src", PostProcessing: []PostProcessing{{Function: "RemoveQueryParams"}}}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "height", Selector: `.star-info-row-title:contains("Height:") + span`}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "weight", Selector: `.star-info-row-title:contains("Weight:") + span`}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "band_size", Selector: `.star-info-row-title:contains("Measurements:") + span`, PostProcessing: []PostProcessing{{Function: "RegexString", Params: []string{`(\d+)([A-Za-z]*)-(\d+)-(\d+)`, "1"}}}}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "cup_size", Selector: `.star-info-row-title:contains("Measurements:") + span`, PostProcessing: []PostProcessing{{Function: "RegexString", Params: []string{`(\d+)([A-Za-z]*)-(\d+)-(\d+)`, "2"}}}}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "waist_size", Selector: `.star-info-row-title:contains("Measurements:") + span`, PostProcessing: []PostProcessing{{Function: "RegexString", Params: []string{`(\d+)([A-Za-z]*)-(\d+)-(\d+)`, "3"}}}}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "hip_size", Selector: `.star-info-row-title:contains("Measurements:") + span`, PostProcessing: []PostProcessing{{Function: "RegexString", Params: []string{`(\d+)([A-Za-z]*)-(\d+)-(\d+)`, "4"}}}}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "nationality", Selector: `.star-info-row-title:contains("Nationality:") + span`, PostProcessing: []PostProcessing{{Function: "Lookup Country"}}}) + siteDetails.SiteRules = append(siteDetails.SiteRules, GenericActorScraperRule{XbvrField: "hair_color", Selector: `.star-info-row-title:contains("Hair Color:") + span`}) scrapeRules.GenericActorScrapingConfig["vrspy scrape"] = siteDetails siteDetails = GenericScraperRuleSet{} diff --git a/pkg/models/model_scene.go b/pkg/models/model_scene.go index 07417bb99..d1fd5bac5 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 } @@ -429,16 +433,17 @@ func SceneCreateUpdateFromExternal(db *gorm.DB, ext ScrapedScene) error { var site Site db.Where("id = ?", o.ScraperId).FirstOrInit(&site) o.IsSubscribed = site.Subscribed - SaveWithRetry(db, &o) // Clean & Associate Tags var tags = o.Tags db.Model(&o).Association("Tags").Clear() - for _, tag := range tags { + for idx, tag := range tags { tmpTag := Tag{} db.Where(&Tag{Name: tag.Name}).FirstOrCreate(&tmpTag) - db.Model(&o).Association("Tags").Append(tmpTag) + tags[idx] = tmpTag } + o.Tags = tags + SaveWithRetry(db, &o) // Clean & Associate Actors db.Model(&o).Association("Cast").Clear() @@ -880,6 +885,8 @@ func queryScenes(db *gorm.DB, r RequestSceneList) (*gorm.DB, *gorm.DB) { where = `scenes.scene_id like "povr-%"` case "SLR Scraper": where = `scenes.scene_id like "slr-%"` + case "Has Image": + where = "cover_url not in ('','http://localhost/dont_cause_errors')" case "VRPHub Scraper": where = `scenes.scene_id like "vrphub-%"` case "VRPorn Scraper": @@ -1143,6 +1150,8 @@ func queryScenes(db *gorm.DB, r RequestSceneList) (*gorm.DB, *gorm.DB) { } case "scene_id_desc": tx = tx.Order("scene_id desc") + case "site_asc": + tx = tx.Order("scenes.site") case "random": if dbConn.Driver == "mysql" { tx = tx.Order("rand()") diff --git a/pkg/scrape/badoink.go b/pkg/scrape/badoink.go index 2de3a5085..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 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]) } diff --git a/pkg/scrape/navr.go b/pkg/scrape/navr.go index 8582c437b..532dbb4ec 100644 --- a/pkg/scrape/navr.go +++ b/pkg/scrape/navr.go @@ -139,6 +139,7 @@ func NaughtyAmericaVR(wg *sync.WaitGroup, updateSite bool, knownScenes []string, vm := otto.New() script := e.Text + script = strings.ReplaceAll(script, "nanalytics.trackExperiment('scene_page_viewed', 'streaming_option_join_button');", "") script = strings.Replace(script, "window.dataLayer", "dataLayer", -1) script = strings.Replace(script, "dataLayer = dataLayer || []", "dataLayer = []", -1) script = script + "\nout = []; dataLayer.forEach(function(v) { if (v.femaleStar) { out.push(v.femaleStar); } });" 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/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/scrape/vrspy.go b/pkg/scrape/vrspy.go index 6cccd4559..598a5b2d6 100755 --- a/pkg/scrape/vrspy.go +++ b/pkg/scrape/vrspy.go @@ -55,50 +55,39 @@ func VRSpy(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out chan<- sc.SceneID = scraperID + "-" + sc.SiteID - sc.Title = e.ChildText(`.video-content .header-container .section-header-container`) - sc.Synopsis = e.ChildText(`.video-description`) - sc.Tags = e.ChildTexts(`.video-categories .v-chip__content`) - - e.ForEach(`.video-details-row`, func(id int, e *colly.HTMLElement) { - parts := strings.SplitN(e.Text, ":", 2) - key, value := parts[0], parts[1] - switch strings.TrimSpace(key) { - case "Stars": - sc.ActorDetails = make(map[string]models.ActorDetails) - e.ForEach(`.stars-list a`, func(id int, e *colly.HTMLElement) { - sc.Cast = append(sc.Cast, e.Text) - sc.ActorDetails[e.Text] = models.ActorDetails{ - Source: scraperID + " scrape", - ProfileUrl: e.Request.AbsoluteURL(e.Attr(`href`)), - } - }) - case "Duration": - durationParts := strings.Split(strings.SplitN(strings.TrimSpace(value), " ", 2)[0], ":") - if len(durationParts) == 3 { - hours, _ := strconv.Atoi(durationParts[0]) - minutes, _ := strconv.Atoi(durationParts[1]) - sc.Duration = hours*60 + minutes + sc.Title = e.ChildText(`.video-content .header-container .video-title .section-header-container`) + sc.Synopsis = e.ChildText(`.video-description-container`) + sc.Tags = e.ChildTexts(`.video-categories .chip`) + + sc.ActorDetails = make(map[string]models.ActorDetails) + e.ForEach(`.video-actor-item`, func(id int, e *colly.HTMLElement) { + sc.Cast = append(sc.Cast, e.Text) + e.ForEach(`a`, func(id int, a *colly.HTMLElement) { + sc.ActorDetails[e.Text] = models.ActorDetails{ + Source: scraperID + " scrape", + ProfileUrl: e.Request.AbsoluteURL(a.Attr(`href`)), } - case "Release date": - tmpDate, _ := goment.New(strings.TrimSpace(value), "DD MMM YYYY") - sc.Released = tmpDate.Format("YYYY-MM-DD") - } + + }) }) var durationParts []string // Date & Duration - e.ForEach(`div.single-video-info__list-item`, func(id int, e *colly.HTMLElement) { + e.ForEach(`.video-details-info-item`, func(id int, e *colly.HTMLElement) { parts := strings.Split(e.Text, ":") if len(parts) > 1 { switch strings.TrimSpace(parts[0]) { case "Release date": - tmpDate, _ := goment.New(strings.TrimSpace(parts[1]), "MMM D, YYYY") + tmpDate, _ := goment.New(strings.TrimSpace(parts[1]), "DD MMMM YYYY") sc.Released = tmpDate.Format("YYYY-MM-DD") case "Duration": durationParts = strings.Split(strings.TrimSpace(parts[1]), " ") tmpDuration, err := strconv.Atoi(durationParts[0]) + mins := tmpDuration * 60 + tmpDuration, err = strconv.Atoi(parts[2]) + mins = mins + tmpDuration if err == nil { - sc.Duration = tmpDuration + sc.Duration = mins } } } @@ -114,7 +103,7 @@ func VRSpy(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out chan<- } nuxtData := e.ChildText(`#__NUXT_DATA__`) - imageRegex := regexp.MustCompile(regexp.QuoteMeta(cdnSceneURL.String()) + `(/photos/[^?"]*\.jpg)\?width`) + imageRegex := regexp.MustCompile(regexp.QuoteMeta(cdnSceneURL.String()) + `(/photos/[^?"]*\.jpg)`) sc.Gallery = imageRegex.FindAllString(nuxtData, -1) // trailer details diff --git a/pkg/tasks/heatmap.go b/pkg/tasks/heatmap.go index 50409d4d0..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" @@ -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,6 +263,29 @@ 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 @@ -275,10 +305,17 @@ func (funscript Script) getDuration() float64 { } 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 index dadc3e8e4..0bf3e7b7a 100644 --- a/ui/src/components/RescrapeButton.vue +++ b/ui/src/components/RescrapeButton.vue @@ -1,7 +1,7 @@ @@ -12,44 +12,53 @@ export default { name: 'RescrapeButton', props: { item: Object }, methods: { - async rescrapeSingleScene () { + delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + }, + async rescrapeScene () { let site = "" - if (this.item.scene_url.toLowerCase().includes("dmm.co.jp")) { - ky.post('/api/task/scrape-javr', { json: { s: "r18d", q: this.item.scene_id } }) + this.$store.commit('sceneList/toggleSceneList', {scene_id: this.item.scene_id, list: 'needs_update'}) + if (this.item.scraper_id && this.item.needs_update) { + await this.delay(200); + ky.get(`/api/task/scrape?site=${this.item.scraper_id}`) } else { + if (this.item.scene_url.toLowerCase().includes("dmm.co.jp")) { + ky.post('/api/task/scrape-javr', { json: { s: "r18d", q: this.item.scene_id } }) + } else { - const sites = await ky.get('/api/options/sites').json() - console.info(sites) + const sites = await ky.get('/api/options/sites').json() + console.info(sites) - for (const element of sites) { - if (this.item.scene_url.toLowerCase().includes(element.id)) { - site = element.id + for (const element of sites) { + if (this.item.scene_url.toLowerCase().includes(element.id)) { + site = element.id + } } - } - if (this.item.scene_url.toLowerCase().includes("sexlikereal.com")) { - site = "slr-single_scene" - } - if (this.item.scene_url.toLowerCase().includes("czechvrnetwork.com")) { - site = "czechvr-single_scene" - } - if (this.item.scene_url.toLowerCase().includes("povr.com")) { - site = "povr-single_scene" - } - if (this.item.scene_url.toLowerCase().includes("vrporn.com")) { - site = "vrporn-single_scene" - } - if (this.item.scene_url.toLowerCase().includes("vrphub.com")) { - site = "vrphub-single_scene" + if (this.item.scene_url.toLowerCase().includes("sexlikereal.com")) { + site = "slr-single_scene" + } + if (this.item.scene_url.toLowerCase().includes("czechvrnetwork.com")) { + site = "czechvr-single_scene" + } + if (this.item.scene_url.toLowerCase().includes("povr.com")) { + site = "povr-single_scene" + } + if (this.item.scene_url.toLowerCase().includes("vrporn.com")) { + site = "vrporn-single_scene" + } + if (this.item.scene_url.toLowerCase().includes("vrphub.com")) { + site = "vrphub-single_scene" + } + if (site == "") { + this.$buefy.toast.open({message: `No scrapers exist for this domain`, type: 'is-danger', duration: 5000}) + return + } + ky.post(`/api/task/singlescrape`, {timeout: false, json: { site: site, sceneurl: this.item.scene_url, additionalinfo:[] }}) } - if (site == "") { - this.$buefy.toast.open({message: `No scrapers exist for this domain`, type: 'is-danger', duration: 5000}) - return - } - ky.post(`/api/task/singlescrape`, {timeout: false, json: { site: site, sceneurl: this.item.scene_url, additionalinfo:[] }}) } } } } - \ 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/store/sceneList.js b/ui/src/store/sceneList.js index 63a9148c9..3d610d1ef 100644 --- a/ui/src/store/sceneList.js +++ b/ui/src/store/sceneList.js @@ -150,8 +150,8 @@ const mutations = { const actions = { async filters ({ state }) { - state.playlists = await ky.get('/api/playlist').json() - state.filterOpts = await ky.get('/api/scene/filters').json() + state.playlists = await ky.get('/api/playlist', {timeout: 300000}).json() + state.filterOpts = await ky.get('/api/scene/filters', {timeout: 300000}).json() // Reverse list of release months for display purposes state.filterOpts.release_month = state.filterOpts.release_month.reverse() 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 ef3308d62..908f23ea3 100644 --- a/ui/src/views/options/sections/InterfaceDeoVR.vue +++ b/ui/src/views/options/sections/InterfaceDeoVR.vue @@ -110,6 +110,31 @@ + + + + + + + + + + Filename + Added + Updated + Selected + + + + Ascending + Descending + + + @@ -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/Filters.vue b/ui/src/views/scenes/Filters.vue index 3fcd268bd..35c5d6dad 100644 --- a/ui/src/views/scenes/Filters.vue +++ b/ui/src/views/scenes/Filters.vue @@ -57,6 +57,7 @@ + @@ -577,7 +578,7 @@ export default { }, async fetchFilters() { this.filteredAttributes=['Loading attributes'] - ky.get('/api/scene/filters').json().then(data => { + ky.get('/api/scene/filters', {timeout: 300000}).json().then(data => { this.filteredAttributes=data.attributes }) } diff --git a/ui/src/views/scenes/SceneCard.vue b/ui/src/views/scenes/SceneCard.vue index 4ea4c1feb..df6a0fc79 100644 --- a/ui/src/views/scenes/SceneCard.vue +++ b/ui/src/views/scenes/SceneCard.vue @@ -68,8 +68,8 @@ {{format(parseISO(item.release_date), "yyyy-MM-dd")}} -
-
+
+
@@ -155,31 +155,34 @@ export default { } return this.$store.state.optionsWeb.web.isAvailOpacity / 100 }, - async getAlternateSceneSources() { - try { + async getAlternateSceneSourcesWithTitles() { + try { const response = await ky.get('/api/scene/alternate_source/' + this.item.id).json(); this.alternateSources = []; - if (response==null){ - return 0 + if (response == null) { + return 0; } - response.forEach(altsrc => { - if (altsrc.external_source.startsWith("alternate scene ") || altsrc.external_source == "stashdb scene") { - this.alternateSources.push(altsrc) - } - }); + + this.alternateSources = response + .filter(altsrc => altsrc.external_source.startsWith("alternate scene ") || altsrc.external_source == "stashdb scene") + .map(altsrc => { + const extdata = JSON.parse(altsrc.external_data); + let title; + if (altsrc.external_source.startsWith("alternate scene ")) { + title = extdata.scene?.title || 'No Title'; + } else if (altsrc.external_source == "stashdb scene") { + title = extdata.title || 'No Title'; + } + return { + ...altsrc, + title: title + }; + }); + return this.alternateSources.length; - } catch (error) { + } catch (error) { return 0; // Return 0 or handle error as needed } - }, - alternateSourcesWithTitles() { - return this.alternateSources.map(altsrc => { - const extdata = JSON.parse(altsrc.external_data); - return { - ...altsrc, - title: extdata.scene?.title || 'No Title' - }; - }); } }, methods: { diff --git a/yarn.lock b/yarn.lock index a9c5e13b4..ede1e07e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -72,26 +72,26 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.6.tgz#8b37d24e88e8e21c499d4328db80577d8882fa53" integrity sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ== -"@babel/compat-data@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" - integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== +"@babel/compat-data@^7.24.8": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.9.tgz#53eee4e68f1c1d0282aa0eb05ddb02d033fc43a0" + integrity sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng== -"@babel/core@7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" - integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== +"@babel/core@7.24.9": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.9.tgz#dc07c9d307162c97fa9484ea997ade65841c7c82" + integrity sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helpers" "^7.24.7" - "@babel/parser" "^7.24.7" + "@babel/generator" "^7.24.9" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-module-transforms" "^7.24.9" + "@babel/helpers" "^7.24.8" + "@babel/parser" "^7.24.8" "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -119,10 +119,10 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/eslint-parser@7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz#27ebab1a1ec21f48ae191a8aaac5b82baf80d9c7" - integrity sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA== +"@babel/eslint-parser@7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.8.tgz#bc655255fa4ded3694cc10ef3dbea6d69639c831" + integrity sha512-nYAikI4XTGokU2QX7Jx+v4rxZKhKivaQaREZjuW3mrJrbdWJ5yUfohnoUULge+zEEaKjPYNxhoRgUKktjXtbwA== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" @@ -157,6 +157,16 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.24.8", "@babel/generator@^7.24.9": + version "7.24.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.10.tgz#a4ab681ec2a78bbb9ba22a3941195e28a81d8e76" + integrity sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg== + dependencies: + "@babel/types" "^7.24.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -199,14 +209,14 @@ browserslist "^4.14.5" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" - integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== +"@babel/helper-compilation-targets@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz#b607c3161cd9d1744977d4f97139572fe778c271" + integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw== dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - browserslist "^4.22.2" + "@babel/compat-data" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" @@ -365,10 +375,10 @@ "@babel/traverse" "^7.18.6" "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" - integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== +"@babel/helper-module-transforms@^7.24.9": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz#e13d26306b89eea569180868e652e7f514de9d29" + integrity sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw== dependencies: "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-module-imports" "^7.24.7" @@ -467,6 +477,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" @@ -502,10 +517,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helper-validator-option@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" - integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== "@babel/helper-wrap-function@^7.18.6": version "7.18.6" @@ -526,13 +541,13 @@ "@babel/traverse" "^7.18.6" "@babel/types" "^7.18.6" -"@babel/helpers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" - integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== +"@babel/helpers@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.8.tgz#2820d64d5d6686cca8789dd15b074cd862795873" + integrity sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ== dependencies: "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/types" "^7.24.8" "@babel/highlight@^7.12.13": version "7.14.0" @@ -596,6 +611,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" + integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -1332,6 +1352,22 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.8.tgz#6c14ed5232b7549df3371d820fbd9abfcd7dfab7" + integrity sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.8" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.8" + "@babel/types" "^7.24.8" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.4.4": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.0.tgz#3fc3fc74e0cdad878182e5f66cc6bcab1915a802" @@ -1375,6 +1411,15 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@babel/types@^7.24.8", "@babel/types@^7.24.9": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73" + integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@eslint-community/eslint-utils@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz#a831e6e468b4b2b5ae42bf658bea015bf10bc518" @@ -2474,10 +2519,10 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn-jsx@^5.3.2: version "5.3.2" @@ -2912,7 +2957,7 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4 node-releases "^2.0.5" update-browserslist-db "^1.0.4" -browserslist@^4.21.10, browserslist@^4.22.2: +browserslist@^4.21.10: version "4.22.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== @@ -2922,6 +2967,16 @@ browserslist@^4.21.10, browserslist@^4.22.2: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +browserslist@^4.23.1: + version "4.23.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" + integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== + dependencies: + caniuse-lite "^1.0.30001640" + electron-to-chromium "^1.4.820" + node-releases "^2.0.14" + update-browserslist-db "^1.1.0" + buefy@0.9.29: version "0.9.29" resolved "https://registry.yarnpkg.com/buefy/-/buefy-0.9.29.tgz#1d1fe57a407ef7cd6e9295679371eee63d21bd0f" @@ -3044,6 +3099,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001335, caniuse-lite@^1.0.30001359, can resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz" integrity sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ== +caniuse-lite@^1.0.30001640: + version "1.0.30001642" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz#6aa6610eb24067c246d30c57f055a9d0a7f8d05f" + integrity sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA== + cardboard-vr-display@^1.0.19: version "1.0.19" resolved "https://registry.yarnpkg.com/cardboard-vr-display/-/cardboard-vr-display-1.0.19.tgz#81dcde1804b329b8228b757ac00e1fd2afa9d748" @@ -3837,6 +3897,11 @@ electron-to-chromium@^1.4.601: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz#4bddbc2c76e1e9dbf449ecd5da3d8119826ea4fb" integrity sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg== +electron-to-chromium@^1.4.820: + version "1.4.829" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz#3034a865b5eac9064c9db8b38ba99b60a446bb73" + integrity sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -3867,10 +3932,10 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.16.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== +enhanced-resolve@^5.17.0: + version "5.17.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" + integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4042,6 +4107,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -4179,10 +4249,10 @@ eslint-plugin-n@^15.2.4: resolve "^1.10.1" semver "^7.3.7" -eslint-plugin-promise@6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" - integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== +eslint-plugin-promise@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.4.0.tgz#54926d53c79541efe9cea6ac1d823a58bbed1106" + integrity sha512-/KWWRaD3fGkVCZsdR0RU53PSthFmoHVhZl+y9+6DqeDLSikLdlUVpVEAmI6iCRR5QyOjBYBqHZV/bdv4DJ4Gtw== eslint-plugin-promise@^6.0.0: version "6.0.0" @@ -4194,10 +4264,10 @@ eslint-plugin-standard@4.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== -eslint-plugin-vue@9.25.0: - version "9.25.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz#615cb7bb6d0e2140d21840b9aa51dce69e803e7a" - integrity sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA== +eslint-plugin-vue@9.27.0: + version "9.27.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz#c22dae704a03d9ecefa81364ff89f60ce0481f94" + integrity sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" globals "^13.24.0" @@ -4205,7 +4275,7 @@ eslint-plugin-vue@9.25.0: nth-check "^2.1.1" postcss-selector-parser "^6.0.15" semver "^7.6.0" - vue-eslint-parser "^9.4.2" + vue-eslint-parser "^9.4.3" xml-name-validator "^4.0.0" eslint-scope@5.1.1: @@ -6613,6 +6683,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" @@ -7369,10 +7444,10 @@ sass-loader@14.2.1: dependencies: neo-async "^2.6.2" -sass@1.76.0: - version "1.76.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.76.0.tgz#fe15909500735ac154f0dc7386d656b62b03987d" - integrity sha512-nc3LeqvF2FNW5xGF1zxZifdW3ffIz5aBb7I7tSvOoNu7z1RQ6pFt9MBuiPtjgaI62YWrM/txjWlOCFiGtf2xpw== +sass@1.77.8: + version "1.77.8" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.8.tgz#9f18b449ea401759ef7ec1752a16373e296b52bd" + integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -8251,6 +8326,14 @@ update-browserslist-db@^1.0.4: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -8374,10 +8457,10 @@ vue-debounce@4.0.1: resolved "https://registry.yarnpkg.com/vue-debounce/-/vue-debounce-4.0.1.tgz#4b482123911a9033d8f8cb0595e43efcf9ef7aa0" integrity sha512-f2HeuLA5b9WY+cKVAU+ydwi9UHxgCWZQt/6HP/5QogthFwm/e+WMP5jpUq2WhEvnHisPkPMomYDRXDxc2AiQDw== -vue-eslint-parser@^9.4.2: - version "9.4.2" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz#02ffcce82042b082292f2d1672514615f0d95b6d" - integrity sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ== +vue-eslint-parser@^9.4.3: + version "9.4.3" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz#9b04b22c71401f1e8bca9be7c3e3416a4bde76a8" + integrity sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg== dependencies: debug "^4.3.4" eslint-scope "^7.1.1" @@ -8655,10 +8738,10 @@ webpack-virtual-modules@^0.4.2: resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.4.tgz#a19fcf371923c59c4712d63d7d194b1e4d8262cc" integrity sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA== -webpack@5.91.0: - version "5.91.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" - integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== +webpack@5.93.0: + version "5.93.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.93.0.tgz#2e89ec7035579bdfba9760d26c63ac5c3462a5e5" + integrity sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" @@ -8666,10 +8749,10 @@ webpack@5.91.0: "@webassemblyjs/wasm-edit" "^1.12.1" "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.9.0" + acorn-import-attributes "^1.9.5" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.16.0" + enhanced-resolve "^5.17.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0"