diff --git a/go.mod b/go.mod index 73513ec77..b9420e1d0 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/ProtonMail/go-appdir v1.1.0 github.com/PuerkitoBio/goquery v1.8.1 github.com/abbot/go-http-auth v0.4.0 - github.com/anacrolix/ffprobe v1.0.1 + github.com/anacrolix/ffprobe v1.1.0 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de github.com/avast/retry-go/v4 v4.5.0 github.com/blevesearch/bleve/v2 v2.3.10 @@ -14,17 +14,17 @@ require ( github.com/creasty/defaults v1.7.0 github.com/darwayne/go-timecode v1.1.0 github.com/disintegration/imaging v1.6.2 - github.com/djherbis/times v1.5.0 + github.com/djherbis/times v1.6.0 github.com/dustin/go-humanize v1.0.1 github.com/emicklei/go-restful-openapi/v2 v2.9.1 github.com/emicklei/go-restful/v3 v3.11.0 - github.com/gammazero/nexus/v3 v3.2.0 + github.com/gammazero/nexus/v3 v3.2.1 github.com/getlantern/systray v1.2.2 github.com/go-openapi/spec v0.20.9 - github.com/go-resty/resty/v2 v2.7.0 + github.com/go-resty/resty/v2 v2.10.0 github.com/go-test/deep v1.1.0 github.com/gocolly/colly/v2 v2.1.0 - github.com/gorilla/mux v1.8.0 + github.com/gorilla/mux v1.8.1 github.com/gosimple/slug v1.13.1 github.com/gowww/log v1.0.0 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 @@ -37,7 +37,7 @@ require ( github.com/lucasb-eyer/go-colorful v1.2.0 github.com/marcsauter/single v0.0.0-20201009143647-9f8d81240be2 github.com/markphelps/optional v0.11.0 - github.com/mattn/go-sqlite3 v1.14.17 + github.com/mattn/go-sqlite3 v1.14.18 github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 github.com/mholt/archiver v3.1.1+incompatible github.com/mozillazg/go-slugify v0.2.0 @@ -45,7 +45,7 @@ require ( github.com/nleeper/goment v1.4.4 github.com/peterbourgon/diskv v2.0.1+incompatible github.com/pkg/errors v0.9.1 - github.com/putdotio/go-putio v1.7.0 + github.com/putdotio/go-putio v1.7.1 github.com/robertkrimen/otto v0.2.1 github.com/robfig/cron/v3 v3.0.1 github.com/rs/cors v1.9.0 @@ -138,7 +138,7 @@ require ( github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tkuchiki/go-timezone v0.2.0 // indirect - github.com/ugorji/go/codec v1.2.7 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect 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 diff --git a/go.sum b/go.sum index 1c3f0e0f9..a8feb52c1 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/RoaringBitmap/roaring v1.2.3/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/ 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= -github.com/anacrolix/ffprobe v1.0.1 h1:S/MfCrUNZvbkkykX/1mmLVRf8//M7mvlY3BcwHaK3bQ= -github.com/anacrolix/ffprobe v1.0.1/go.mod h1:MXe+zG/RRa5OdIf5+VYYfS/CfsSqOH7RrvGIqJBzqhI= +github.com/anacrolix/ffprobe v1.1.0 h1:eKBudnERW9zRJ0+ge6FzkQ0pWLyq142+FJrwRwSRMT4= +github.com/anacrolix/ffprobe v1.1.0/go.mod h1:MXe+zG/RRa5OdIf5+VYYfS/CfsSqOH7RrvGIqJBzqhI= github.com/anacrolix/missinggo v1.1.0 h1:0lZbaNa6zTR1bELAIzCNmRGAtkHuLDPJqTiTtXoAIx8= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= @@ -90,8 +90,8 @@ github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6RO github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= -github.com/djherbis/times v1.5.0 h1:79myA211VwPhFTqUk8xehWrsEO+zcIZj0zT8mXPVARU= -github.com/djherbis/times v1.5.0/go.mod h1:5q7FDLvbNg1L/KaBmPcWlVR9NmoKo3+ucqUA3ijQhA0= +github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= +github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= @@ -108,10 +108,9 @@ github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DP github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= 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/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gammazero/nexus/v3 v3.2.0 h1:dKdGk4vQ/56wX5CLKUt6U3XQymUhTY6xHowBO9Z7bVA= -github.com/gammazero/nexus/v3 v3.2.0/go.mod h1:h/5Osjg08QGAk+dVFpwdGdD8VsK+IGDm5E4PzVli264= +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/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4= github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY= github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 h1:6uJ+sZ/e03gkbqZ0kUG6mfKoqDb4XMAzMIwlajq19So= @@ -138,8 +137,8 @@ github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= +github.com/go-resty/resty/v2 v2.10.0 h1:Qla4W/+TMmv0fOeeRqzEpXPLfTUnR5HZ1+lGs+CkiCo= +github.com/go-resty/resty/v2 v2.10.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= 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= @@ -188,8 +187,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +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= @@ -260,6 +259,8 @@ 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.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= 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= @@ -312,8 +313,8 @@ github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdO 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/putdotio/go-putio v1.7.0 h1:iL7G9O30NCiOH4FULbul/tRNWDA9LuvlsfXjBIBmRY4= -github.com/putdotio/go-putio v1.7.0/go.mod h1:QhjpLhn3La/ea4FeJlp1qsiaFZDC0EIO8VUe8VEKMV0= +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.2.1 h1:FVP0PJ0AHIjC+N4pKCG9yCDz6LHNPCwi/GKID5pGGF0= github.com/robertkrimen/otto v0.2.1/go.mod h1:UPwtJ1Xu7JrLcZjNWN8orJaM5n5YEtqL//farB5FlRY= @@ -339,7 +340,7 @@ 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.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= 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= @@ -352,9 +353,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tkuchiki/go-timezone v0.2.0 h1:yyZVHtQRVZ+wvlte5HXvSpBkR0dPYnPEIgq9qqAqltk= github.com/tkuchiki/go-timezone v0.2.0/go.mod h1:b1Ean9v2UXtxSq4TZF0i/TU9NuoWa9hOzOKoGCV2zqY= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -367,6 +367,7 @@ github.com/xo/dburl v0.16.0/go.mod h1:B7/G9FGungw6ighV8xJNwWYQPMfn3gsi2sn5SE8Bzc github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -402,11 +403,11 @@ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/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.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -431,17 +432,20 @@ golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7w 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= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -451,9 +455,12 @@ 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 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/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= diff --git a/package.json b/package.json index 8058d3a82..b7300701d 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "@fortawesome/fontawesome-free": "5.15.4", "@fortawesome/fontawesome-svg-core": "1.2.36", - "@mdi/font": "7.2.96", + "@mdi/font": "7.3.67", "buefy": "0.9.25", "bulma-extensions": "6.2.7", "date-fns": "2.30.0", @@ -22,7 +22,7 @@ "pretty-bytes": "6.1.1", "videojs-hotkeys": "0.2.28", "videojs-vr": "1.8.0", - "vue": "2.7.14", + "vue": "2.7.15", "vue-debounce": "4.0.0", "vue-gallery": "2.0.5", "vue-global-events": "1.2.1", @@ -43,21 +43,21 @@ "@vue/eslint-config-standard": "8.0.1", "buffer": "6.0.3", "concurrently": "7.6.0", - "eslint": "8.48.0", - "eslint-plugin-import": "2.28.1", + "eslint": "8.53.0", + "eslint-plugin-import": "2.29.0", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "6.1.1", "eslint-plugin-standard": "4.1.0", - "eslint-plugin-vue": "9.17.0", + "eslint-plugin-vue": "9.18.1", "less": "4.2.0", "less-loader": "11.1.3", - "sass": "1.66.1", + "sass": "1.69.5", "sass-loader": "13.3.2", "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.14", - "webpack": "5.88.2" + "vue-template-compiler": "2.7.15", + "webpack": "5.89.0" }, "eslintConfig": { "root": true, diff --git a/pkg/api/actors.go b/pkg/api/actors.go index e57385bdd..0e808fdcc 100644 --- a/pkg/api/actors.go +++ b/pkg/api/actors.go @@ -127,6 +127,7 @@ func (i ActorResource) getFilters(req *restful.Request, resp *restful.Response) outAttributes = append(outAttributes, "Has Piercing") outAttributes = append(outAttributes, "Aka Group") outAttributes = append(outAttributes, "Possible Aka") + outAttributes = append(outAttributes, "In An Aka Group") outAttributes = append(outAttributes, "Multiple Stashdb Links") outAttributes = append(outAttributes, "Has Image") diff --git a/pkg/api/files.go b/pkg/api/files.go index 7e3e2a16c..4d41e7d33 100644 --- a/pkg/api/files.go +++ b/pkg/api/files.go @@ -323,6 +323,7 @@ func removeFileByFileId(fileId uint) models.Scene { err := db.Preload("Volume").Where(&models.File{ID: fileId}).First(&file).Error if err == nil { + log.Infof("Deleting file %s", filepath.Join(file.Path, file.Filename)) deleted := false switch file.Volume.Type { case "local": diff --git a/pkg/api/heresphere.go b/pkg/api/heresphere.go index 0581a5fa2..e6fcd5975 100644 --- a/pkg/api/heresphere.go +++ b/pkg/api/heresphere.go @@ -238,6 +238,7 @@ func (i HeresphereResource) getHeresphereFile(req *restful.Request, resp *restfu Media: media, } if requestData.DeleteFiles != nil && config.Config.Interfaces.Heresphere.AllowFileDeletes { + log.Infof("Got request by HereSphere to delete file %v", file.Filename) removeFileByFileId(file.ID) } @@ -879,6 +880,7 @@ func ProcessHeresphereUpdates(scene *models.Scene, requestData HereSphereAuthReq } if requestData.DeleteFiles != nil && config.Config.Interfaces.Heresphere.AllowFileDeletes { + log.Infof("Got request by HereSphere to delete files for scene %v", scene.ID) for _, sceneFile := range scene.Files { removeFileByFileId(sceneFile.ID) } @@ -887,7 +889,7 @@ func ProcessHeresphereUpdates(scene *models.Scene, requestData HereSphereAuthReq if requestData.Hsp != nil && config.Config.Interfaces.Heresphere.AllowHspData { hspContent, err := base64.StdEncoding.DecodeString(*requestData.Hsp) if err != nil { - log.Error("Error decoding heresphere hsp data %v", err) + log.Errorf("Error decoding heresphere hsp data %v", err) } fName := filepath.Join(scene.Files[0].Path, strings.TrimSuffix(scene.Files[0].Filename, filepath.Ext(videoFile.Filename))+".hsp") diff --git a/pkg/api/options.go b/pkg/api/options.go index 71f6b9f00..fa34d815e 100644 --- a/pkg/api/options.go +++ b/pkg/api/options.go @@ -56,7 +56,9 @@ type RequestSaveOptionsWeb struct { ShowHspFile bool `json:"showHspFile"` ShowSubtitlesFile bool `json:"showSubtitlesFile"` SceneTrailerlist bool `json:"sceneTrailerlist"` + ShowScriptHeatmap bool `json:"showScriptHeatmap"` UpdateCheck bool `json:"updateCheck"` + IsAvailOpacity int `json:"isAvailOpacity"` } type RequestSaveOptionsAdvanced struct { @@ -379,7 +381,9 @@ func (i ConfigResource) saveOptionsWeb(req *restful.Request, resp *restful.Respo config.Config.Web.ShowHspFile = r.ShowHspFile config.Config.Web.ShowSubtitlesFile = r.ShowSubtitlesFile config.Config.Web.SceneTrailerlist = r.SceneTrailerlist + config.Config.Web.ShowScriptHeatmap = r.ShowScriptHeatmap config.Config.Web.UpdateCheck = r.UpdateCheck + config.Config.Web.IsAvailOpacity = r.IsAvailOpacity config.SaveConfig() resp.WriteHeaderAndEntity(http.StatusOK, r) diff --git a/pkg/api/scenes.go b/pkg/api/scenes.go index e0e446e54..03ec3bff3 100644 --- a/pkg/api/scenes.go +++ b/pkg/api/scenes.go @@ -64,6 +64,7 @@ type RequestEditSceneDetails struct { Images string `json:"images"` CoverURL string `json:"cover_url"` IsMultipart bool `json:"is_multipart"` + Duration string `json:"duration"` } type ResponseGetScenes struct { @@ -370,6 +371,7 @@ func (i SceneResource) getFilters(req *restful.Request, resp *restful.Response) outAttributes = append(outAttributes, "Has Script Download") outAttributes = append(outAttributes, "Has AI Generated Script") outAttributes = append(outAttributes, "Has Human Generated Script") + outAttributes = append(outAttributes, "Has Favourite Actor") type Results struct { Result string } @@ -804,7 +806,10 @@ func (i SceneResource) editScene(req *restful.Request, resp *restful.Response) { scene.IsMultipart = r.IsMultipart models.AddAction(scene.SceneID, "edit", "is_multipart", strconv.FormatBool(r.IsMultipart)) } - + if strconv.Itoa(scene.Duration) != r.Duration { + scene.Duration, _ = strconv.Atoi(r.Duration) + models.AddAction(scene.SceneID, "edit", "duration", r.Duration) + } ProcessTagChanges(&scene, &r.Tags, db) newCast := make([]models.Actor, 0) diff --git a/pkg/common/common.go b/pkg/common/common.go index fe7ecf65c..972895de2 100644 --- a/pkg/common/common.go +++ b/pkg/common/common.go @@ -19,6 +19,8 @@ type EnvConfigSpec struct { UIUsername string `envconfig:"UI_USERNAME" required:"false"` UIPassword string `envconfig:"UI_PASSWORD" required:"false"` DatabaseURL string `envconfig:"DATABASE_URL" required:"false" default:""` + WsAddr string `envconfig:"XBVR_WS_ADDR" required:"false" default:""` + WebPort int `envconfig:"XBVR_WEB_PORT" required:"false" default:"0"` } var EnvConfig EnvConfigSpec diff --git a/pkg/common/paths.go b/pkg/common/paths.go index 360f85de3..b206c5132 100644 --- a/pkg/common/paths.go +++ b/pkg/common/paths.go @@ -20,7 +20,9 @@ var ScrapeCacheDir string var VideoPreviewDir string var VideoThumbnailDir string var ScriptHeatmapDir string +var MyFilesDir string var DownloadDir string +var WebPort int func DirSize(path string) (int64, error) { var size int64 @@ -38,41 +40,78 @@ func DirSize(path string) (int64, error) { func InitPaths() { - enableLocalStorage := flag.Bool("localstorage", false, "Use local folder to store application data") + enableLocalStorage := flag.Bool("localstorage", false, "Optional: Use local folder to store application data") + app_dir := flag.String("app_dir", "", "Optional: path to the application directory") + cache_dir := flag.String("cache_dir", "", "Optional: path to the tempoarary scraper cache directory") + imgproxy_dir := flag.String("imgproxy_dir", "", "Optional: path to the imageproxy directory") + search_dir := flag.String("search_dir", "", "Optional: path to the Search Index directory") + preview_dir := flag.String("preview_dir", "", "Optional: path to the Scraper Cache directory") + scriptsheatmap_dir := flag.String("scripts_heatmap_dir", "", "Optional: path to the scripts_heatmap directory") + myfiles_dir := flag.String("myfiles_dir", "", "Optional: path to the myfiles directory for serving users own content (eg images") + databaseurl := flag.String("database_url", "", "Optional: override default database path") + web_port := flag.Int("web_port", 0, "Optional: override default Web Page port 9999") + ws_addr := flag.String("ws_addr", "", "Optional: override default Websocket address from the default 0.0.0.0:9998") + flag.Parse() - if *enableLocalStorage { - executable, err := os.Executable() + if *app_dir == "" { + tmp := os.Getenv("XBVR_APPDIR") + app_dir = &tmp + } + if *app_dir == "" { + if *enableLocalStorage { + executable, err := os.Executable() - if err != nil { - panic(err) - } + if err != nil { + panic(err) + } - AppDir = filepath.Dir(executable) + AppDir = filepath.Dir(executable) + } else { + AppDir = appdir.New("xbvr").UserConfig() + } } else { - AppDir = appdir.New("xbvr").UserConfig() + AppDir = *app_dir } - CacheDir = filepath.Join(AppDir, "cache") + CacheDir = getPath(*cache_dir, "XBVR_CACHEDIR", "cache") BinDir = filepath.Join(AppDir, "bin") - ImgDir = filepath.Join(AppDir, "imageproxy") + ImgDir = getPath(*imgproxy_dir, "XBVR_IMAGEPROXYDIR", "imageproxy") MetricsDir = filepath.Join(AppDir, "metrics") HeatmapDir = filepath.Join(AppDir, "heatmap") - IndexDirV2 = filepath.Join(AppDir, "search-v2") + IndexDirV2 = getPath(*search_dir, "XBVR_SEARCHDIR", "search-v2") ScrapeCacheDir = filepath.Join(CacheDir, "scrape_cache") - VideoPreviewDir = filepath.Join(AppDir, "video_preview") + VideoPreviewDir = getPath(*preview_dir, "XBVR_VIDEOPREVIEWDIR", "video_preview") VideoThumbnailDir = filepath.Join(AppDir, "video_thumbnail") - ScriptHeatmapDir = filepath.Join(AppDir, "script_heatmap") + ScriptHeatmapDir = getPath(*scriptsheatmap_dir, "XBVR_SCRIPTHEATMAPDIR", "script_heatmap") + MyFilesDir = getPath(*myfiles_dir, "XBVR_MYFILESDIR", "myfiles") DownloadDir = filepath.Join(AppDir, "download") // Initialize DATABASE_URL once appdir path is known - if EnvConfig.DatabaseURL != "" { - DATABASE_URL = EnvConfig.DatabaseURL + if *databaseurl != "" { + DATABASE_URL = *databaseurl } else { - DATABASE_URL = fmt.Sprintf("sqlite:%v", filepath.Join(AppDir, "main.db")) + if EnvConfig.DatabaseURL != "" { + DATABASE_URL = EnvConfig.DatabaseURL + } else { + DATABASE_URL = fmt.Sprintf("sqlite:%v", filepath.Join(AppDir, "main.db")) + } + } + + if *web_port != 0 { + WebPort = *web_port + } else { + WebPort = EnvConfig.WebPort + } + if *ws_addr != "" { + WsAddr = *ws_addr + } else { + if EnvConfig.WsAddr != "" { + WsAddr = EnvConfig.WsAddr + } } _ = os.MkdirAll(AppDir, os.ModePerm) @@ -84,5 +123,15 @@ func InitPaths() { _ = os.MkdirAll(IndexDirV2, os.ModePerm) _ = os.MkdirAll(ScrapeCacheDir, os.ModePerm) _ = os.MkdirAll(ScriptHeatmapDir, os.ModePerm) + _ = os.MkdirAll(MyFilesDir, os.ModePerm) _ = os.MkdirAll(DownloadDir, os.ModePerm) } +func getPath(commandLinePath string, environmentName string, directoryName string) string { + if commandLinePath != "" { + return commandLinePath + } + if os.Getenv(environmentName) != "" { + return os.Getenv(environmentName) + } + return filepath.Join(AppDir, directoryName) +} diff --git a/pkg/config/config.go b/pkg/config/config.go index 09b699d36..612f10cf9 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -41,7 +41,9 @@ type ObjectConfig struct { ShowHspFile bool `default:"true" json:"showHspFile"` ShowSubtitlesFile bool `default:"true" json:"showSubtitlesFile"` SceneTrailerlist bool `default:"true" json:"sceneTrailerlist"` + ShowScriptHeatmap bool `default:"true" json:"showScriptHeatmap"` UpdateCheck bool `default:"true" json:"updateCheck"` + IsAvailOpacity int `default:"40" json:"isAvailOpacity"` } `json:"web"` Advanced struct { ShowInternalSceneId bool `default:"false" json:"showInternalSceneId"` @@ -167,6 +169,10 @@ func LoadConfig() { if err := json.Unmarshal([]byte(obj.Value), &Config); err != nil { common.Log.Error("Failed to load config from database") } + if common.WebPort != 0 && common.WebPort != Config.Server.Port { + Config.Server.Port = common.WebPort + SaveConfig() + } } } diff --git a/pkg/config/scrapers.json b/pkg/config/scrapers.json index 238eb6264..f2a7dc0c2 100644 --- a/pkg/config/scrapers.json +++ b/pkg/config/scrapers.json @@ -455,7 +455,7 @@ "url": "https://www.sexlikereal.com/studios/vrpfilms", "name": "VRPFilms", "company": "VRPFilms", - "avatar_url": "https://vrpfilms.com/storage/settings/March2021/Z0krYIQBMwSJ4R1eCnv1.png" + "avatar_url": "https://mcdn.vrporn.com/files/20190417121849/vrpfilms-logo.jpg" }, { "url": "https://www.sexlikereal.com/studios/vrpornjack", diff --git a/pkg/config/state.go b/pkg/config/state.go index 72814da39..b465e65f7 100644 --- a/pkg/config/state.go +++ b/pkg/config/state.go @@ -24,7 +24,9 @@ type ObjectState struct { ShowHspFile bool `json:"showHspFile"` ShowSubtitlesFile bool `json:"showSubtitlesFile"` SceneTrailerlist bool `json:"sceneTrailerlist"` + ShowScriptHeatmap bool `json:"showScriptHeatmap"` UpdateCheck bool `json:"updateCheck"` + IsAvailOpacity int `json:"isAvailOpacity"` } `json:"web"` DLNA struct { Running bool `json:"running"` diff --git a/pkg/migrations/migrations.go b/pkg/migrations/migrations.go index 01b991567..ef087c9aa 100644 --- a/pkg/migrations/migrations.go +++ b/pkg/migrations/migrations.go @@ -1765,6 +1765,44 @@ func Migrate() { return nil }, }, + { + ID: "0070-update_possible_aka_saved_search", + Migrate: func(tx *gorm.DB) error { + // update existing Possible Aka Actor Playlist + var playlist models.Playlist + tx.Model(&models.Playlist{}).Where("playlist_type = ? and name = ?", "actor", "Possible Aka").First(&playlist) + if playlist.ID != 0 { + list := models.RequestActorList{ + DlState: optional.NewString("Any"), + Lists: []optional.String{}, + Cast: []optional.String{}, + Sites: []optional.String{}, + Tags: []optional.String{}, + Attributes: []optional.String{}, + JumpTo: optional.NewString(""), + MinAge: optional.NewInt(0), + MaxAge: optional.NewInt(100), + MinHeight: optional.NewInt(120), + MaxHeight: optional.NewInt(220), + MinCount: optional.NewInt(0), + MaxCount: optional.NewInt(150), + MinAvail: optional.NewInt(0), + MaxAvail: optional.NewInt(150), + MinRating: optional.NewFloat64(0), + MaxRating: optional.NewFloat64(5), + MinSceneRating: optional.NewFloat64(0), + MaxSceneRating: optional.NewFloat64(5), + Sort: optional.NewString("birthday_desc"), + } + list.Attributes = append(list.Attributes, optional.NewString("&Possible Aka"), optional.NewString("!In An Aka Group"), optional.NewString("!Aka Group")) + b, _ := json.Marshal(list) + + playlist.SearchParams = string(b) + playlist.Save() + } + return nil + }, + }, }) if err := m.Migrate(); err != nil { diff --git a/pkg/models/model_actor.go b/pkg/models/model_actor.go index 0534629bd..d524aeb9e 100644 --- a/pkg/models/model_actor.go +++ b/pkg/models/model_actor.go @@ -88,6 +88,7 @@ type ResponseActorList struct { CountDownloaded int `json:"count_downloaded"` CountNotDownloaded int `json:"count_not_downloaded"` CountHidden int `json:"count_hidden"` + Offset int `json:"offset"` } type ActorLink struct { @@ -258,6 +259,12 @@ func QueryActors(r RequestActorList, enablePreload bool) ResponseActorList { } else { where = "name not like 'aka:%'" } + case "In An Aka Group": + if truefalse { + where = "(select count(*) from actor_akas " + " where actor_akas.actor_id = actors.id) > 0" + } else { + where = "(select count(*) from actor_akas " + " where actor_akas.actor_id = actors.id) = 0" + } case "Has Image": if truefalse { where = "image_url is not null and image_url <> ''" @@ -340,10 +347,6 @@ func QueryActors(r RequestActorList, enablePreload bool) ResponseActorList { tx = tx.Where("actors.name NOT IN (?)", excludedCast) } - if r.JumpTo.OrElse("") != "" { - tx = tx.Where("actors.name > ?", r.JumpTo.OrElse("")) - } - if r.MinAge.OrElse(0) > 18 || r.MaxAge.OrElse(100) < 100 { startRange := time.Now().AddDate(r.MinAge.OrElse(0)*-1, 0, 0) endRange := time.Now().AddDate(r.MaxAge.OrElse(0)*-1, 0, 0) @@ -459,6 +462,12 @@ func QueryActors(r RequestActorList, enablePreload bool) ResponseActorList { } else { tx = tx.Order("random()") } + case "scene_count_desc": + tx = tx. + Order("actors.`count` desc, actors.name") + case "scene_available_desc": + tx = tx. + Order("actors.`avail_count` desc, actors.name") default: tx = tx.Order("name asc") } @@ -470,6 +479,21 @@ func QueryActors(r RequestActorList, enablePreload bool) ResponseActorList { return db.Order("release_date DESC").Where("is_hidden = 0") }) + if r.JumpTo.OrElse("") != "" { + // if we want to jump to actors starting with a specific letter, then we need to work out the offset to them + cnt := 0 + txList := tx.Select(`distinct actors.name`) + txList.Find(&out.Actors) + for idx, actor := range out.Actors { + if strings.ToLower(actor.Name) >= strings.ToLower(r.JumpTo.OrElse("")) { + break + } + cnt = idx + } + offset = (cnt / limit) * limit + } + out.Offset = offset + tx = tx.Select(`distinct actors.*, (select AVG(s.star_rating) scene_avg from scene_cast sc join scenes s on s.id=sc.scene_id where sc.actor_id =actors.id and s.star_rating > 0 ) as scene_rating_average `) diff --git a/pkg/models/model_scene.go b/pkg/models/model_scene.go index 3865f1e28..aeb30fecb 100644 --- a/pkg/models/model_scene.go +++ b/pkg/models/model_scene.go @@ -834,6 +834,8 @@ func queryScenes(db *gorm.DB, r RequestSceneList) (*gorm.DB, *gorm.DB) { where = "scenes.ai_script = 1" case "Has Human Generated Script": where = "scenes.human_script = 1" + case "Has Favourite Actor": + where = "exists (select * from scene_cast join actors on actors.id=scene_cast.actor_id where actors.favourite=1 and scene_cast.scene_id=scenes.id)" } if negate { diff --git a/pkg/scrape/javbus.go b/pkg/scrape/javbus.go deleted file mode 100644 index c47b1f991..000000000 --- a/pkg/scrape/javbus.go +++ /dev/null @@ -1,110 +0,0 @@ -package scrape - -import ( - "regexp" - "strconv" - "strings" - - "github.com/gocolly/colly/v2" - "github.com/xbapps/xbvr/pkg/models" -) - -func ScrapeJavBus(out *[]models.ScrapedScene, queryString string) { - sceneCollector := createCollector("www.javbus.com") - - sceneCollector.OnHTML(`html`, func(html *colly.HTMLElement) { - sc := models.ScrapedScene{} - sc.SceneType = "VR" - - // Always add 'javr' as a tag - sc.Tags = append(sc.Tags, `javr`) - - // Always add 'javbus' as a tag - sc.Tags = append(sc.Tags, `javbus`) - - html.ForEach(`div.row.movie div.info > p`, func(id int, p *colly.HTMLElement) { - label := p.ChildText(`span.header`) - - if label == `Studio:` { - // Studio - sc.Studio = p.ChildText(`a`) - - } else if label == `ID:` { - // Title, SceneID and SiteID all like 'VRKM-821' format - idRegex := regexp.MustCompile("^([A-Za-z0-9]+)-([0-9]+)$") - p.ForEach("span", func(_ int, span *colly.HTMLElement) { - match := idRegex.FindStringSubmatch(span.Text) - if match != nil && len(match) > 2 { - dvdId := match[1] + "-" + match[2] - sc.Title = dvdId - sc.SceneID = dvdId - sc.SiteID = dvdId - sc.Site = match[1] - } - }) - - } else if label == `Release Date:` { - // Release date - dateStr := p.Text - dateRegex := regexp.MustCompile("(\\d\\d\\d\\d-\\d\\d-\\d\\d)") - match := dateRegex.FindStringSubmatch(dateStr) - if match != nil && len(match) > 1 { - sc.Released = match[1] - } - - } else if label == `Length:` { - // Duration - durationStr := p.Text - durationRegex := regexp.MustCompile("(\\d+)") - match := durationRegex.FindStringSubmatch(durationStr) - if match != nil && len(match) > 1 { - sc.Duration, _ = strconv.Atoi(match[1]) - } - } - }) - - // Tags - html.ForEach("div.row.movie span.genre > label > a", func(id int, anchor *colly.HTMLElement) { - href := anchor.Attr("href") - if strings.Contains(href, "javbus.com/en/genre/") { - // Tags - tag := ProcessJavrTag(anchor.Text) - - if tag != "" { - sc.Tags = append(sc.Tags, tag) - } - } - }) - - // Cast - html.ForEach("div.row.movie div.star-name > a", func(id int, anchor *colly.HTMLElement) { - href := anchor.Attr("href") - if strings.Contains(href, "javbus.com/en/star/") { - sc.Cast = append(sc.Cast, anchor.Text) - } - }) - - // Screenshots - html.ForEach("a[href]", func(_ int, anchor *colly.HTMLElement) { - linkHref := anchor.Attr(`href`) - if strings.HasPrefix(linkHref, "https://pics.dmm.co.jp/digital/video/") && strings.HasSuffix(linkHref, `.jpg`) { - sc.Gallery = append(sc.Gallery, linkHref) - } - }) - - // Apply post-processing for error-correcting code - PostProcessJavScene(&sc, "") - - if sc.SceneID != "" { - *out = append(*out, sc) - } - }) - - // Allow comma-separated scene id's - scenes := strings.Split(queryString, ",") - for _, v := range scenes { - sceneCollector.Visit("https://www.javbus.com/en/" + strings.ToUpper(v) + "/") - } - - sceneCollector.Wait() -} diff --git a/pkg/scrape/r18d.go b/pkg/scrape/r18d.go new file mode 100644 index 000000000..f5acb75bc --- /dev/null +++ b/pkg/scrape/r18d.go @@ -0,0 +1,126 @@ +package scrape + +import ( + "html" + "strconv" + "strings" + + "github.com/go-resty/resty/v2" + "github.com/tidwall/gjson" + "github.com/xbapps/xbvr/pkg/models" +) + +func ScrapeR18D(out *[]models.ScrapedScene, queryString string) error { + scenes := strings.Split(queryString, ",") + for _, v := range scenes { + sc := models.ScrapedScene{} + sc.SceneType = "VR" + + r, _ := resty.New().R().Get("https://r18.dev/videos/vod/movies/detail/-/combined=" + v + "/json") + JsonMetadata := r.String() + + content_id := gjson.Get(JsonMetadata, "content_id").String() + sc.HomepageURL = "https://www.dmm.co.jp/en/digital/videoa/-/detail/=/cid=" + content_id + "/" + + // Title + if gjson.Get(JsonMetadata, "title_en_is_machine_translation").String() == "false" { + sc.Title = strings.Replace(strings.TrimSpace(html.UnescapeString(gjson.Get(JsonMetadata, "title_en").String())), "[VR] ", "", -1) + } else { + sc.Title = gjson.Get(JsonMetadata, "content_id").String() + sc.Synopsis = gjson.Get(JsonMetadata, "title_en").String() + } + + // Studio + sc.Studio = gjson.Get(JsonMetadata, "maker_name_en").String() + + // Date + sc.Released = gjson.Get(JsonMetadata, "release_date").String() + + // Time + tmpDuration, err := strconv.Atoi(gjson.Get(JsonMetadata, "runtime_mins").String()) + if err == nil { + sc.Duration = tmpDuration + } + + // Covers + coverimgs := gjson.Get(JsonMetadata, "jacket_full_url") + sc.Covers = append(sc.Covers, strings.TrimSpace(html.UnescapeString(coverimgs.String()))) + + // Gallery + galleryimgs := gjson.Get(JsonMetadata, "gallery.#.image_full") + for _, name := range galleryimgs.Array() { + sc.Gallery = append(sc.Gallery, strings.TrimSpace(html.UnescapeString(name.String()))) + } + + // Cast + actornames := gjson.Get(JsonMetadata, "actresses.#.name_romaji") + for _, name := range actornames.Array() { + sc.Cast = append(sc.Cast, strings.TrimSpace(html.UnescapeString(name.String()))) + } + + // Tags + // Skipping some very generic and useless tags + skiptags := map[string]bool{ + "Featured Actress": true, + "VR Exclusive": true, + "High-Quality VR": true, + "Exclusive Distribution": true, + } + + // JSON dump from R18's final days shows "女子校生" replaced with "Academy Uniform" instead of "Schoolgirl" - r18.dev seems to follow the same mapping for FANZA category 1018 - get your credit card compliance puritanism out of my porn, I don't need "Academy Uniform" and "Uniform" tagged together lmao + joshikosei := "Academy Uniform" + + taglist := gjson.Get(JsonMetadata, "categories.#.name_en") + quality := "VR" + has8KVR := false + for _, name := range taglist.Array() { + if name.Str == "8KVR" { + has8KVR = true + quality = "8K" + } else if name.Str == "High-Quality VR" && !has8KVR { + quality = "HQ" + } + if !skiptags[name.Str] { + if name.Str == joshikosei { + sc.Tags = append(sc.Tags, "schoolgirl") + } else { + sc.Tags = append(sc.Tags, strings.TrimSpace(html.UnescapeString(name.String()))) + } + } + } + sc.Tags = append(sc.Tags, "JAVR") + sc.Tags = append(sc.Tags, "R18.dev") + + // Scene ID and Site + dvdID := gjson.Get(JsonMetadata, "dvd_id").String() + if dvdID == "----" || dvdID == "" { + sc.SceneID = content_id + sc.SiteID = content_id + sc.Site = gjson.Get(JsonMetadata, "label_name_en").String() + } else { + sc.SceneID = dvdID + sc.SiteID = dvdID + sc.Site = strings.Split(dvdID, "-")[0] + } + + // Filler Filenames + resolutions := []string{"vmb"} + if quality == "HQ" { + resolutions = []string{"vrv1uhqe"} + } else if quality == "8K" { + resolutions = []string{"vrv1uhqf", "vrv18khia"} + } + for r := range resolutions { + parts := []string{"", "1", "2", "3"} + for p := range parts { + fn := content_id + resolutions[r] + parts[p] + ".mp4" + sc.Filenames = append(sc.Filenames, fn) + } + } + + if sc.SceneID != "" { + *out = append(*out, sc) + } + } + return nil +} diff --git a/pkg/scrape/sexbabesvr.go b/pkg/scrape/sexbabesvr.go index 2d1681356..d8d044c55 100644 --- a/pkg/scrape/sexbabesvr.go +++ b/pkg/scrape/sexbabesvr.go @@ -3,9 +3,6 @@ package scrape import ( "encoding/json" "net/url" - "regexp" - "sort" - "strconv" "strings" "sync" "time" @@ -43,7 +40,7 @@ func SexBabesVR(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out c e.ForEach(`dl8-video`, func(id int, e *colly.HTMLElement) { sc.SiteID = e.Attr("data-scene") sc.SceneID = slugify.Slugify(sc.Site) + "-" + sc.SiteID - sc.Covers = append(sc.Covers, e.Attr("poster")) + sc.Covers = append(sc.Covers, strings.Replace(e.Attr("poster"), "/videoDetail2x", "", -1)) }) // Title @@ -83,18 +80,20 @@ func SexBabesVR(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out c }) // Date - sc.Released = e.Request.Ctx.Get("released") + releaseDateText := e.ChildText(`.video-detail__description--container > div:last-of-type`) + tmpDate, _ := time.Parse("Jan 02, 2006", releaseDateText) + sc.Released = tmpDate.Format("2006-01-02") // Duration // Filenames - // old site, needs update + // old site, needs update e.ForEach(`div.modal a.vd-row`, func(id int, e *colly.HTMLElement) { origURL, _ := url.Parse(e.Attr("href")) base := origURL.Query().Get("response-content-disposition") - base = strings.Replace(base, "attachment; filename=", "", -1) - base = strings.Replace(base, "\"", "", -1) - base = strings.Replace(base, "_trailer", "", -1) + base = strings.ReplaceAll(base, "attachment; filename=", "") + base = strings.ReplaceAll(base, "\"", "") + base = strings.ReplaceAll(base, "_trailer", "") if !funk.ContainsString(sc.Filenames, base) { sc.Filenames = append(sc.Filenames, base) } @@ -108,22 +107,11 @@ func SexBabesVR(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out c siteCollector.Visit(pageURL) }) - type video struct { - url string - released string - } - videoList := make(map[int]video) - siteCollector.OnHTML(`div.videos__content`, func(e *colly.HTMLElement) { - e.ForEach(`a.video-container__description--information`, func(cnt int, e *colly.HTMLElement) { + e.ForEach(`a.video-container__description--title`, func(cnt int, e *colly.HTMLElement) { sceneURL := e.Request.AbsoluteURL(e.Attr("href")) - re := regexp.MustCompile(`(?m)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2}`) - match := re.FindAllString(e.Text, -1) - - if len(match) > 0 { - // If scene exist in database, there's no need to scrape - page, _ := strconv.Atoi(strings.ReplaceAll(e.Request.URL.String(), "https://sexbabesvr.com/vr-porn-videos/", "")) - videoList[page*1000+cnt] = video{url: sceneURL, released: match[0]} + if !funk.ContainsString(knownScenes, sceneURL) { + sceneCollector.Visit(sceneURL) } }) }) @@ -132,38 +120,11 @@ func SexBabesVR(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out c lastMonth = int(time.Now().Month()) if singleSceneURL != "" { - ctx := colly.NewContext() - ctx.Put("released", "") - - sceneCollector.Request("GET", singleSceneURL, nil, ctx, nil) + sceneCollector.Visit(singleSceneURL) } else { siteCollector.Visit("https://sexbabesvr.com/vr-porn-videos") } - // Sort the videoList as page visits may not return in the same speed and be out of order - var sortedVideos []int - for key := range videoList { - sortedVideos = append(sortedVideos, key) - } - sort.Ints(sortedVideos) - - for _, seq := range sortedVideos { - ctx := colly.NewContext() - tmpDate, _ := time.Parse("Jan 02", videoList[seq].released) - if tmpDate.Month() == 12 && lastMonth == 1 { - currentYear -= 1 - } else if tmpDate.Month() == 1 && lastMonth == 12 { - currentYear += 1 - } - tmpDate = tmpDate.AddDate(currentYear-tmpDate.Year(), 0, 0) - lastMonth = int(tmpDate.Month()) - ctx.Put("released", tmpDate.Format("2006-01-02")) - - if !funk.ContainsString(knownScenes, videoList[seq].url) { - sceneCollector.Request("GET", videoList[seq].url, nil, ctx, nil) - } - } - if updateSite { updateSiteLastUpdate(scraperID) } diff --git a/pkg/scrape/slrstudios.go b/pkg/scrape/slrstudios.go index 27e5cc659..9dd820ca6 100644 --- a/pkg/scrape/slrstudios.go +++ b/pkg/scrape/slrstudios.go @@ -140,6 +140,10 @@ func SexLikeReal(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out sc.TrailerType = "slr" sc.TrailerSrc = "https://api.sexlikereal.com/virtualreality/video/id/" + sc.SiteID + s, _ := resty.New().R(). + SetHeader("User-Agent", UserAgent). + Get(sc.TrailerSrc) + JsonMetadataA := s.String() isTransScene := e.Request.Ctx.GetAny("isTransScene").(bool) @@ -209,6 +213,9 @@ func SexLikeReal(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out // Title sc.Title = gjson.Get(JsonMetadata, "title").String() + // Fix Scene ID Collisions + sc.SceneID = "slr-trans-" + sc.SiteID + // Duration - Not Available // Filenames @@ -230,10 +237,6 @@ func SexLikeReal(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out // Passthrough "chromaKey":{"enabled":false,"hasAlpha":true,"h":0,"opacity":1,"s":0,"threshold":0,"v":0} if alphA == "PT" { - s, _ := resty.New().R(). - SetHeader("User-Agent", UserAgent). - Get(sc.TrailerSrc) - JsonMetadataA := s.String() if gjson.Get(JsonMetadataA, "chromaKey").Exists() { sc.ChromaKey = gjson.Get(JsonMetadataA, "chromaKey").String() } @@ -241,7 +244,7 @@ func SexLikeReal(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out } // Filenames - appendFilenames(&sc, siteID, filenameRegEx, videotype, FB360, alphA) + appendFilenames(&sc, siteID, filenameRegEx, videotype, FB360, alphA, JsonMetadataA, isTransScene) // actor details sc.ActorDetails = make(map[string]models.ActorDetails) @@ -362,47 +365,93 @@ func SexLikeReal(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out return nil } -func appendFilenames(sc *models.ScrapedScene, siteID string, filenameRegEx *regexp.Regexp, videotype string, FB360 string, AlphA string) { +func appendFilenames(sc *models.ScrapedScene, siteID string, filenameRegEx *regexp.Regexp, videotype string, FB360 string, AlphA string, JsonMetadataA string, isTransScene bool) { // Only shown for logged in users so need to generate them // Format: SLR_siteID_Title__SceneID__<180/360>.mp4 - resolutions := []string{"_6400p_", "_4096p_", "_4000p_", "_3840p_", "_3360p_", "_3160p_", "_3072p_", "_3000p_", "_2900p_", "_2880p_", "_2700p_", "_2650p_", "_2160p_", "_1920p_", "_1620p_", "_1440p_", "_1080p_", "_original_"} - baseName := "SLR_" + strings.TrimSuffix(siteID, " (SLR)") + "_" + filenameRegEx.ReplaceAllString(sc.Title, "_") - switch videotype { - case "360°": // Sadly can't determine if TB or MONO so have to add both - for i := range resolutions { - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MONO_360.mp4") - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_TB_360.mp4") - } - case "190°", "200°", "220°", "fisheye": // 200° videos named with MKX200 - for i := range resolutions { + if !isTransScene { + viewAngle := gjson.Get(JsonMetadataA, "viewAngle").String() + projSuffix := "_LR_180.mp4" + if viewAngle == "190" || viewAngle == "200" || viewAngle == "220" { + screentype := strings.ToUpper(gjson.Get(JsonMetadataA, "screenType").String()) + projSuffix = "_" + screentype if AlphA == "true" { - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MKX200_alpha.mp4") - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MKX220_alpha.mp4") - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_RF52_alpha.mp4") - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_FISHEYE190_alpha.mp4") - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_VRCA220_alpha.mp4") + projSuffix = "_" + screentype + "_alpha" + } + if FB360 != "" { + FB360 = projSuffix + "_FB360.mkv" + } + projSuffix = projSuffix + ".mp4" + } else if viewAngle == "360" { + monotb := gjson.Get(JsonMetadataA, "stereomode").String() + if monotb == "mono" { + projSuffix = "_MONO_360.mp4" } else { - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MKX200.mp4") - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MKX220.mp4") - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_RF52.mp4") - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_FISHEYE190.mp4") - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_VRCA220.mp4") + projSuffix = "_TB_360.mp4" } } - default: // Assuming everything else is 180 and LR, yet to find a TB_180 - for i := range resolutions { - sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_LR_180.mp4") + resolutions := []string{"_original_"} + encodings := gjson.Get(JsonMetadataA, "encodings.#(name=h265).videoSources.#.resolution") + for _, name := range encodings.Array() { + resolutions = append(resolutions, "_"+name.String()+"p_") + } + baseName := "SLR_" + strings.TrimSuffix(siteID, " (SLR)") + "_" + filenameRegEx.ReplaceAllString(sc.Title, "_") + switch videotype { + case "360°": + for i := range resolutions { + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+projSuffix) + } + case "190°", "200°", "220°", "Fisheye": // 200° videos named with MKX200 + for i := range resolutions { + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+projSuffix) + } + default: // Assuming everything else is 180 and LR, yet to find a TB_180 + for i := range resolutions { + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+projSuffix) + } + } + if FB360 != "" { + sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+FB360) + } + } else { + resolutions := []string{"_6400p_", "_4096p_", "_4000p_", "_3840p_", "_3360p_", "_3160p_", "_3072p_", "_3000p_", "_2900p_", "_2880p_", "_2700p_", "_2650p_", "_2622p_", "_2160p_", "_1920p_", "_1620p_", "_1440p_", "_1080p_", "_original_"} + baseName := "SLR_" + strings.TrimSuffix(siteID, " (SLR)") + "_" + filenameRegEx.ReplaceAllString(sc.Title, "_") + switch videotype { + case "360°": // Sadly can't determine if TB or MONO so have to add both + for i := range resolutions { + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MONO_360.mp4") + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_TB_360.mp4") + } + case "190°", "200°", "220°", "Fisheye": // 200° videos named with MKX200 + for i := range resolutions { + if AlphA == "true" { + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MKX200_alpha.mp4") + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MKX220_alpha.mp4") + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_RF52_alpha.mp4") + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_FISHEYE190_alpha.mp4") + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_VRCA220_alpha.mp4") + } else { + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MKX200.mp4") + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_MKX220.mp4") + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_RF52.mp4") + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_FISHEYE190.mp4") + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_VRCA220.mp4") + } + } + default: // Assuming everything else is 180 and LR, yet to find a TB_180 + for i := range resolutions { + sc.Filenames = append(sc.Filenames, baseName+resolutions[i]+sc.SiteID+"_LR_180.mp4") + } + } + if FB360 != "" { + sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_LR_180"+FB360) + sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_MKX200"+FB360) + sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_MKX220"+FB360) + sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_RF52"+FB360) + sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"FISHEYE190"+FB360) + sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_VRCA220"+FB360) + sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_MONO_360"+FB360) + sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_TB_360"+FB360) } - } - if FB360 != "" { - sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_LR_180"+FB360) - sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_MKX200"+FB360) - sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_MKX220"+FB360) - sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_RF52"+FB360) - sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"FISHEYE190"+FB360) - sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_VRCA220"+FB360) - sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_MONO_360"+FB360) - sc.Filenames = append(sc.Filenames, baseName+"_original_"+sc.SiteID+"_TB_360"+FB360) } } diff --git a/pkg/scrape/tmwvrnet.go b/pkg/scrape/tmwvrnet.go index 1604b16e8..c53bf7b97 100644 --- a/pkg/scrape/tmwvrnet.go +++ b/pkg/scrape/tmwvrnet.go @@ -32,10 +32,10 @@ func TmwVRnet(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out cha sc.HomepageURL = strings.Split(e.Request.URL.String(), "?")[0] // Date & Duration - e.ForEach(`.info-block__main-info_f`, func(id int, e *colly.HTMLElement) { - tmpDate, _ := goment.New(e.ChildText(`.date`), "MMMM DD, YYYY") + e.ForEach(`.video-info-data`, func(id int, e *colly.HTMLElement) { + tmpDate, _ := goment.New(e.ChildText(`.video-info-date`), "MMMM DD, YYYY") sc.Released = tmpDate.Format("YYYY-MM-DD") - tmpDuration, err := strconv.Atoi(strings.TrimSpace(strings.Replace(e.ChildText(`.durations`), " min", "", -1))) + tmpDuration, err := strconv.Atoi(strings.TrimSpace(strings.Replace(e.ChildText(`.video-info-time`), " min", "", -1))) if err == nil { sc.Duration = tmpDuration } @@ -45,12 +45,7 @@ func TmwVRnet(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out cha e.ForEach(`dl8-video`, func(id int, e *colly.HTMLElement) { sc.Title = strings.TrimSpace(e.Attr("title")) - tmpCover := "" - if e.Request.Ctx.GetAny("cover-id").(string) == "" { - tmpCover = e.Request.AbsoluteURL(e.Attr("poster")) - } else { - tmpCover = e.Request.AbsoluteURL(e.Request.Ctx.GetAny("cover-id").(string)) - } + tmpCover := e.Request.AbsoluteURL(e.Attr("poster")) sc.Covers = append(sc.Covers, tmpCover) tmp := strings.Split(tmpCover, "/") @@ -60,16 +55,25 @@ func TmwVRnet(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out cha // Gallery e.ForEach(`div.photo-list img`, func(id int, e *colly.HTMLElement) { - sc.Gallery = append(sc.Gallery, e.Request.AbsoluteURL(e.Attr("src"))) + galleryURL := e.Request.AbsoluteURL(e.Attr("src")) + if galleryURL == "" || galleryURL == "https://tmwvrnet.com/assets/vr/public/tour1/images/th5.jpg" { + return + } + srcset := strings.Split(e.Attr("srcset"), ",") + lastSrc := srcset[len(srcset)-1] + if lastSrc != "" { + galleryURL = e.Request.AbsoluteURL(strings.TrimSpace(strings.Split(lastSrc, " ")[0])) + } + sc.Gallery = append(sc.Gallery, galleryURL) }) // Synopsis - e.ForEach(`div.about-video p.about`, func(id int, e *colly.HTMLElement) { + e.ForEach(`p.video-description-text`, func(id int, e *colly.HTMLElement) { sc.Synopsis = strings.TrimSpace(e.Text) }) // Tags - e.ForEach(`div.about-video .tags-list a`, func(id int, e *colly.HTMLElement) { + e.ForEach(`div.video-tag-list a`, func(id int, e *colly.HTMLElement) { tag := strings.TrimSpace(e.Text) if tag != "" { sc.Tags = append(sc.Tags, tag) @@ -84,7 +88,7 @@ func TmwVRnet(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out cha // Cast sc.ActorDetails = make(map[string]models.ActorDetails) - e.ForEach(`div.about-video p.featuring a`, func(id int, e *colly.HTMLElement) { + e.ForEach(`.video-actor-list a`, func(id int, e *colly.HTMLElement) { sc.Cast = append(sc.Cast, strings.TrimSpace(e.Text)) sc.ActorDetails[strings.TrimSpace(e.Text)] = models.ActorDetails{Source: sc.ScraperID + " scrape", ProfileUrl: e.Request.AbsoluteURL(e.Attr("href"))} }) @@ -100,25 +104,20 @@ func TmwVRnet(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out cha siteCollector.Visit(pageURL) }) - siteCollector.OnHTML(`div.thumbs__image`, func(e *colly.HTMLElement) { + siteCollector.OnHTML(`div.thumb-photo`, func(e *colly.HTMLElement) { sceneURL := e.Request.AbsoluteURL(e.ChildAttr(`a`, "href")) - ctx := colly.NewContext() - ctx.Put("cover-id", e.ChildAttr(`img`, "data-src")) if strings.Contains(sceneURL, "trailers") { // If scene exist in database, there's no need to scrape if !funk.ContainsString(knownScenes, sceneURL) { - sceneCollector.Request("GET", sceneURL, nil, ctx, nil) + sceneCollector.Visit(sceneURL) } } }) if singleSceneURL != "" { - ctx := colly.NewContext() - ctx.Put("cover-id", "") - - sceneCollector.Request("GET", singleSceneURL, nil, ctx, nil) + sceneCollector.Visit(singleSceneURL) } else { siteCollector.Visit("https://tmwvrnet.com/categories/movies.html") } @@ -131,5 +130,5 @@ func TmwVRnet(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out cha } func init() { - registerScraper("tmwvrnet", "TmwVRnet", "https://tmwvrnet.com/assets/vr/public/tour1/images/favicon/apple-touch-icon.png", "tmwvrnet.com", TmwVRnet) + registerScraper("tmwvrnet", "TmwVRnet", "https://cdn-vr.sexlikereal.com/images/studio_creatives/logotypes/1/26/logo_crop_1623330575.png", "tmwvrnet.com", TmwVRnet) } diff --git a/pkg/scrape/virtualrealporn.go b/pkg/scrape/virtualrealporn.go index 36be99d25..cef44c682 100644 --- a/pkg/scrape/virtualrealporn.go +++ b/pkg/scrape/virtualrealporn.go @@ -1,9 +1,11 @@ package scrape import ( + "bytes" "encoding/json" "fmt" "html" + "image" "strconv" "strings" "sync" @@ -20,11 +22,18 @@ func VirtualRealPornSite(wg *sync.WaitGroup, updateSite bool, knownScenes []stri logScrapeStart(scraperID, siteID) page := 1 + imageCollector := createCollector("virtualrealporn.com", "virtualrealtrans.com", "virtualrealgay.com", "virtualrealpassion.com", "virtualrealamateurporn.com") sceneCollector := createCollector("virtualrealporn.com", "virtualrealtrans.com", "virtualrealgay.com", "virtualrealpassion.com", "virtualrealamateurporn.com") siteCollector := createCollector("virtualrealporn.com", "virtualrealtrans.com", "virtualrealgay.com", "virtualrealpassion.com", "virtualrealamateurporn.com") castCollector := createCollector("virtualrealporn.com", "virtualrealtrans.com", "virtualrealgay.com", "virtualrealpassion.com", "virtualrealamateurporn.com") castCollector.AllowURLRevisit = true + imageCollector.OnResponse(func(r *colly.Response) { + if _, _, err := image.Decode(bytes.NewReader(r.Body)); err == nil { + r.Ctx.Put("valid", "1") + } + }) + sceneCollector.OnHTML(`html`, func(e *colly.HTMLElement) { sc := models.ScrapedScene{} sc.ScraperID = scraperID @@ -54,14 +63,30 @@ func VirtualRealPornSite(wg *sync.WaitGroup, updateSite bool, knownScenes []stri // Cover URLs e.ForEach(`meta[property="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]) + if len(sc.Covers) == 0 { + u := strings.Split(e.Request.AbsoluteURL(e.Attr("content")), "?")[0] + ctx := colly.NewContext() + if err := imageCollector.Request("GET", u, nil, ctx, nil); err == nil { + if ctx.Get("valid") != "" { + sc.Covers = append(sc.Covers, u) + } + } } }) // Gallery e.ForEach(`figure[itemprop="associatedMedia"] a`, func(id int, e *colly.HTMLElement) { - sc.Gallery = append(sc.Gallery, e.Request.AbsoluteURL(strings.Split(e.Attr("href"), "?")[0])) + if len(sc.Covers) == 0 { + u := e.Request.AbsoluteURL(strings.Split(e.Attr("href"), "?")[0]) + ctx := colly.NewContext() + if err := imageCollector.Request("GET", u, nil, ctx, nil); err == nil { + if ctx.Get("valid") != "" { + sc.Covers = append(sc.Covers, u) + } + } + } else { + sc.Gallery = append(sc.Gallery, e.Request.AbsoluteURL(strings.Split(e.Attr("href"), "?")[0])) + } }) // Tags diff --git a/pkg/scrape/vrbangers.go b/pkg/scrape/vrbangers.go index 2702adc54..7bb556b82 100755 --- a/pkg/scrape/vrbangers.go +++ b/pkg/scrape/vrbangers.go @@ -32,7 +32,11 @@ func VRBangersSite(wg *sync.WaitGroup, updateSite bool, knownScenes []string, ou sc.Site = siteID sc.HomepageURL = strings.Split(e.Request.URL.String(), "?")[0] - content_id := strings.Split(strings.Replace(sc.HomepageURL, "//", "/", -1), "/")[3] + parts := strings.Split(strings.Replace(sc.HomepageURL, "//", "/", -1), "/") + if len(parts) < 4 { + return + } + content_id := parts[3] //https://content.vrbangers.com contentURL := strings.Replace(URL, "//", "//content.", 1) diff --git a/pkg/scrape/vrspy.go b/pkg/scrape/vrspy.go index c71dfe336..8336a6c23 100755 --- a/pkg/scrape/vrspy.go +++ b/pkg/scrape/vrspy.go @@ -161,5 +161,5 @@ func VRSpy(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out chan<- } func init() { - registerScraper(scraperID, siteID, baseURL+"/favicon.png", domain, VRSpy) + registerScraper(scraperID, siteID, baseURL+"/favicon.ico", domain, VRSpy) } diff --git a/pkg/scrape/wetvr.go b/pkg/scrape/wetvr.go index e440a1a68..8af34c8c2 100644 --- a/pkg/scrape/wetvr.go +++ b/pkg/scrape/wetvr.go @@ -140,5 +140,5 @@ func WetVR(wg *sync.WaitGroup, updateSite bool, knownScenes []string, out chan<- } func init() { - registerScraper("wetvr", "WetVR", "https://wetvr.com/assets/images/sites/wetvr/logo-4a2f06a4c9.png", "wetvr.com", WetVR) + registerScraper("wetvr", "WetVR", "https://wetvr.com/wetvr-favicone2df70df.ico", "wetvr.com", WetVR) } diff --git a/pkg/server/myfiles.go b/pkg/server/myfiles.go new file mode 100644 index 000000000..70334db18 --- /dev/null +++ b/pkg/server/myfiles.go @@ -0,0 +1,36 @@ +package server + +import ( + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "strings" + + "github.com/xbapps/xbvr/pkg/common" +) + +type MyFilesHandler struct { +} + +func (h MyFilesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + path := filepath.Join(common.MyFilesDir, r.URL.Path) + fi, err := os.Stat(path) + + if os.IsNotExist(err) || strings.Contains(path, "..") { // check the path exists and not trying to go up directory levels + // file does not exist + http.Error(w, err.Error(), http.StatusNotFound) + return + } + + //copy the relevant headers. If you want to preserve the downloaded file name, extract it with go's url parser. + if strings.HasSuffix(path, ".json") { + w.Header().Set("Content-Type", r.Header.Get("application/json")) + } + w.Header().Set("Content-Length", fmt.Sprint(fi.Size())) // useful for download progress + + //stream the body to the client without fully loading it into memory + reader, _ := os.Open(path) + io.Copy(w, reader) +} diff --git a/pkg/server/server.go b/pkg/server/server.go index bbcc575f5..327c4b681 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -142,6 +142,8 @@ func StartServer(version, commit, branch, date string) { r.PathPrefix("/imghm/").Handler(http.StripPrefix("/imghm", hmp)) downloadhandler := DownloadHandler{} r.PathPrefix("/download/").Handler(http.StripPrefix("/download/", downloadhandler)) + myfileshandler := MyFilesHandler{} + r.PathPrefix("/myfiles/").Handler(http.StripPrefix("/myfiles/", myfileshandler)) r.SkipClean(true) r.PathPrefix("/").Handler(http.DefaultServeMux) diff --git a/pkg/tasks/content.go b/pkg/tasks/content.go index 98c7ceaa4..6a612fee4 100644 --- a/pkg/tasks/content.go +++ b/pkg/tasks/content.go @@ -238,10 +238,15 @@ func ReapplyEdits() { continue } // Reapply other edits - db.Model(&scene).Update(a.ChangedColumn, a.NewValue) - if a.ChangedColumn == "release_date_text" { + switch a.ChangedColumn { + case "duration": + i, _ := strconv.Atoi(a.NewValue) + db.Model(&scene).Update(a.ChangedColumn, i) + case "release_date_text": dt, _ := time.Parse("2006-01-02", a.NewValue) db.Model(&scene).Update("release_date", dt) + default: + db.Model(&scene).Update(a.ChangedColumn, a.NewValue) } } db.Model(&models.Scene{}).UpdateColumn("edits_applied", true) @@ -347,9 +352,9 @@ func ScrapeJAVR(queryString string, scraper string) { if scraper == "javlibrary" { tlog.Infof("Scraping JavLibrary") scrape.ScrapeJavLibrary(&collectedScenes, queryString) - } else if scraper == "javbus" { - tlog.Infof("Scraping JavBus") - scrape.ScrapeJavBus(&collectedScenes, queryString) + } else if scraper == "r18d" { + tlog.Infof("Scraping R18.dev") + scrape.ScrapeR18D(&collectedScenes, queryString) } else if scraper == "javland" { tlog.Infof("Scraping JavLand") scrape.ScrapeJavLand(&collectedScenes, queryString) diff --git a/ui/src/QuickFind.vue b/ui/src/QuickFind.vue index 7fe863e90..6236afa27 100644 --- a/ui/src/QuickFind.vue +++ b/ui/src/QuickFind.vue @@ -48,7 +48,7 @@
- {{ props.option.site}} + {{ props.option.site}}
{{ props.option.title }}
@@ -58,6 +58,7 @@
+
{{format(parseISO(props.option.release_date), "yyyy-MM-dd")}} @@ -74,6 +75,7 @@ import ky from 'ky' import VueLoadImage from 'vue-load-image' import GlobalEvents from 'vue-global-events' import { format, parseISO } from 'date-fns' +import StarRating from 'vue-star-rating' export default { name: 'ModalNewTag', @@ -81,7 +83,7 @@ export default { active: Boolean, sceneId: String }, - components: { VueLoadImage, GlobalEvents }, + components: { VueLoadImage, GlobalEvents, StarRating }, computed: { isActive: { get () { diff --git a/ui/src/Socket.vue b/ui/src/Socket.vue index af5b35a17..cc30da878 100644 --- a/ui/src/Socket.vue +++ b/ui/src/Socket.vue @@ -30,7 +30,7 @@ export default { onReconnectSuccess: () => { this.wsStatus = 'connected' } - }) + }) ws.subscribe('service.log', (dataArr, dataObj) => { if (dataArr.argsDict.level == 'debug') { diff --git a/ui/src/locales/en-GB.json b/ui/src/locales/en-GB.json index 9395c05df..67ab9a110 100644 --- a/ui/src/locales/en-GB.json +++ b/ui/src/locales/en-GB.json @@ -193,6 +193,8 @@ "Clear":"Clear", "No matching country":"No matching country", "Scene Released Date":"Scene Released Date", + "Available Scene Count":"Available Scene Count", + "Scene Count":"Scene Count", "Cast":"Cast", "Allows searching a variety of attributes such as: Possible Aka actors, Cup Size, Eye/Hair Color, Has Tattoo, Has Piercing, Breast Type, Nationailty, Ethnicity, Aka, Has Images":"Allows searching a variety of attributes such as: Possible Aka actors, Cup Size, Eye/Hair Color, Has Tattoo, Has Piercing, Breast Type, Nationailty, Ethnicity, Aka, Has Images", "New Aka Group. Select 2 or more actors in the Cast filter":"New Aka Group. Select 2 or more actors in the Cast filter", @@ -202,5 +204,6 @@ "No matching attributes":"No matching attributes", "Only required when troubleshooting search issues, this will enable a Tab in the Scene Details to display what search fields exist and their values for a scene":"Only required when troubleshooting search issues, this will enable a Tab in the Scene Details to display what search fields exist and their values for a scene", "Scene Id Required": "Scene Id Required", + "Occasionaly test uploading your export bundles. Browser memory constraints may cause problems restoring large exports. Use this function to test if your browser can load an export.": "Occasionaly test uploading your export bundles. Browser memory constraints may cause problems restoring large exports. Use this function to test if your browser can load an export.", "Go": "Go" } diff --git a/ui/src/store/actorList.js b/ui/src/store/actorList.js index 8334f09d3..18779cddf 100644 --- a/ui/src/store/actorList.js +++ b/ui/src/store/actorList.js @@ -161,13 +161,14 @@ const actions = { .json() state.isLoading = false + state.filters.jumpTo = "" // clear the jumpto value now that we have the data if (iOffset === 0) { commit('setActors', []) } commit('setActors', state.actors=data.actors) - state.offset = iOffset + state.limit + state.offset = data.offset + state.limit state.total = data.results } } diff --git a/ui/src/store/optionsWeb.js b/ui/src/store/optionsWeb.js index 6aa91a99a..a1cfb1b5c 100644 --- a/ui/src/store/optionsWeb.js +++ b/ui/src/store/optionsWeb.js @@ -15,6 +15,9 @@ const state = { showHspFile: true, showSubtitlesFile: true, sceneTrailerlist: true, + updateCheck: true, + isAvailOpacity: 40, + showScriptHeatmap: false, updateCheck: true } } @@ -39,7 +42,9 @@ const actions = { state.web.showHspFile = data.config.web.showHspFile state.web.showSubtitlesFile = data.config.web.showSubtitlesFile state.web.sceneTrailerlist = data.config.web.sceneTrailerlist + state.web.showScriptHeatmap = data.config.web.showScriptHeatmap state.web.updateCheck = data.config.web.updateCheck + state.web.isAvailOpacity = data.config.web.isAvailOpacity state.loading = false }) }, @@ -60,7 +65,9 @@ const actions = { state.web.showHspFile = data.showHspFile state.web.showSubtitlesFile = data.showSubtitlesFile state.web.sceneTrailerlist = data.sceneTrailerlist + state.web.showScriptHeatmap = data.showScriptHeatmap state.web.updateCheck = data.updateCheck + state.web.isAvailOpacity = data.isAvailOpacity state.loading = false }) } diff --git a/ui/src/views/actors/ActorCard.vue b/ui/src/views/actors/ActorCard.vue index 8bd1ffdd6..fbc716875 100644 --- a/ui/src/views/actors/ActorCard.vue +++ b/ui/src/views/actors/ActorCard.vue @@ -2,7 +2,7 @@
@@ -69,6 +69,12 @@ export default { } }, computed: { + isAvailOpactiy () { + if (this.$store.state.optionsWeb.web.isAvailOpacity == undefined) { + return .4 + } + return this.$store.state.optionsWeb.web.isAvailOpacity / 100 + }, }, methods: { getImageURL (u) { diff --git a/ui/src/views/actors/Filters.vue b/ui/src/views/actors/Filters.vue index 17eab5814..342dd5cc9 100644 --- a/ui/src/views/actors/Filters.vue +++ b/ui/src/views/actors/Filters.vue @@ -41,6 +41,8 @@ + +
diff --git a/ui/src/views/actors/List.vue b/ui/src/views/actors/List.vue index 84eb42704..473e4ec1a 100644 --- a/ui/src/views/actors/List.vue +++ b/ui/src/views/actors/List.vue @@ -256,6 +256,9 @@ export default { if (this.$store.state.overlay.actordetails.show){ return } + if (this.$store.state.overlay.details.show){ + return + } if (this.current * this.limit >= this.total) { this.current = 1 } else { @@ -267,6 +270,9 @@ export default { if (this.$store.state.overlay.actordetails.show){ return } + if (this.$store.state.overlay.details.show){ + return + } if (this.current > 1) { this.current -= 1 } else { diff --git a/ui/src/views/options/sections/InterfaceWeb.vue b/ui/src/views/options/sections/InterfaceWeb.vue index 9c8868a5a..83f86eeff 100644 --- a/ui/src/views/options/sections/InterfaceWeb.vue +++ b/ui/src/views/options/sections/InterfaceWeb.vue @@ -75,6 +75,18 @@ show subtitles File button + + + show Script Heatmap + + + +
+
+ +
+
+
@@ -168,6 +180,14 @@ export default { this.$store.state.optionsWeb.web.sceneEdit = value } }, + ScriptHeatmap: { + get () { + return this.$store.state.optionsWeb.web.showScriptHeatmap + }, + set (value) { + this.$store.state.optionsWeb.web.showScriptHeatmap = value + } + }, updateCheck: { get () { return this.$store.state.optionsWeb.web.updateCheck @@ -208,9 +228,20 @@ export default { this.$store.state.optionsWeb.web.showSubtitlesFile = value } }, + isAvailOpacity: { + get () { + if (this.$store.state.optionsWeb.web.isAvailOpacity == undefined) { + return 40 + } + return this.$store.state.optionsWeb.web.isAvailOpacity + }, + set (value) { + this.$store.state.optionsWeb.web.isAvailOpacity = value + } + }, isLoading: function () { return this.$store.state.optionsWeb.loading - } + } } } diff --git a/ui/src/views/options/sections/OptionsSceneCreate.vue b/ui/src/views/options/sections/OptionsSceneCreate.vue index 91f4519fa..9c2f0b2af 100644 --- a/ui/src/views/options/sections/OptionsSceneCreate.vue +++ b/ui/src/views/options/sections/OptionsSceneCreate.vue @@ -6,13 +6,14 @@ + - {{$t('Go')}} + R18.dev scraper requires FANZA content ID, e.g. 84vrkm00139
diff --git a/ui/src/views/options/sections/OptionsSceneDataImportExport.vue b/ui/src/views/options/sections/OptionsSceneDataImportExport.vue index 96ac36c12..d4a879f92 100644 --- a/ui/src/views/options/sections/OptionsSceneDataImportExport.vue +++ b/ui/src/views/options/sections/OptionsSceneDataImportExport.vue @@ -160,8 +160,8 @@

Overwrite existing data

- - + @@ -176,14 +176,27 @@ - - - Export + + + + + + Test + + + {{ progressMsg }} + + + +
@@ -217,6 +230,8 @@ export default { currentPlaylist: '0', myUrl: '/download/xbvr-content-bundle.json', file: null, + testfile: null, + progressMsg:"", uploadData: '', activeTab: 0, activeSubTab: 0 @@ -236,13 +251,46 @@ export default { watch: { // when a file is selected, then this will fire the upload process file: function (o, n) { - if (this.file != null) { - const reader = new FileReader() - reader.onload = (event) => { - this.uploadData = JSON.stringify(JSON.parse(event.target.result)) - this.restoreContent() + try { + if (this.file != null) { + const reader = new FileReader() + reader.onload = (event) => { + try { + this.uploadData = JSON.stringify(JSON.parse(event.target.result)) + this.restoreContent() + } catch (error) { + this.$buefy.toast.open({message: `Error: ${error.message}`, type: 'is-danger', duration: 30000}) + } + } + reader.readAsText(this.file) } - reader.readAsText(this.file) + } catch (error) { + this.$buefy.toast.open({message: `Error: ${error.message}`, type: 'is-danger', duration: 30000}) + } + }, + testfile: function (o, n) { + try { + this.$buefy.toast.open({message: `Loading: ` + this.testfile.name, type: 'is-primary', duration: 30000}) + if (this.testfile != null) { + this.progressMsg = "Uploading " + this.testfile.name + const reader = new FileReader() + reader.onload = (event) => { + try { + this.progressMsg = "File uploaded, converting to Json " + this.testfile.name + this.uploadData = JSON.stringify(JSON.parse(event.target.result)) + this.progressMsg = "" + this.$buefy.toast.open({message: `Success Loading: ` + this.testfile.name, type: 'is-success', duration: 5000}) + } catch (error) { + this.progressMsg = "Error: " + error.message + this.$buefy.toast.open({message: `Error: ${error.message}`, type: 'is-danger', duration: 30000}) + } + + } + reader.readAsText(this.testfile) + } + } catch (error) { + this.progressMsg = "Error: " + error.message + this.$buefy.toast.open({message: `Error: ${error.message}`, type: 'is-danger', duration: 30000}) } } }, diff --git a/ui/src/views/scenes/EditScene.vue b/ui/src/views/scenes/EditScene.vue index be05084a5..9f317be15 100644 --- a/ui/src/views/scenes/EditScene.vue +++ b/ui/src/views/scenes/EditScene.vue @@ -205,6 +205,7 @@ export default { this.scene.images = JSON.stringify(images) this.scene.cover_url = this.scene.covers[0] this.scene.filenames_arr = JSON.stringify(this.scene.files) + this.scene.duration = String(this.scene.duration) // force to a string, if no change the UI sends an int, otherwise a string, nust be constant ky.post(`/api/scene/edit/${this.scene.id}`, { json: { ...this.scene } }) diff --git a/ui/src/views/scenes/SceneCard.vue b/ui/src/views/scenes/SceneCard.vue index 4b4066670..338784283 100644 --- a/ui/src/views/scenes/SceneCard.vue +++ b/ui/src/views/scenes/SceneCard.vue @@ -2,7 +2,7 @@
@@ -41,6 +41,11 @@ {{item.duration}}m
+
+
+ +
+
@@ -129,7 +134,13 @@ export default { } }) return count - } + }, + isAvailOpactiy () { + if (this.$store.state.optionsWeb.web.isAvailOpacity == undefined) { + return .4 + } + return this.$store.state.optionsWeb.web.isAvailOpacity / 100 + }, }, methods: { getImageURL (u) { @@ -153,6 +164,12 @@ export default { this.$store.commit('overlay/showDetails', { scene: scene }) } this.$store.commit('overlay/hideActorDetails') + }, + getHeatmapURL (fileId) { + return `/api/dms/heatmap/${fileId}` + }, + getFunscript () { + return this.item.file !== null && this.item.file.find(a => a.type === 'script' && a.has_heatmap); } } } @@ -204,6 +221,8 @@ export default { .align-bottom-left { align-items: flex-end; justify-content: flex-end; + flex-wrap: wrap; + flex-direction: column } .bbox:after { @@ -223,4 +242,16 @@ export default { overflow: hidden; text-overflow: ellipsis; } + +.heatmapFunscript { + width: auto; +} + +.heatmapFunscript img { + border: 1px #888 solid; + width: 100%; + height: 15px; + border-radius: 0.25rem; +} + diff --git a/yarn.lock b/yarn.lock index 2daceae2d..b27f97adf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1289,10 +1289,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== +"@eslint/eslintrc@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" + integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1304,10 +1304,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.48.0": - version "8.48.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" - integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== +"@eslint/js@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" + integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== "@fortawesome/fontawesome-common-types@^0.2.36": version "0.2.36" @@ -1338,12 +1338,12 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" + "@humanwhocodes/object-schema" "^2.0.1" debug "^4.1.1" minimatch "^3.0.5" @@ -1352,10 +1352,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" @@ -1418,10 +1418,10 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@mdi/font@7.2.96": - version "7.2.96" - resolved "https://registry.yarnpkg.com/@mdi/font/-/font-7.2.96.tgz#af800d9fe3b424f85ad45e9baa755bd003ab4986" - integrity sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w== +"@mdi/font@7.3.67": + version "7.3.67" + resolved "https://registry.yarnpkg.com/@mdi/font/-/font-7.3.67.tgz#faa344a04c9d02f608c891a01134084febeb42db" + integrity sha512-SWxvzRbUQRfewlIV+OF4/YF4DkeTjMWoT8Hh9yeU/5UBVdJZj9Uf4a9+cXjknSIhIaMxZ/4N1O/s7ojApOOGjg== "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" @@ -1694,6 +1694,11 @@ dependencies: "@types/node" "*" +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@videojs/http-streaming@2.16.2": version "2.16.2" resolved "https://registry.yarnpkg.com/@videojs/http-streaming/-/http-streaming-2.16.2.tgz#a9be925b4e368a41dbd67d49c4f566715169b84b" @@ -1967,10 +1972,10 @@ semver "^7.3.4" strip-ansi "^6.0.0" -"@vue/compiler-sfc@2.7.14": - version "2.7.14" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz#3446fd2fbb670d709277fc3ffa88efc5e10284fd" - integrity sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA== +"@vue/compiler-sfc@2.7.15": + version "2.7.15" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.15.tgz#62135fb2f69559fc723fd9c56b8e8b0ac7864a0b" + integrity sha512-FCvIEevPmgCgqFBH7wD+3B97y7u7oj/Wr69zADBf403Tui377bThTjBvekaZvlRr4IwUAu3M6hYZeULZFJbdYg== dependencies: "@babel/parser" "^7.18.4" postcss "^8.4.14" @@ -2493,15 +2498,15 @@ array-includes@^3.1.4: get-intrinsic "^1.1.1" is-string "^1.0.7" -array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-union@^2.1.0: @@ -2509,16 +2514,16 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz#bc229aef98f6bd0533a2bc61ff95209875526c9b" - integrity sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw== +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.1" array.prototype.flat@^1.2.5: version "1.3.0" @@ -2530,34 +2535,35 @@ array.prototype.flat@^1.2.5: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== dependencies: array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" @@ -2831,6 +2837,15 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3259,9 +3274,9 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: which "^2.0.1" crypto-js@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.0.0.tgz#2904ab2677a9d042856a2ea2ef80de92e4a36dcc" - integrity sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg== + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== css-declaration-sorter@^6.3.0: version "6.3.0" @@ -3466,6 +3481,15 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -3743,65 +3767,26 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19 string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" -es-abstract@^1.20.4: - version "1.21.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" - integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.4" - is-array-buffer "^3.0.1" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.2" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" - -es-abstract@^1.21.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== dependencies: array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" + arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.5" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" has-property-descriptors "^1.0.0" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" internal-slot "^1.0.5" is-array-buffer "^3.0.2" is-callable "^1.2.7" @@ -3809,23 +3794,23 @@ es-abstract@^1.21.2: is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.12" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.1" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" typed-array-buffer "^1.0.0" typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" + which-typed-array "^1.1.13" es-module-lexer@^0.9.0: version "0.9.3" @@ -3929,14 +3914,14 @@ eslint-import-resolver-node@^0.3.6: debug "^3.2.7" resolve "^1.20.0" -eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" eslint-module-utils@^2.7.3: version "2.7.3" @@ -3969,26 +3954,26 @@ eslint-plugin-es@^4.1.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@2.28.1: - version "2.28.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" - integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== +eslint-plugin-import@2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" + integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== dependencies: - array-includes "^3.1.6" - array.prototype.findlastindex "^1.2.2" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" + eslint-import-resolver-node "^0.3.9" eslint-module-utils "^2.8.0" - has "^1.0.3" - is-core-module "^2.13.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.6" - object.groupby "^1.0.0" - object.values "^1.1.6" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" semver "^6.3.1" tsconfig-paths "^3.14.2" @@ -4052,10 +4037,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.17.0: - version "9.17.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz#4501547373f246547083482838b4c8f4b28e5932" - integrity sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ== +eslint-plugin-vue@9.18.1: + version "9.18.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz#73cf29df7450ce5913296465f8d1dc545344920c" + integrity sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" natural-compare "^1.4.0" @@ -4144,18 +4129,19 @@ eslint-webpack-plugin@^3.1.0: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@8.48.0: - version "8.48.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" - integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== +eslint@8.53.0: + version "8.53.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" + integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.48.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint/eslintrc" "^2.1.3" + "@eslint/js" "8.53.0" + "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -4548,6 +4534,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" @@ -4558,6 +4549,16 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -4610,6 +4611,16 @@ get-intrinsic@^1.2.1: has-proto "^1.0.1" has-symbols "^1.0.3" +get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -4823,6 +4834,13 @@ hash-sum@^2.0.0: resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -5042,7 +5060,7 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" -internal-slot@^1.0.4, internal-slot@^1.0.5: +internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -5125,13 +5143,6 @@ is-ci@^1.0.10: dependencies: ci-info "^1.5.0" -is-core-module@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - is-core-module@^2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" @@ -5139,6 +5150,13 @@ is-core-module@^2.13.0: dependencies: has "^1.0.3" +is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-core-module@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887" @@ -5296,6 +5314,13 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" +is-typed-array@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -6069,10 +6094,10 @@ object-inspect@^1.12.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-inspect@^1.12.2, object-inspect@^1.12.3: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-inspect@^1.9.0: version "1.10.2" @@ -6104,23 +6129,23 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== +object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -object.groupby@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.0.tgz#cb29259cf90f37e7bac6437686c1ea8c916d12a9" - integrity sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw== +object.groupby@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - es-abstract "^1.21.2" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" object.values@^1.1.5: @@ -6132,14 +6157,14 @@ object.values@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== +object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -6935,14 +6960,14 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - functions-have-names "^1.2.3" + set-function-name "^2.0.0" regexpp@^3.0.0: version "3.1.0" @@ -7041,7 +7066,7 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.14.2: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.3.0: +resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -7050,6 +7075,15 @@ resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.3.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -7104,13 +7138,13 @@ rxjs@^7.0.0: dependencies: tslib "^2.1.0" -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" isarray "^2.0.5" @@ -7152,10 +7186,10 @@ sass-loader@13.3.2: dependencies: neo-async "^2.6.2" -sass@1.66.1: - version "1.66.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" - integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== +sass@1.69.5: + version "1.69.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde" + integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -7293,6 +7327,25 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -7529,14 +7582,14 @@ string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string.prototype.trimend@^1.0.5: version "1.0.5" @@ -7547,14 +7600,14 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string.prototype.trimstart@^1.0.5: version "1.0.5" @@ -7565,14 +7618,14 @@ string.prototype.trimstart@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -8238,10 +8291,10 @@ vue-style-loader@^4.1.0, vue-style-loader@^4.1.3: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@2.7.14: - version "2.7.14" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz#4545b7dfb88090744c1577ae5ac3f964e61634b1" - integrity sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ== +vue-template-compiler@2.7.15: + version "2.7.15" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz#ec88ba8ceafe0f17a528b89c57e01e02da92b0de" + integrity sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og== dependencies: de-indent "^1.0.2" he "^1.2.0" @@ -8251,12 +8304,12 @@ vue-template-es2015-compiler@^1.9.0: resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== -vue@2.7.14: - version "2.7.14" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.7.14.tgz#3743dcd248fd3a34d421ae456b864a0246bafb17" - integrity sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ== +vue@2.7.15: + version "2.7.15" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.7.15.tgz#94cd34e6e9f22cd2d35a02143f96a5beac1c1f54" + integrity sha512-a29fsXd2G0KMRqIFTpRgpSbWaNBK3lpCTOLuGLEDnlHWdjB8fwl6zyYZ8xCrqkJdatwZb4mGHiEfJjnw0Q6AwQ== dependencies: - "@vue/compiler-sfc" "2.7.14" + "@vue/compiler-sfc" "2.7.15" csstype "^3.1.0" vue@^2.3.3, vue@^2.6.11: @@ -8399,10 +8452,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.88.2: - version "5.88.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" - integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== +webpack@5.89.0: + version "5.89.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -8521,29 +8574,17 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.10: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +which-typed-array@^1.1.11, which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== dependencies: available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.4" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"