diff --git a/net/server/internal/appValues.go b/net/server/internal/appValues.go index d3b1e3fe..5933cc66 100644 --- a/net/server/internal/appValues.go +++ b/net/server/internal/appValues.go @@ -36,8 +36,10 @@ const APP_ASSETERROR = "error" const APP_TRANSFORMCOMPLETE = "complete" const APP_TRANSFORMINCOMPLETE = "incomplete" const APP_TRANSFORMERROR = "error" -const APP_TRANSFORMQUEUEA = "A" -const APP_TRANSFORMQUEUEB = "B" +const APP_QUEUEAUDIO = "audio" +const APP_QUEUEVIDEO = "video" +const APP_QUEUEPHOTO = "photo" +const APP_QUEUEDEFAULT = "" func AppCardStatus(status string) bool { if status == APP_CARDPENDING { diff --git a/net/server/internal/main_test.go b/net/server/internal/main_test.go index 475e7002..958a5e89 100644 --- a/net/server/internal/main_test.go +++ b/net/server/internal/main_test.go @@ -21,8 +21,8 @@ func TestMain(m *testing.M) { if err := os.Mkdir("testscripts", os.ModePerm); err != nil { panic("failed to create testscripts path") } - P01 := []byte("#!/bin/bash\n echo \"P01 $1 $2 $3\"\n") - if err := os.WriteFile("testscripts/P01.sh", P01, 0555); err != nil { + script := []byte("#!/bin/bash\n\ncp $1 $2\n") + if err := os.WriteFile("testscripts/transform_copy.sh", script, 0555); err != nil { panic("failed to create P01 script") } diff --git a/net/server/internal/transcodeUtil.go b/net/server/internal/transcodeUtil.go index 9e1f591b..67752b05 100644 --- a/net/server/internal/transcodeUtil.go +++ b/net/server/internal/transcodeUtil.go @@ -13,48 +13,74 @@ import ( "gorm.io/gorm" ) -var aSync sync.Mutex -var bSync sync.Mutex +var audioSync sync.Mutex +var videoSync sync.Mutex +var photoSync sync.Mutex +var defaultSync sync.Mutex func transcode() { - - // quick transforms should use A (eg image resize) - go transcodeA() - - // slow transofrms should use B (eg video transcode) - go transcodeB() + go transcodeAudio() + go transcodeVideo() + go transcodePhoto() + go transcodeDefault() } -func transcodeA() { - aSync.Lock() - defer aSync.Unlock() - +func transcodeVideo() { + videoSync.Lock() + defer videoSync.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_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) { ErrMsg(err) } return } - transcodeAsset(&asset) } } -func transcodeB() { - bSync.Lock() - defer bSync.Unlock() - +func transcodeAudio() { + audioSync.Lock() + defer audioSync.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_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) { ErrMsg(err) } 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) } } @@ -72,19 +98,27 @@ func transcodeAsset(asset *store.Asset) { ErrMsg(err) } } else { - input := data + "/" + asset.TransformId - output := data + "/" + asset.AssetId - cmd := exec.Command(script + "/" + asset.Transform + ".sh", input, output, asset.TransformParams) - var out bytes.Buffer - cmd.Stdout = &out + input := data + "/" + asset.Account.Guid + "/" + asset.TransformId + output := data + "/" + asset.Account.Guid + "/" + asset.AssetId + cmd := exec.Command(script + "/transform_" + asset.Transform + ".sh", input, output, asset.TransformParams) + var stdout bytes.Buffer + cmd.Stdout = &stdout + var stderr bytes.Buffer + cmd.Stderr = &stderr if err := cmd.Run(); err != nil { - LogMsg(out.String()) + LogMsg(stdout.String()) + LogMsg(stderr.String()) ErrMsg(err) if err := UpdateAsset(asset, APP_ASSETERROR, 0, 0); err != nil { ErrMsg(err) } } else { - LogMsg(out.String()) + if stdout.Len() > 0 { + LogMsg(stdout.String()) + } + if stderr.Len() > 0 { + LogMsg(stderr.String()) + } crc, size, err := ScanAsset(output) if err != nil { ErrMsg(err) diff --git a/net/server/internal/ucTopicShare_test.go b/net/server/internal/ucTopicShare_test.go index a7b23819..cfdf47dc 100644 --- a/net/server/internal/ucTopicShare_test.go +++ b/net/server/internal/ucTopicShare_test.go @@ -92,7 +92,7 @@ func TestTopicShare(t *testing.T) { // add asset to topic assets := &[]Asset{} 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, ApiTestUpload(AddChannelTopicAsset, "POST", "/content/channels/{channelId}/topics/{topicId}/assets?transforms=" + url.QueryEscape(string(transforms)), ¶ms, img, APP_TOKENCONTACT, set.C.A.Token, assets, nil))