testing copy transform

This commit is contained in:
Roland Osborne 2022-03-01 11:20:51 -08:00
parent ef88a857ed
commit e839397733
4 changed files with 67 additions and 31 deletions

View File

@ -36,8 +36,10 @@ const APP_ASSETERROR = "error"
const APP_TRANSFORMCOMPLETE = "complete" const APP_TRANSFORMCOMPLETE = "complete"
const APP_TRANSFORMINCOMPLETE = "incomplete" const APP_TRANSFORMINCOMPLETE = "incomplete"
const APP_TRANSFORMERROR = "error" const APP_TRANSFORMERROR = "error"
const APP_TRANSFORMQUEUEA = "A" const APP_QUEUEAUDIO = "audio"
const APP_TRANSFORMQUEUEB = "B" const APP_QUEUEVIDEO = "video"
const APP_QUEUEPHOTO = "photo"
const APP_QUEUEDEFAULT = ""
func AppCardStatus(status string) bool { func AppCardStatus(status string) bool {
if status == APP_CARDPENDING { if status == APP_CARDPENDING {

View File

@ -21,8 +21,8 @@ func TestMain(m *testing.M) {
if err := os.Mkdir("testscripts", os.ModePerm); err != nil { if err := os.Mkdir("testscripts", os.ModePerm); err != nil {
panic("failed to create testscripts path") panic("failed to create testscripts path")
} }
P01 := []byte("#!/bin/bash\n echo \"P01 $1 $2 $3\"\n") script := []byte("#!/bin/bash\n\ncp $1 $2\n")
if err := os.WriteFile("testscripts/P01.sh", P01, 0555); err != nil { if err := os.WriteFile("testscripts/transform_copy.sh", script, 0555); err != nil {
panic("failed to create P01 script") panic("failed to create P01 script")
} }

View File

@ -13,48 +13,74 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
) )
var aSync sync.Mutex var audioSync sync.Mutex
var bSync sync.Mutex var videoSync sync.Mutex
var photoSync sync.Mutex
var defaultSync sync.Mutex
func transcode() { func transcode() {
go transcodeAudio()
// quick transforms should use A (eg image resize) go transcodeVideo()
go transcodeA() go transcodePhoto()
go transcodeDefault()
// slow transofrms should use B (eg video transcode)
go transcodeB()
} }
func transcodeA() { func transcodeVideo() {
aSync.Lock() videoSync.Lock()
defer aSync.Unlock() defer videoSync.Unlock()
for ;; { for ;; {
var asset store.Asset var asset store.Asset
if err := store.DB.Order("created asc").Preload("Account").Preload("Channel.Cards").Preload("Channel.Groups.Cards").Preload("Channel.ChannelSlot").Preload("Topic.TopicSlot").Where("transform_queue = ? AND status = ?", APP_TRANSFORMQUEUEA, APP_ASSETWAITING).First(&asset).Error; err != nil { if err := store.DB.Order("created asc").Preload("Account").Preload("Channel.Cards").Preload("Channel.Groups.Cards").Preload("Channel.ChannelSlot").Preload("Topic.TopicSlot").Where("transform_queue = ? AND status = ?", APP_QUEUEVIDEO, APP_ASSETWAITING).First(&asset).Error; err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) { if !errors.Is(err, gorm.ErrRecordNotFound) {
ErrMsg(err) ErrMsg(err)
} }
return return
} }
transcodeAsset(&asset) transcodeAsset(&asset)
} }
} }
func transcodeB() { func transcodeAudio() {
bSync.Lock() audioSync.Lock()
defer bSync.Unlock() defer audioSync.Unlock()
for ;; { for ;; {
var asset store.Asset var asset store.Asset
if err := store.DB.Order("created asc").Preload("Account").Preload("Channel.Cards").Preload("Channel.Groups.Cards").Preload("Channel.ChannelSlot").Preload("Topic.TopicSlot").Where("transform_queue != ? AND status = ?", APP_TRANSFORMQUEUEB, APP_ASSETWAITING).First(&asset).Error; err != nil { if err := store.DB.Order("created asc").Preload("Account").Preload("Channel.Cards").Preload("Channel.Groups.Cards").Preload("Channel.ChannelSlot").Preload("Topic.TopicSlot").Where("transform_queue = ? AND status = ?", APP_QUEUEAUDIO, APP_ASSETWAITING).First(&asset).Error; err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) { if !errors.Is(err, gorm.ErrRecordNotFound) {
ErrMsg(err) ErrMsg(err)
} }
return return
} }
transcodeAsset(&asset)
}
}
func transcodePhoto() {
photoSync.Lock()
defer photoSync.Unlock()
for ;; {
var asset store.Asset
if err := store.DB.Order("created asc").Preload("Account").Preload("Channel.Cards").Preload("Channel.Groups.Cards").Preload("Channel.ChannelSlot").Preload("Topic.TopicSlot").Where("transform_queue = ? AND status = ?", APP_QUEUEPHOTO, APP_ASSETWAITING).First(&asset).Error; err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) {
ErrMsg(err)
}
return
}
transcodeAsset(&asset)
}
}
func transcodeDefault() {
defaultSync.Lock()
defer defaultSync.Unlock()
for ;; {
var asset store.Asset
if err := store.DB.Order("created asc").Preload("Account").Preload("Channel.Cards").Preload("Channel.Groups.Cards").Preload("Channel.ChannelSlot").Preload("Topic.TopicSlot").Where("transform_queue != ? AND transform_queue != ? AND transform_queue != ? AND status = ?", APP_QUEUEVIDEO, APP_QUEUEAUDIO, APP_QUEUEPHOTO, APP_ASSETWAITING).First(&asset).Error; err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) {
ErrMsg(err)
}
return
}
transcodeAsset(&asset) transcodeAsset(&asset)
} }
} }
@ -72,19 +98,27 @@ func transcodeAsset(asset *store.Asset) {
ErrMsg(err) ErrMsg(err)
} }
} else { } else {
input := data + "/" + asset.TransformId input := data + "/" + asset.Account.Guid + "/" + asset.TransformId
output := data + "/" + asset.AssetId output := data + "/" + asset.Account.Guid + "/" + asset.AssetId
cmd := exec.Command(script + "/" + asset.Transform + ".sh", input, output, asset.TransformParams) cmd := exec.Command(script + "/transform_" + asset.Transform + ".sh", input, output, asset.TransformParams)
var out bytes.Buffer var stdout bytes.Buffer
cmd.Stdout = &out cmd.Stdout = &stdout
var stderr bytes.Buffer
cmd.Stderr = &stderr
if err := cmd.Run(); err != nil { if err := cmd.Run(); err != nil {
LogMsg(out.String()) LogMsg(stdout.String())
LogMsg(stderr.String())
ErrMsg(err) ErrMsg(err)
if err := UpdateAsset(asset, APP_ASSETERROR, 0, 0); err != nil { if err := UpdateAsset(asset, APP_ASSETERROR, 0, 0); err != nil {
ErrMsg(err) ErrMsg(err)
} }
} else { } else {
LogMsg(out.String()) if stdout.Len() > 0 {
LogMsg(stdout.String())
}
if stderr.Len() > 0 {
LogMsg(stderr.String())
}
crc, size, err := ScanAsset(output) crc, size, err := ScanAsset(output)
if err != nil { if err != nil {
ErrMsg(err) ErrMsg(err)

View File

@ -92,7 +92,7 @@ func TestTopicShare(t *testing.T) {
// add asset to topic // add asset to topic
assets := &[]Asset{} assets := &[]Asset{}
params["topicId"] = topic.Id params["topicId"] = topic.Id
transforms, err := json.Marshal([]string{ "P01;A;1234", "P02", "P03" }) transforms, err := json.Marshal([]string{ "copy;photo" })
assert.NoError(t, err) assert.NoError(t, err)
assert.NoError(t, ApiTestUpload(AddChannelTopicAsset, "POST", "/content/channels/{channelId}/topics/{topicId}/assets?transforms=" + url.QueryEscape(string(transforms)), assert.NoError(t, ApiTestUpload(AddChannelTopicAsset, "POST", "/content/channels/{channelId}/topics/{topicId}/assets?transforms=" + url.QueryEscape(string(transforms)),
&params, img, APP_TOKENCONTACT, set.C.A.Token, assets, nil)) &params, img, APP_TOKENCONTACT, set.C.A.Token, assets, nil))