Compare commits

...

7 Commits

Author SHA1 Message Date
WithoutPants
7716c4dd87 Update changelog 2025-11-06 16:55:40 +11:00
WithoutPants
2925325e68 Fix contents not loading in filter sidebar (#6240) 2025-11-06 16:54:53 +11:00
WithoutPants
beee37bc38 Codeberg weblate (#6235)
* Translated using Weblate (Bulgarian)

Currently translated at 25.0% (305 of 1219 strings)

Translation: stash/stash
Translate-URL: https://translate.codeberg.org/projects/stash/stash/bg/

* Translated using Weblate (Dutch)

Currently translated at 77.1% (940 of 1219 strings)

Translation: stash/stash
Translate-URL: https://translate.codeberg.org/projects/stash/stash/nl/

* Translated using Weblate (Turkish)

Currently translated at 95.9% (1170 of 1219 strings)

Translation: stash/stash
Translate-URL: https://translate.codeberg.org/projects/stash/stash/tr/

---------

Co-authored-by: theqwertyqwert <theqwertyqwert@noreply.codeberg.org>
Co-authored-by: callmenoodles <callmenoodles@noreply.codeberg.org>
Co-authored-by: slickdaddy <slickdaddy@noreply.codeberg.org>
2025-11-06 11:07:15 +11:00
WithoutPants
9be0cc3210 Update changelog 2025-11-06 10:46:37 +11:00
WithoutPants
f2a787a2ba Add (hidden) pagination to list results header (#6234) 2025-11-06 10:45:57 +11:00
Gykes
6cace4ff88 Update parser to accept groups (#6228) 2025-11-06 09:53:43 +11:00
DogmaDragon
fa2fd31ac7 Update library section in Configuration.md for clarity (#6232) 2025-11-06 08:24:33 +11:00
10 changed files with 211 additions and 18 deletions

View File

@@ -126,6 +126,7 @@ type mappedSceneScraperConfig struct {
Performers mappedPerformerScraperConfig `yaml:"Performers"`
Studio mappedConfig `yaml:"Studio"`
Movies mappedConfig `yaml:"Movies"`
Groups mappedConfig `yaml:"Groups"`
}
type _mappedSceneScraperConfig mappedSceneScraperConfig
@@ -134,6 +135,7 @@ const (
mappedScraperConfigScenePerformers = "Performers"
mappedScraperConfigSceneStudio = "Studio"
mappedScraperConfigSceneMovies = "Movies"
mappedScraperConfigSceneGroups = "Groups"
)
func (s *mappedSceneScraperConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
@@ -151,11 +153,13 @@ func (s *mappedSceneScraperConfig) UnmarshalYAML(unmarshal func(interface{}) err
thisMap[mappedScraperConfigScenePerformers] = parentMap[mappedScraperConfigScenePerformers]
thisMap[mappedScraperConfigSceneStudio] = parentMap[mappedScraperConfigSceneStudio]
thisMap[mappedScraperConfigSceneMovies] = parentMap[mappedScraperConfigSceneMovies]
thisMap[mappedScraperConfigSceneGroups] = parentMap[mappedScraperConfigSceneGroups]
delete(parentMap, mappedScraperConfigSceneTags)
delete(parentMap, mappedScraperConfigScenePerformers)
delete(parentMap, mappedScraperConfigSceneStudio)
delete(parentMap, mappedScraperConfigSceneMovies)
delete(parentMap, mappedScraperConfigSceneGroups)
// re-unmarshal the sub-fields
yml, err := yaml.Marshal(thisMap)
@@ -1013,6 +1017,7 @@ func (s mappedScraper) processSceneRelationships(ctx context.Context, q mappedQu
sceneTagsMap := sceneScraperConfig.Tags
sceneStudioMap := sceneScraperConfig.Studio
sceneMoviesMap := sceneScraperConfig.Movies
sceneGroupsMap := sceneScraperConfig.Groups
ret.Performers = s.processPerformers(ctx, scenePerformersMap, q)
@@ -1039,7 +1044,12 @@ func (s mappedScraper) processSceneRelationships(ctx context.Context, q mappedQu
ret.Movies = processRelationships[models.ScrapedMovie](ctx, s, sceneMoviesMap, q)
}
return len(ret.Performers) > 0 || len(ret.Tags) > 0 || ret.Studio != nil || len(ret.Movies) > 0
if sceneGroupsMap != nil {
logger.Debug(`Processing scene groups:`)
ret.Groups = processRelationships[models.ScrapedGroup](ctx, s, sceneGroupsMap, q)
}
return len(ret.Performers) > 0 || len(ret.Tags) > 0 || ret.Studio != nil || len(ret.Movies) > 0 || len(ret.Groups) > 0
}
func (s mappedScraper) processPerformers(ctx context.Context, performersMap mappedPerformerScraperConfig, q mappedQuery) []*models.ScrapedPerformer {

View File

@@ -275,6 +275,7 @@ export const SidebarListFilter: React.FC<{
postSelected?: React.ReactNode;
preCandidates?: React.ReactNode;
postCandidates?: React.ReactNode;
onOpen?: () => void;
// used to store open/closed state in SidebarStateContext
sectionID?: string;
}> = ({
@@ -292,6 +293,7 @@ export const SidebarListFilter: React.FC<{
postCandidates,
preSelected,
postSelected,
onOpen,
sectionID,
}) => {
// TODO - sort items?
@@ -344,6 +346,7 @@ export const SidebarListFilter: React.FC<{
{postSelected ? <div className="extra">{postSelected}</div> : null}
</>
}
onOpen={onOpen}
>
{preCandidates ? <div className="extra">{preCandidates}</div> : null}
<CandidateList

View File

@@ -1,6 +1,6 @@
import React from "react";
import { ListFilterModel } from "src/models/list-filter/filter";
import { PaginationIndex } from "../List/Pagination";
import { Pagination, PaginationIndex } from "../List/Pagination";
import { ButtonToolbar } from "react-bootstrap";
import { ListViewOptions } from "../List/ListViewOptions";
import { PageSizeSelector, SortBySelect } from "../List/ListFilter";
@@ -53,6 +53,12 @@ export const ListResultsHeader: React.FC<{
/>
</div>
<div className="pagination-index-container">
<Pagination
currentPage={filter.currentPage}
itemsPerPage={filter.itemsPerPage}
totalItems={totalCount}
onChangePage={(page) => onChangeFilter(filter.changePage(page))}
/>
<PaginationIndex
loading={loading}
itemsPerPage={filter.itemsPerPage}

View File

@@ -1305,7 +1305,7 @@ input[type="range"].zoom-slider {
}
.list-results-header {
align-items: center;
align-items: flex-start;
background-color: $body-bg;
display: flex;
@@ -1327,6 +1327,18 @@ input[type="range"].zoom-slider {
}
}
.list-results-header .pagination-index-container {
display: flex;
flex-direction: column;
gap: 0.5rem;
.pagination {
// hidden by default. Can be shown via css override if needed
display: none;
margin: 0;
}
}
.list-results-header {
gap: 0.25rem;
margin-bottom: 0.5rem;
@@ -1342,7 +1354,7 @@ input[type="range"].zoom-slider {
}
& > div.pagination-index-container {
justify-content: flex-end;
align-items: flex-end;
order: 3;
}
}
@@ -1356,6 +1368,10 @@ input[type="range"].zoom-slider {
margin-left: auto;
margin-right: auto;
}
& > div.pagination-index-container {
align-items: center;
}
}
}

View File

@@ -76,10 +76,18 @@ export const SidebarSection: React.FC<
text: React.ReactNode;
className?: string;
outsideCollapse?: React.ReactNode;
onOpen?: () => void;
// used to store open/closed state in SidebarStateContext
sectionID?: string;
}>
> = ({ className = "", text, outsideCollapse, sectionID = "", children }) => {
> = ({
className = "",
text,
outsideCollapse,
onOpen,
sectionID = "",
children,
}) => {
// this is optional
const contextState = React.useContext(SidebarStateContext);
const openState =
@@ -93,6 +101,12 @@ export const SidebarSection: React.FC<
}
}
useEffect(() => {
if (openState && onOpen) {
onOpen();
}
}, [openState, onOpen]);
const collapseProps: Partial<CollapseProps> = {
mountOnEnter: true,
unmountOnExit: true,

View File

@@ -5,6 +5,11 @@
### 🎨 Improvements
* **[0.29.2]** Returned saved filters button to the top toolbar in the Scene list. ([#6215](https://github.com/stashapp/stash/pull/6215))
* **[0.29.2]** Top pagination can now be optionally shown in the scene list with [custom css](https://github.com/stashapp/stash/pull/6234#issue-3593190476). ([#6234](https://github.com/stashapp/stash/pull/6234))
* **[0.29.2]** Restyled the scene list toolbar based on user feedback. ([#6215](https://github.com/stashapp/stash/pull/6215))
* **[0.29.2]** Sidebar section collapsed state is now saved in the browser history. ([#6217](https://github.com/stashapp/stash/pull/6217))
* **[0.29.2]** Increased the number of pages in pagination dropdown to 1000. ([#6207](https://github.com/stashapp/stash/pull/6207))
* Revamped the scene and marker wall views. ([#5816](https://github.com/stashapp/stash/pull/5816))
* Added zoom functionality to wall views. ([#6011](https://github.com/stashapp/stash/pull/6011))
* Added search term field to the Edit Filter dialog. ([#6082](https://github.com/stashapp/stash/pull/6082))
@@ -28,6 +33,16 @@
* Include IP address in login errors in log. ([#5760](https://github.com/stashapp/stash/pull/5760))
### 🐛 Bug fixes
* **[0.29.3]** Fixed sidebar filter contents not loading. ([#6240](https://github.com/stashapp/stash/pull/6240))
* **[0.29.2]** Fixed Play Random not playing from the current filtered scenes on scene list sub-pages. ([#6202](https://github.com/stashapp/stash/pull/6202))
* **[0.29.2]** Fixed infinite loop in Group Sub-Groups panel. ([#6212](https://github.com/stashapp/stash/pull/6212))
* **[0.29.2]** Page no longer scrolls when selecting criterion for the first time in the Edit Filter dialog. ([#6205](https://github.com/stashapp/stash/pull/6205))
* **[0.29.2]** Zoom slider is no longer shown on mobile devices. ([#6206](https://github.com/stashapp/stash/pull/6206))
* **[0.29.2]** Fixed trailing space sometimes being trimmed from query string when querying. ([#6211](https://github.com/stashapp/stash/pull/6211))
* **[0.29.2]** Page now redirects to list page when deleting an object in a new browser tab. ([#6203](https://github.com/stashapp/stash/pull/6203))
* **[0.29.2]** Related groups can now be scraped when scraping a scene. ([#6228](https://github.com/stashapp/stash/pull/6228))
* **[0.29.2]** Fixed panic when a scraper configuration contains an unknown field. ([#6220](https://github.com/stashapp/stash/pull/6220))
* **[0.29.2]** Fixed panic when using `stash_box_index` input in scrape API calls. ([#6201](https://github.com/stashapp/stash/pull/6201))
* **[0.29.1]** Fixed password with special characters not allowing login. ([#6163](https://github.com/stashapp/stash/pull/6163))
* **[0.29.1]** Fixed layout issues using column direction for image wall. ([#6168](https://github.com/stashapp/stash/pull/6168))
* **[0.29.1]** Fixed layout issues for scene list table. ([#6169](https://github.com/stashapp/stash/pull/6169))

View File

@@ -2,7 +2,13 @@
## Library
This section allows you to add and remove directories from your library list. Files in these directories will be included when scanning. Files that are outside of these directories will be removed when running the Clean task.
This section enables you to add or remove directories that will be discoverable by Stash. The directories you add will be utilized for scanning new files and for updating their locations in Stash database.
You can configure these directories to apply specifically to:
- **Videos**
- **Images**
- **Both**
> **⚠️ Note:** Don't forget to click `Save` after updating these directories!

View File

@@ -314,6 +314,86 @@
"blobs_path": {
"description": "Къде във файловата система да се пазят бинарни данни. Позва се само ако се ползва Файлова система за блоб пазене. ВНИМАНИЕ: промяната ще изисква ръчно местене на съществуващи данни."
}
},
"ui": {
"custom_locales": {
"option_label": "Персонализирана локализация е активирана"
},
"delete_options": {
"description": "Настройки по подразбиране при триене на картини, галерий и сцени.",
"heading": "Изтриване на настройки",
"options": {
"delete_file": "Изтриване на файлове по подразбиране",
"delete_generated_supporting_files": "Изтриване на генерираните поддържащи файлове по подразбиране"
}
},
"desktop_integration": {
"desktop_integration": "Десктоп Интеграция",
"notifications_enabled": "Включване на известяването",
"send_desktop_notifications_for_events": "Изпащане на десктоп известявания за събития",
"skip_opening_browser": "Пропускане на отваряне на браузер",
"skip_opening_browser_on_startup": "Пропускане на автоматично отваряне на броузер по време на стартиране"
},
"detail": {
"compact_expanded_details": {
"description": "Когато е включена, тази настройка ще предосвати разширени детайли запавайки компактна презентация",
"heading": "Компактни разширени детайли"
},
"enable_background_image": {
"description": "Покажи фонова картина на станицата с детайли.",
"heading": "Включи фонова картина"
},
"heading": "Станица с детайли",
"show_all_details": {
"description": "Когато е включена, всичкото съдържание ще бъде показано по подразбиране и всеки детайл ще бъде в собствена колона",
"heading": "Покажи всички детайли"
}
},
"editing": {
"disable_dropdown_create": {
"description": "Премахни възможноста да се създават нови обекти от падащият селектор",
"heading": "Изключи падащо създаване"
},
"heading": "Редактиране",
"max_options_shown": {
"label": "Максимален брой неща който се показват в падащ селектор"
},
"rating_system": {
"star_precision": {
"label": "Точност на звездния рейтинг",
"options": {
"full": "Цели",
"half": "Половинки",
"quarter": "Четвъртинки",
"tenth": "Десетици"
}
},
"type": {
"label": "Тип система за рейтинг",
"options": {
"decimal": "Десетична",
"stars": "Звезди"
}
}
}
},
"funscript_offset": {
"description": "Време за разминаване в милисекунди за пускане на интерактивни скриптове.",
"heading": "Funscript разминаване (ms)"
},
"handy_connection": {
"connect": "Свързване",
"server_offset": {
"heading": "Сървърно разминаване"
},
"status": {
"heading": "Статус на връзка с Handy"
},
"sync": "Синхронизиране"
},
"handy_connection_key": {
"description": "Handy connection key за ползване със интерактивни сцени. Слагането на този ключ ще позволи на Stash да сподели иформация за текущата сцена със handyfeeling.com"
}
}
}
}

View File

@@ -149,7 +149,8 @@
},
"show_results": "Resultaat tonen",
"show_count_results": "{count} resultaten tonen",
"play": "Afspelen"
"play": "Afspelen",
"load_filter": "Laad filter"
},
"actions_name": "Acties",
"age": "Leeftijd",
@@ -498,7 +499,8 @@
"source": "Bron",
"source_options": "{source} Opties",
"sources": "Bronnen",
"strategy": "Strategie"
"strategy": "Strategie",
"skip_multiple_matches": "Sla overeenkomsten met meer dan één resultaat over"
},
"import_from_exported_json": "Import van geëxporteerde JSON in de map metadata. Maakt de bestaande database leeg.",
"incremental_import": "Incrementele import uit een meegeleverde export zip-bestand.",
@@ -528,7 +530,13 @@
"anonymising_database": "Anonimiseer database",
"anonymise_database": "Maakt een kopie van de database naar de backups-map, waarbij alle gevoelige gegevens anoniem worden gemaakt. Deze kan vervolgens aan anderen worden verstrekt voor probleemoplossing en debugging. De originele database wordt niet gewijzigd. De geanonimiseerde database gebruikt de bestandsnaamindeling {filename_format}.",
"anonymise_and_download": "Maakt een geanonimiseerde kopie van de database en downloadt het resulterende bestand.",
"generate_clip_previews_during_scan": "Genereer voorbeelden van Afbeelingsfragmenten"
"generate_clip_previews_during_scan": "Genereer voorbeelden van Afbeelingsfragmenten",
"migrate_blobs": {
"delete_old": "Verwijder oude gegevens"
},
"migrate_scene_screenshots": {
"delete_files": "Verwijder screenshotbestanden"
}
},
"tools": {
"scene_duplicate_checker": "Scène Duplicator Checker",
@@ -547,7 +555,9 @@
"whitespace_chars": "WhiteSpace-tekens",
"whitespace_chars_desc": "Deze tekens worden vervangen door witruimte in de titel"
},
"scene_tools": "Scene gereedschap"
"scene_tools": "Scene gereedschap",
"graphql_playground": "GraphQL speeltuin",
"heading": "Hulpmiddelen"
},
"ui": {
"basic_settings": "Basis instellingen",
@@ -576,7 +586,15 @@
"description": "Verwijder de mogelijkheid om nieuwe objecten te maken uit de dropdown menu",
"heading": "Schakel het maken van dropdowns uit"
},
"heading": "Aanpassen"
"heading": "Aanpassen",
"rating_system": {
"type": {
"options": {
"decimal": "Decimaal",
"stars": "Sterren"
}
}
}
},
"funscript_offset": {
"description": "Time Offset in milliseconden voor het afspelen van interactieve scripts.",
@@ -654,7 +672,9 @@
"continue_playlist_default": {
"description": "Speel de volgende scène in de wachtrij wanneer video is voltooid",
"heading": "Ga Standaard door met de afspeellijst"
}
},
"always_start_from_beginning": "Start video altijd vanaf het begin",
"enable_chromecast": "Chromecast inschakelen"
}
},
"scene_wall": {
@@ -672,7 +692,28 @@
"description": "Diavoorstelling is beschikbaar in galerijen in de muurweergavemodus",
"heading": "Diavoorstellingsvertraging (in seconden)"
},
"title": "Gebruikers interface"
"title": "Gebruikers interface",
"custom_javascript": {
"heading": "Aangepaste JavaScript",
"option_label": "Aangepaste JavaScript ingeschakeld"
},
"custom_locales": {
"heading": "Aangepaste lokalisatie",
"option_label": "Aangepaste lokalisatie ingeschakeld"
},
"detail": {
"enable_background_image": {
"description": "Achtergrondfoto op detailscherm weergeven.",
"heading": "Achtergrondfoto inschakelen"
},
"heading": "Detailscherm",
"show_all_details": {
"heading": "Alle details weergeven"
}
},
"image_wall": {
"margin": "Marge (pixels)"
}
},
"advanced_mode": "Geavanceerde modus"
},

View File

@@ -149,7 +149,8 @@
"play": "Oynat",
"show_results": "Sonuçları göster",
"show_count_results": "{count} sonucu göster",
"load": "Yükle"
"load": "Yükle",
"load_filter": "Filtre yükle"
},
"actions_name": "Eylemler",
"age": "Yaş",
@@ -1021,7 +1022,7 @@
"include_sub_tags": "Alt etiketleri dahil et",
"instagram": "Instagram",
"interactive": "Etkileşimli",
"interactive_speed": "Etkileşim hızı",
"interactive_speed": "Etkileşimli Hız",
"isMissing": "Eksik",
"library": "Kütüphane",
"loading": {
@@ -1036,7 +1037,7 @@
"checksum": "Sağlama Toplamı (checksum)",
"downloaded_from": "İndirildiği Yer",
"hash": "Dosya İmzası (Hash)",
"interactive_speed": "Etkileşim hızı",
"interactive_speed": "Etkileşimli Hız",
"performer_card": {
"age": "{age} {years_old}",
"age_context": "Bu sahnede {age} {years_old}"
@@ -1090,7 +1091,8 @@
"name": "Filtre",
"saved_filters": "Kaydedilmiş filtreler",
"update_filter": "Filtreyi Güncelle",
"edit_filter": "Filtreyi Düzenle"
"edit_filter": "Filtreyi Düzenle",
"search_term": "Arama terimi"
},
"seconds": "Saniye",
"settings": "Ayarlar",
@@ -1135,7 +1137,7 @@
},
"paths": {
"database_filename_empty_for_default": "veritabanı adı (varsayılan için boş bırakın)",
"description": "Sırada porno koleksiyonunuzun hangi dizinde olduğunun, stash veritabanının ve oluşturulan ek dosyaların nereye kaydedileceğinin belirlenmesi var. Bu ayarları sonradan değiştirebilirsiniz.",
"description": "Sırada, porno koleksiyonunuzun nerede bulunacağını ve Stash veritabanının, oluşturulan dosyaların ve önbellek dosyalarının nerede depolanacağını belirlememiz gerekiyor. Bu ayarlar daha sonra gerekirse değiştirilebilir.",
"path_to_generated_directory_empty_for_default": "oluşturulan ek dosyalar için dizin konumu (varsayılan için boş bırakın)",
"set_up_your_paths": "Yollarınızı ayarlayın",
"stash_alert": "Herhangi bir kütüphane konumu seçilmedi. Hiçbir medya Stash'e taranamayacak. Emin misiniz?",