Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prevent invalid date tag in video file from aborting scan #836

Merged
merged 5 commits into from
Oct 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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