From a075b181a2504b15007a3aff568519a78481ac3e Mon Sep 17 00:00:00 2001 From: Sergey Stepanov Date: Mon, 18 Nov 2024 21:36:25 +0300 Subject: [PATCH 1/3] Update dependencies --- go.mod | 20 ++++++++++---------- go.sum | 41 ++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index 2855013b4..024db84b2 100644 --- a/go.mod +++ b/go.mod @@ -5,21 +5,21 @@ go 1.22 require ( github.com/VictoriaMetrics/metrics v1.35.1 github.com/cavaliergopher/grab/v3 v3.0.1 - github.com/fsnotify/fsnotify v1.7.0 + github.com/fsnotify/fsnotify v1.8.0 github.com/goccy/go-json v0.10.3 github.com/gofrs/flock v0.12.1 github.com/gorilla/websocket v1.5.3 github.com/knadh/koanf/maps v0.1.1 - github.com/knadh/koanf/v2 v2.1.1 - github.com/minio/minio-go/v7 v7.0.78 + github.com/knadh/koanf/v2 v2.1.2 + github.com/minio/minio-go/v7 v7.0.80 github.com/pion/ice/v4 v4.0.2 github.com/pion/interceptor v0.1.37 github.com/pion/logging v0.2.2 - github.com/pion/webrtc/v4 v4.0.1 + github.com/pion/webrtc/v4 v4.0.2 github.com/rs/xid v1.6.0 github.com/rs/zerolog v1.33.0 github.com/veandco/go-sdl2 v0.4.40 - golang.org/x/crypto v0.28.0 + golang.org/x/crypto v0.29.0 golang.org/x/image v0.19.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -30,14 +30,14 @@ require ( github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/google/uuid v1.6.0 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pion/datachannel v1.5.9 // indirect - github.com/pion/dtls/v3 v3.0.3 // indirect + github.com/pion/dtls/v3 v3.0.4 // indirect github.com/pion/mdns/v2 v2.0.7 // indirect github.com/pion/randutil v0.1.0 // indirect github.com/pion/rtcp v1.2.14 // indirect @@ -52,7 +52,7 @@ require ( github.com/valyala/fastrand v1.1.0 // indirect github.com/valyala/histogram v1.2.0 // indirect github.com/wlynxg/anet v0.0.5 // indirect - golang.org/x/net v0.30.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect ) diff --git a/go.sum b/go.sum index ec2913c66..a1d66dbe5 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= @@ -26,12 +26,12 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= -github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,16 +44,16 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.78 h1:LqW2zy52fxnI4gg8C2oZviTaKHcBV36scS+RzJnxUFs= -github.com/minio/minio-go/v7 v7.0.78/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= +github.com/minio/minio-go/v7 v7.0.80 h1:2mdUHXEykRdY/BigLt3Iuu1otL0JTogT0Nmltg0wujk= +github.com/minio/minio-go/v7 v7.0.80/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pion/datachannel v1.5.9 h1:LpIWAOYPyDrXtU+BW7X0Yt/vGtYxtXQ8ql7dFfYUVZA= github.com/pion/datachannel v1.5.9/go.mod h1:kDUuk4CU4Uxp82NH4LQZbISULkX/HtzKa4P7ldf9izE= -github.com/pion/dtls/v3 v3.0.3 h1:j5ajZbQwff7Z8k3pE3S+rQ4STvKvXUdKsi/07ka+OWM= -github.com/pion/dtls/v3 v3.0.3/go.mod h1:weOTUyIV4z0bQaVzKe8kpaP17+us3yAuiQsEAG1STMU= +github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U= +github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg= github.com/pion/ice/v4 v4.0.2 h1:1JhBRX8iQLi0+TfcavTjPjI6GO41MFn4CeTBX+Y9h5s= github.com/pion/ice/v4 v4.0.2/go.mod h1:DCdqyzgtsDNYN6/3U8044j3U7qsJ9KFJC92VnOWHvXg= github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= @@ -80,8 +80,8 @@ github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1 github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM= github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA= -github.com/pion/webrtc/v4 v4.0.1 h1:6Unwc6JzoTsjxetcAIoWH81RUM4K5dBc1BbJGcF9WVE= -github.com/pion/webrtc/v4 v4.0.1/go.mod h1:SfNn8CcFxR6OUVjLXVslAQ3a3994JhyE3Hw1jAuqEto= +github.com/pion/webrtc/v4 v4.0.2 h1:fBwm5/hqSUybrCWl0DDBSTDrpbkcgkqpeLmXw9CsBQA= +github.com/pion/webrtc/v4 v4.0.2/go.mod h1:moylBT2A4dNoEaYBCdV1nThM3TLwRHzWszIG+eSPaqQ= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -109,20 +109,19 @@ github.com/veandco/go-sdl2 v0.4.40 h1:fZv6wC3zz1Xt167P09gazawnpa0KY5LM7JAvKpX9d/ github.com/veandco/go-sdl2 v0.4.40/go.mod h1:OROqMhHD43nT4/i9crJukyVecjPNYYuCofep6SNiAjY= github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/image v0.19.0 h1:D9FX4QWkLfkeqaC62SonffIIuYdOk/UE2XKUBgRIBIQ= golang.org/x/image v0.19.0/go.mod h1:y0zrRqlQRWQ5PXaYCOMLTW2fpsxZ8Qh9I/ohnInJEys= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From c304a6aad4f1400ce219bce2979ad61d6ad0d9d4 Mon Sep 17 00:00:00 2001 From: Sergey Stepanov Date: Tue, 26 Nov 2024 18:08:14 +0300 Subject: [PATCH 2/3] Add new saveStateFs config param Used when you need a copy of FS for new game sessions (i.e. DOSBox uniqueSaveDir=true). --- pkg/config/config.yaml | 5 +++ pkg/config/emulator.go | 1 + pkg/games/library.go | 42 ++++++++++++------ pkg/os/os.go | 12 ++++++ pkg/worker/caged/libretro/frontend.go | 43 ++++++++++++++++++- .../caged/libretro/nanoarch/nanoarch.go | 1 + 6 files changed, 89 insertions(+), 15 deletions(-) diff --git a/pkg/config/config.yaml b/pkg/config/config.yaml index e02f8c203..fdcba87b3 100644 --- a/pkg/config/config.yaml +++ b/pkg/config/config.yaml @@ -28,6 +28,8 @@ library: ignored: - neogeo - pgm + # DOSBox filesystem state + - .pure # an explicit list of supported file extensions # which overrides Libretro emulator ROMs configs supported: @@ -216,6 +218,8 @@ emulator: # - skip_same_thread_save -- skip thread lock save (used with PPSSPP). # - uniqueSaveDir (bool) -- needed only for cores (like DosBox) that persist their state into one shared file. # This will allow for concurrent reading and saving of current states. + # - saveStateFs (string) -- the name of the file that will be initially copied into the save folder. + # All * symbols will be replaced to the name of the ROM. list: gba: lib: mgba_libretro @@ -281,6 +285,7 @@ emulator: folder: dos kbMouseSupport: true nonBlockingSave: true + saveStateFs: "*.pure.zip" hid: 0: [ 257, 513 ] 1: [ 257, 513 ] diff --git a/pkg/config/emulator.go b/pkg/config/emulator.go index 2fc71fe2d..21c5b2add 100644 --- a/pkg/config/emulator.go +++ b/pkg/config/emulator.go @@ -54,6 +54,7 @@ type LibretroCoreConfig struct { Options map[string]string Options4rom map[string]map[string]string // <(^_^)> Roms []string + SaveStateFs string Scale float64 UniqueSaveDir bool UsesLibCo bool diff --git a/pkg/games/library.go b/pkg/games/library.go index 80572a988..5586f4642 100644 --- a/pkg/games/library.go +++ b/pkg/games/library.go @@ -21,7 +21,7 @@ type libConf struct { aliasFile string path string supported map[string]struct{} - ignored map[string]struct{} + ignored []string verbose bool watchMode bool sessionPath string @@ -98,7 +98,7 @@ func NewLib(conf config.Library, emu WithEmulatorInfo, log *logger.Logger) GameL aliasFile: conf.AliasFile, path: dir, supported: toMap(conf.Supported), - ignored: toMap(conf.Ignored), + ignored: conf.Ignored, verbose: conf.Verbose, watchMode: conf.WatchMode, sessionPath: emu.SessionStoragePath(), @@ -207,22 +207,36 @@ func (lib *library) Scan() { return err } - if info != nil && !info.IsDir() && lib.isExtAllowed(path) { - meta := getMetadata(path, dir) + if info == nil || info.IsDir() || !lib.isExtAllowed(path) { + return nil + } - meta.System = lib.emuConf.GetEmulator(meta.Type, meta.Path) + meta := metadata(path, dir) + meta.System = lib.emuConf.GetEmulator(meta.Type, meta.Path) - if aliases != nil { - k, ok := aliases[meta.Name] - if ok { - meta.Alias = k - } + if aliases != nil { + if k, ok := aliases[meta.Name]; ok { + meta.Alias = k + } + } + + ignored := false + for _, k := range lib.config.ignored { + if meta.Name == k { + ignored = true + break } - if _, ok := lib.config.ignored[meta.Name]; !ok { - games = append(games, meta) + if len(k) > 0 && k[0] == '.' && strings.Contains(meta.Name, k) { + ignored = true + break } } + + if !ignored { + games = append(games, meta) + } + return nil }) @@ -322,8 +336,8 @@ func (lib *library) isExtAllowed(path string) bool { return ok } -// getMetadata returns game info from a path -func getMetadata(path string, basePath string) GameMetadata { +// metadata returns game info from a path +func metadata(path string, basePath string) GameMetadata { name := filepath.Base(path) ext := filepath.Ext(name) relPath, _ := filepath.Rel(basePath, path) diff --git a/pkg/os/os.go b/pkg/os/os.go index eb7c5f473..2887cecf0 100644 --- a/pkg/os/os.go +++ b/pkg/os/os.go @@ -51,6 +51,18 @@ func GetUserHome() (string, error) { return me.HomeDir, nil } +func CopyFile(from string, to string) error { + bytesRead, err := os.ReadFile(from) + if err != nil { + return err + } + err = os.WriteFile(to, bytesRead, 0755) + if err != nil { + return err + } + return nil +} + func WriteFile(name string, data []byte, perm os.FileMode) error { return os.WriteFile(name, data, perm) } diff --git a/pkg/worker/caged/libretro/frontend.go b/pkg/worker/caged/libretro/frontend.go index 60792d70e..057d7e217 100644 --- a/pkg/worker/caged/libretro/frontend.go +++ b/pkg/worker/caged/libretro/frontend.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "path/filepath" + "strings" "sync" "time" "unsafe" @@ -67,6 +68,7 @@ type Frontend struct { DisableCanvasPool bool SaveOnClose bool UniqueSaveDir bool + SaveStateFs string } type Device byte @@ -154,6 +156,7 @@ func (f *Frontend) LoadCore(emu string) { KbMouseSupport: conf.KbMouseSupport, } f.mu.Lock() + f.SaveStateFs = conf.SaveStateFs if conf.UniqueSaveDir { f.UniqueSaveDir = true f.nano.SetSaveDirSuffix(f.storage.MainPath()) @@ -287,6 +290,13 @@ func (f *Frontend) Start() { } } +func (f *Frontend) LoadGame(path string) error { + if f.UniqueSaveDir { + f.copyFsMaybe(path) + } + return f.nano.LoadGame(path) +} + func (f *Frontend) AspectRatio() float32 { return f.nano.AspectRatio() } func (f *Frontend) AudioSampleRate() int { return f.nano.AudioSampleRate() } func (f *Frontend) FPS() int { return f.nano.VideoFramerate() } @@ -296,7 +306,6 @@ func (f *Frontend) HasSave() bool { return os.Exists(f.HashPath( func (f *Frontend) HashPath() string { return f.storage.GetSavePath() } func (f *Frontend) IsPortrait() bool { return f.nano.IsPortrait() } func (f *Frontend) KbMouseSupport() bool { return f.nano.KbMouseSupport() } -func (f *Frontend) LoadGame(path string) error { return f.nano.LoadGame(path) } func (f *Frontend) PixFormat() uint32 { return f.nano.Video.PixFmt.C } func (f *Frontend) RestoreGameState() error { return f.Load() } func (f *Frontend) Rotation() uint { return f.nano.Rot } @@ -349,6 +358,9 @@ func (f *Frontend) Close() { } } + f.UniqueSaveDir = false + f.SaveStateFs = "" + f.mui.Unlock() f.log.Debug().Msgf("frontend closed") } @@ -420,3 +432,32 @@ func (f *Frontend) autosave(periodSec int) { } } } + +func (f *Frontend) copyFsMaybe(path string) { + if f.SaveStateFs == "" { + return + } + + fileName := f.SaveStateFs + hasPlaceholder := strings.HasPrefix(f.SaveStateFs, "*") + if hasPlaceholder { + game := strings.TrimSuffix(filepath.Base(path), filepath.Ext(path)) + fileName = strings.Replace(f.SaveStateFs, "*", game, 1) + } + + fullPath := filepath.Join(f.nano.SaveDir(), fileName) + + if os.Exists(fullPath) { + return + } + + storePath := filepath.Dir(path) + fsPath := filepath.Join(storePath, fileName) + if os.Exists(fsPath) { + if err := os.CopyFile(fsPath, fullPath); err != nil { + f.log.Error().Err(err).Msgf("fs copy fail") + } else { + f.log.Debug().Msgf("copied fs %v to %v", fsPath, fullPath) + } + } +} diff --git a/pkg/worker/caged/libretro/nanoarch/nanoarch.go b/pkg/worker/caged/libretro/nanoarch/nanoarch.go index ce0d4b152..4db0dcea9 100644 --- a/pkg/worker/caged/libretro/nanoarch/nanoarch.go +++ b/pkg/worker/caged/libretro/nanoarch/nanoarch.go @@ -157,6 +157,7 @@ func (n *Nanoarch) WaitReady() { <-n.reserved } func (n *Nanoarch) Close() { n.Stopped.Store(true); n.reserved <- struct{}{} } func (n *Nanoarch) SetLogger(log *logger.Logger) { n.log = log } func (n *Nanoarch) SetVideoDebounce(t time.Duration) { n.limiter = NewLimit(t) } +func (n *Nanoarch) SaveDir() string { return C.GoString(n.cSaveDirectory) } func (n *Nanoarch) SetSaveDirSuffix(sx string) { dir := C.GoString(n.cSaveDirectory) + "/" + sx err := os.CheckCreateDir(dir) From 48d9e47c98ad59dc958a20ac3cf97fc8bdc20277 Mon Sep 17 00:00:00 2001 From: Sergey Stepanov Date: Tue, 26 Nov 2024 18:51:02 +0300 Subject: [PATCH 3/3] Update dependencies --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 024db84b2..ccef851da 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/gorilla/websocket v1.5.3 github.com/knadh/koanf/maps v0.1.1 github.com/knadh/koanf/v2 v2.1.2 - github.com/minio/minio-go/v7 v7.0.80 + github.com/minio/minio-go/v7 v7.0.81 github.com/pion/ice/v4 v4.0.2 github.com/pion/interceptor v0.1.37 github.com/pion/logging v0.2.2 @@ -42,7 +42,7 @@ require ( github.com/pion/randutil v0.1.0 // indirect github.com/pion/rtcp v1.2.14 // indirect github.com/pion/rtp v1.8.9 // indirect - github.com/pion/sctp v1.8.33 // indirect + github.com/pion/sctp v1.8.34 // indirect github.com/pion/sdp/v3 v3.0.9 // indirect github.com/pion/srtp/v3 v3.0.4 // indirect github.com/pion/stun/v3 v3.0.0 // indirect diff --git a/go.sum b/go.sum index a1d66dbe5..e56b4db70 100644 --- a/go.sum +++ b/go.sum @@ -44,8 +44,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.80 h1:2mdUHXEykRdY/BigLt3Iuu1otL0JTogT0Nmltg0wujk= -github.com/minio/minio-go/v7 v7.0.80/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= +github.com/minio/minio-go/v7 v7.0.81 h1:SzhMN0TQ6T/xSBu6Nvw3M5M8voM+Ht8RH3hE8S7zxaA= +github.com/minio/minio-go/v7 v7.0.81/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -68,8 +68,8 @@ github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE= github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= github.com/pion/rtp v1.8.9 h1:E2HX740TZKaqdcPmf4pw6ZZuG8u5RlMMt+l3dxeu6Wk= github.com/pion/rtp v1.8.9/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= -github.com/pion/sctp v1.8.33 h1:dSE4wX6uTJBcNm8+YlMg7lw1wqyKHggsP5uKbdj+NZw= -github.com/pion/sctp v1.8.33/go.mod h1:beTnqSzewI53KWoG3nqB282oDMGrhNxBdb+JZnkCwRM= +github.com/pion/sctp v1.8.34 h1:rCuD3m53i0oGxCSp7FLQKvqVx0Nf5AUAHhMRXTTQjBc= +github.com/pion/sctp v1.8.34/go.mod h1:yWkCClkXlzVW7BXfI2PjrUGBwUI0CjXJBkhLt+sdo4U= github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M=