Skip to content

Commit

Permalink
Prevent invalid date tag in video file from aborting scan (#836)
Browse files Browse the repository at this point in the history
* Give more context when ffprobe fails
* Suppress JSONTime unmarshal error
* Tidy scan logging
  • Loading branch information
WithoutPants authored Oct 11, 2020
1 parent ca14859 commit 98dda78
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 15 deletions.
6 changes: 3 additions & 3 deletions pkg/ffmpeg/ffprobe.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,15 @@ func NewVideoFile(ffprobePath string, videoPath string) (*VideoFile, error) {

probeJSON := &FFProbeJSON{}
if err := json.Unmarshal(out, probeJSON); err != nil {
return nil, err
return nil, fmt.Errorf("Error unmarshalling video data for <%s>: %s", videoPath, err.Error())
}

return parse(videoPath, probeJSON)
}

func parse(filePath string, probeJSON *FFProbeJSON) (*VideoFile, error) {
if probeJSON == nil {
return nil, fmt.Errorf("failed to get ffprobe json")
return nil, fmt.Errorf("failed to get ffprobe json for <%s>", filePath)
}

result := &VideoFile{}
Expand Down Expand Up @@ -273,7 +273,7 @@ func parse(filePath string, probeJSON *FFProbeJSON) (*VideoFile, error) {
result.Duration = math.Round(duration*100) / 100
fileStat, err := os.Stat(filePath)
if err != nil {
logger.Errorf("Error statting file: %v", err)
logger.Errorf("Error statting file <%s>: %s", filePath, err.Error())
return nil, err
}
result.Size = fileStat.Size()
Expand Down
19 changes: 10 additions & 9 deletions pkg/manager/task_scan.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,6 @@ func (t *ScanTask) scanGallery() {
return
}

ok, err := utils.IsZipFileUncompressed(t.FilePath)
if err == nil && !ok {
logger.Warnf("%s is using above store (0) level compression.", t.FilePath)
}
checksum, err := t.calculateChecksum()
if err != nil {
logger.Error(err.Error())
Expand Down Expand Up @@ -82,6 +78,12 @@ func (t *ScanTask) scanGallery() {

// don't create gallery if it has no images
if newGallery.CountFiles() > 0 {
// only warn when creating the gallery
ok, err := utils.IsZipFileUncompressed(t.FilePath)
if err == nil && !ok {
logger.Warnf("%s is using above store (0) level compression.", t.FilePath)
}

logger.Infof("%s doesn't exist. Creating new item...", t.FilePath)
_, err = qb.Create(newGallery, tx)
}
Expand Down Expand Up @@ -251,7 +253,7 @@ func (t *ScanTask) scanScene() {

var checksum string

logger.Infof("%s not found. Calculating oshash...", t.FilePath)
logger.Infof("%s not found. Calculating oshash...", t.FilePath)
oshash, err := utils.OSHashFromFilePath(t.FilePath)
if err != nil {
logger.Error(err.Error())
Expand Down Expand Up @@ -289,17 +291,17 @@ func (t *ScanTask) scanScene() {
if scene != nil {
exists, _ := utils.FileExists(scene.Path)
if exists {
logger.Infof("%s already exists. Duplicate of %s ", t.FilePath, scene.Path)
logger.Infof("%s already exists. Duplicate of %s", t.FilePath, scene.Path)
} else {
logger.Infof("%s already exists. Updating path...", t.FilePath)
logger.Infof("%s already exists. Updating path...", t.FilePath)
scenePartial := models.ScenePartial{
ID: scene.ID,
Path: &t.FilePath,
}
_, err = qb.Update(scenePartial, tx)
}
} else {
logger.Infof("%s doesn't exist. Creating new item...", t.FilePath)
logger.Infof("%s doesn't exist. Creating new item...", t.FilePath)
currentTime := time.Now()
newScene := models.Scene{
Checksum: sql.NullString{String: checksum, Valid: checksum != ""},
Expand Down Expand Up @@ -342,7 +344,6 @@ func (t *ScanTask) makeScreenshots(probeResult *ffmpeg.VideoFile, checksum strin
normalExists, _ := utils.FileExists(normalPath)

if thumbExists && normalExists {
logger.Debug("Screenshots already exist for this path... skipping")
return
}

Expand Down
13 changes: 10 additions & 3 deletions pkg/models/json_time.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"strings"
"time"

"github.com/stashapp/stash/pkg/logger"
"github.com/stashapp/stash/pkg/utils"
)

Expand All @@ -14,15 +15,21 @@ type JSONTime struct {
time.Time
}

func (jt *JSONTime) UnmarshalJSON(b []byte) (err error) {
func (jt *JSONTime) UnmarshalJSON(b []byte) error {
s := strings.Trim(string(b), "\"")
if s == "null" {
jt.Time = time.Time{}
return
return nil
}

// #731 - returning an error here causes the entire JSON parse to fail for ffprobe.
// Changing so that it logs a warning instead.
var err error
jt.Time, err = utils.ParseDateStringAsTime(s)
return
if err != nil {
logger.Warnf("error unmarshalling JSONTime: %s", err.Error())
}
return nil
}

func (jt *JSONTime) MarshalJSON() ([]byte, error) {
Expand Down
1 change: 1 addition & 0 deletions ui/v2.5/src/components/Changelog/versions/v040.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
* Re-show preview thumbnail when mousing away from scene card.

### 🐛 Bug fixes
* Fix invalid date tag preventing video file from being scanned.
* Fix error when creating movie from scene scrape dialog.
* Fix incorrect date timezone.
* Fix search filters not persisting for studios, markers and galleries.
Expand Down

0 comments on commit 98dda78

Please sign in to comment.