mirror of
https://github.com/stashapp/stash.git
synced 2026-06-11 07:41:08 -05:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7716c4dd87 | ||
|
|
2925325e68 | ||
|
|
beee37bc38 | ||
|
|
9be0cc3210 | ||
|
|
f2a787a2ba | ||
|
|
6cace4ff88 | ||
|
|
fa2fd31ac7 |
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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?",
|
||||
|
||||
Reference in New Issue
Block a user