* fix(scraper): prevent nil pointer dereference in scrapeScene
When scrapeScene finds no results, ret remains nil and is passed to
processSceneRelationships, which unconditionally dereferences it at
line 89 (ret.Performers = ...), causing a panic.
Initialize ret to an empty ScrapedScene so processSceneRelationships
always has a valid pointer. This also preserves the intent of #3953:
returning a scene with only relationship fields set when scraped
non-relationship data is absent.
Fixes panic: runtime error: invalid memory address or nil pointer
dereference at pkg/scraper/mapped.go:89 in processSceneRelationships
* Update mapped.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* test(scraper): add relationships-only scene regression test
Signed-off-by: Marco <130363067+dutchdevil-83@users.noreply.github.com>
* test(scraper): restore scene test and add relationships regression
---------
Signed-off-by: Marco <130363067+dutchdevil-83@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix HTTP body leaks, nil pointer panics, and file handle cleanup
* Extract unzipFile loop body into unzipFileEntry helper
The unzipFile function had defer o.Close() and defer i.Close() inside
a for loop, which is a Go antipattern — defers are function-scoped and
wouldn't execute until unzipFile returned, leaving file handles open
across iterations. Extracting the per-file logic into unzipFileEntry
ensures each defer fires when that function returns, at the end of each
loop iteration.
* Implement list view for Studios page
- Add StudioListTable component with columns for logo, name, aliases, rating, scene count, image count, gallery count, performer count, and related studios
- Update StudioList component to use StudioListTable for List display mode
- Add DisplayMode.List to StudioListFilterOptions to enable list view option in UI
* Remove aliases from NameCell in StudioListTable
* Update StudioListTable: conditional image rendering, intl labels, add related_studios key
* Add StudioListTable.scss and import it
---------
Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
* Remove invalid duplicate named objects from test setup
Studios and tags are enforced to have unique names, so it doesn't make sense to allow them in the datalayer tests
* Convert inner joins to left joins when using or sub-filter
The mutateDeleteFiles Apollo cache update evicted the plural list
queries (findScenes/findImages/findGalleries) but not the singular
detail queries, so the "File Info" counter on a scene/image/gallery
detail page stayed stale until a manual refresh.
Co-authored-by: dev-null-life <264850222+dev-null-life@users.noreply.github.com>
The x86_64 and CUDA backend stages still used golang:1.24.3 while go.mod requires Go 1.25, which broke make docker-build under GOTOOLCHAIN=local. Bump both images to golang:1.25.9 to match docker/compiler/Dockerfile and PR #6869.
Verified with: make docker-build
Fixes https://github.com/stashapp/stash/issues/6887
Co-authored-by: KennyG <kennyg@kennyg.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* Fix WebSocket UTF-8 error for non-UTF-8 file paths in subscriptions
Sanitize log messages and job fields (description, subtasks, error)
before sending over WebSocket. File paths with non-UTF-8 characters
caused the browser to close the connection with "Could not decode a
text frame as UTF-8." Invalid bytes are replaced with U+FFFD.
Only the API response layer is affected — underlying stored data is
unchanged.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Replace direct ToValidUTF8 calls to new sanitiseWebsocketString function
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
* Let the stash ID pill shrink in tagger
On very narrow viewports (e.g. mobile), the stash ID pill will
overflow its container. With this PR, it will instead limit itself
to the width of the container and display with an ellipsis if
necessary.
Fixes#6786
* update postmigration to handle deduplicate folders.
* Split post-migration to perform some tasks before the schema migration
* Reparent files and delete duplicate folder if possible
---------
Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>