mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Caption support (#2462)
Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
@@ -365,6 +365,52 @@ func (r *imageRepository) replace(id int, image []byte) error {
|
||||
return err
|
||||
}
|
||||
|
||||
type captionRepository struct {
|
||||
repository
|
||||
}
|
||||
|
||||
func (r *captionRepository) get(id int) ([]*models.SceneCaption, error) {
|
||||
query := fmt.Sprintf("SELECT %s, %s, %s from %s WHERE %s = ?", sceneCaptionCodeColumn, sceneCaptionFilenameColumn, sceneCaptionTypeColumn, r.tableName, r.idColumn)
|
||||
var ret []*models.SceneCaption
|
||||
err := r.queryFunc(query, []interface{}{id}, false, func(rows *sqlx.Rows) error {
|
||||
var captionCode string
|
||||
var captionFilename string
|
||||
var captionType string
|
||||
|
||||
if err := rows.Scan(&captionCode, &captionFilename, &captionType); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
caption := &models.SceneCaption{
|
||||
LanguageCode: captionCode,
|
||||
Filename: captionFilename,
|
||||
CaptionType: captionType,
|
||||
}
|
||||
ret = append(ret, caption)
|
||||
return nil
|
||||
})
|
||||
return ret, err
|
||||
}
|
||||
|
||||
func (r *captionRepository) insert(id int, caption *models.SceneCaption) (sql.Result, error) {
|
||||
stmt := fmt.Sprintf("INSERT INTO %s (%s, %s, %s, %s) VALUES (?, ?, ?, ?)", r.tableName, r.idColumn, sceneCaptionCodeColumn, sceneCaptionFilenameColumn, sceneCaptionTypeColumn)
|
||||
return r.tx.Exec(stmt, id, caption.LanguageCode, caption.Filename, caption.CaptionType)
|
||||
}
|
||||
|
||||
func (r *captionRepository) replace(id int, captions []*models.SceneCaption) error {
|
||||
if err := r.destroy([]int{id}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, caption := range captions {
|
||||
if _, err := r.insert(id, caption); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type stringRepository struct {
|
||||
repository
|
||||
stringColumn string
|
||||
|
||||
@@ -19,6 +19,11 @@ const scenesTagsTable = "scenes_tags"
|
||||
const scenesGalleriesTable = "scenes_galleries"
|
||||
const moviesScenesTable = "movies_scenes"
|
||||
|
||||
const sceneCaptionsTable = "scene_captions"
|
||||
const sceneCaptionCodeColumn = "language_code"
|
||||
const sceneCaptionFilenameColumn = "filename"
|
||||
const sceneCaptionTypeColumn = "caption_type"
|
||||
|
||||
var scenesForPerformerQuery = selectAll(sceneTable) + `
|
||||
LEFT JOIN performers_scenes as performers_join on performers_join.scene_id = scenes.id
|
||||
WHERE performers_join.performer_id = ?
|
||||
@@ -127,6 +132,25 @@ func (qb *sceneQueryBuilder) UpdateFileModTime(id int, modTime models.NullSQLite
|
||||
})
|
||||
}
|
||||
|
||||
func (qb *sceneQueryBuilder) captionRepository() *captionRepository {
|
||||
return &captionRepository{
|
||||
repository: repository{
|
||||
tx: qb.tx,
|
||||
tableName: sceneCaptionsTable,
|
||||
idColumn: sceneIDColumn,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (qb *sceneQueryBuilder) GetCaptions(sceneID int) ([]*models.SceneCaption, error) {
|
||||
return qb.captionRepository().get(sceneID)
|
||||
}
|
||||
|
||||
func (qb *sceneQueryBuilder) UpdateCaptions(sceneID int, captions []*models.SceneCaption) error {
|
||||
return qb.captionRepository().replace(sceneID, captions)
|
||||
|
||||
}
|
||||
|
||||
func (qb *sceneQueryBuilder) IncrementOCounter(id int) (int, error) {
|
||||
_, err := qb.tx.Exec(
|
||||
`UPDATE scenes SET o_counter = o_counter + 1 WHERE scenes.id = ?`,
|
||||
@@ -385,6 +409,8 @@ func (qb *sceneQueryBuilder) makeFilter(sceneFilter *models.SceneFilterType) *fi
|
||||
query.handleCriterion(boolCriterionHandler(sceneFilter.Interactive, "scenes.interactive"))
|
||||
query.handleCriterion(intCriterionHandler(sceneFilter.InteractiveSpeed, "scenes.interactive_speed"))
|
||||
|
||||
query.handleCriterion(sceneCaptionCriterionHandler(qb, sceneFilter.Captions))
|
||||
|
||||
query.handleCriterion(sceneTagsCriterionHandler(qb, sceneFilter.Tags))
|
||||
query.handleCriterion(sceneTagCountCriterionHandler(qb, sceneFilter.TagCount))
|
||||
query.handleCriterion(scenePerformersCriterionHandler(qb, sceneFilter.Performers))
|
||||
@@ -607,6 +633,18 @@ func (qb *sceneQueryBuilder) getMultiCriterionHandlerBuilder(foreignTable, joinT
|
||||
}
|
||||
}
|
||||
|
||||
func sceneCaptionCriterionHandler(qb *sceneQueryBuilder, captions *models.StringCriterionInput) criterionHandlerFunc {
|
||||
h := stringListCriterionHandlerBuilder{
|
||||
joinTable: sceneCaptionsTable,
|
||||
stringColumn: sceneCaptionCodeColumn,
|
||||
addJoinTable: func(f *filterBuilder) {
|
||||
qb.captionRepository().join(f, "", "scenes.id")
|
||||
},
|
||||
}
|
||||
|
||||
return h.handler(captions)
|
||||
}
|
||||
|
||||
func sceneTagsCriterionHandler(qb *sceneQueryBuilder, tags *models.HierarchicalMultiCriterionInput) criterionHandlerFunc {
|
||||
h := joinedHierarchicalMultiCriterionHandlerBuilder{
|
||||
tx: qb.tx,
|
||||
|
||||
Reference in New Issue
Block a user