fix(media): 修正转码媒资 id 解析与存量分集补登记
This commit is contained in:
1 parent
a35b02dd18
commit
5ef5dd8eaf
11 files changed
+427
-31
No files matched your search
+22
-12
@@ -24,6 +24,9 @@ public class EpisodeTranscodeAdminService {
|
||||
private static final String STATUS_NO_VIDEO = "NO_VIDEO";
|
||||
private static final String STATUS_NO_MEDIA_ASSET = "NO_MEDIA_ASSET";
|
||||
private static final String STATUS_NO_TASK = "NO_TASK";
|
||||
private static final String REASON_EPISODE_NOT_FOUND = "分集不存在或已删除";
|
||||
private static final String REASON_NO_VIDEO = "分集未配置视频";
|
||||
private static final String REASON_NO_MEDIA_ASSET = "未找到分集视频对应的媒资";
|
||||
private static final int THUMBNAIL_PAGE_INDEX = 1;
|
||||
private static final int THUMBNAIL_PAGE_SIZE = 100;
|
||||
|
||||
@@ -33,22 +36,25 @@ public class EpisodeTranscodeAdminService {
|
||||
public EpisodeTranscodeRespVO detail(Long episodeId) {
|
||||
DramaEpisode episode = episodeId == null ? null : episodeMapper.selectById(episodeId);
|
||||
if (episode == null) {
|
||||
return empty(episodeId, STATUS_EPISODE_NOT_FOUND);
|
||||
return empty(episodeId, STATUS_EPISODE_NOT_FOUND, REASON_EPISODE_NOT_FOUND);
|
||||
}
|
||||
boolean hasVideoAsset = episode.getVideoAssetId() != null
|
||||
&& episode.getVideoAssetId() > 0;
|
||||
if (!StringUtils.hasText(episode.getVideoUrl()) && !hasVideoAsset) {
|
||||
return empty(episodeId, STATUS_NO_VIDEO);
|
||||
return empty(episodeId, STATUS_NO_VIDEO, REASON_NO_VIDEO);
|
||||
}
|
||||
Long mediaAssetId = hasVideoAsset
|
||||
? episode.getVideoAssetId() : outputService.resolveMediaAssetId(episode.getVideoUrl());
|
||||
if (mediaAssetId == null) {
|
||||
return empty(episodeId, STATUS_NO_MEDIA_ASSET);
|
||||
Long mediaAssetId = outputService.resolveMediaAssetId(episode.getVideoUrl());
|
||||
if ((mediaAssetId == null || mediaAssetId <= 0) && hasVideoAsset
|
||||
&& outputService.mediaAssetExists(episode.getVideoAssetId())) {
|
||||
mediaAssetId = episode.getVideoAssetId();
|
||||
}
|
||||
if (mediaAssetId == null || mediaAssetId <= 0) {
|
||||
return empty(episodeId, STATUS_NO_MEDIA_ASSET, REASON_NO_MEDIA_ASSET);
|
||||
}
|
||||
|
||||
EpisodeTranscodeRespVO result = new EpisodeTranscodeRespVO();
|
||||
result.setEpisodeId(episodeId);
|
||||
result.setMediaAssetId(mediaAssetId);
|
||||
result.setEpisodeId(idString(episodeId));
|
||||
result.setMediaAssetId(idString(mediaAssetId));
|
||||
result.setRenditions(outputService.renditionsForMediaAssetId(mediaAssetId));
|
||||
result.setThumbnails(outputService.thumbnailForEpisode(
|
||||
episodeId, mediaAssetId, THUMBNAIL_PAGE_INDEX, THUMBNAIL_PAGE_SIZE));
|
||||
@@ -61,7 +67,7 @@ public class EpisodeTranscodeAdminService {
|
||||
result.setErrorMsg("");
|
||||
return result;
|
||||
}
|
||||
result.setTaskId(task.getId());
|
||||
result.setTaskId(idString(task.getId()));
|
||||
result.setStatus(task.getStatus());
|
||||
result.setProgress(task.getProgress());
|
||||
result.setRetryCount(task.getRetryCount());
|
||||
@@ -69,13 +75,13 @@ public class EpisodeTranscodeAdminService {
|
||||
return result;
|
||||
}
|
||||
|
||||
private EpisodeTranscodeRespVO empty(Long episodeId, String status) {
|
||||
private EpisodeTranscodeRespVO empty(Long episodeId, String status, String reason) {
|
||||
EpisodeTranscodeRespVO result = new EpisodeTranscodeRespVO();
|
||||
result.setEpisodeId(episodeId);
|
||||
result.setEpisodeId(idString(episodeId));
|
||||
result.setStatus(status);
|
||||
result.setProgress(0);
|
||||
result.setRetryCount(0);
|
||||
result.setErrorMsg("");
|
||||
result.setErrorMsg(reason);
|
||||
result.setRenditions(List.of());
|
||||
result.setThumbnails(MediaThumbnailRespVO.empty(
|
||||
null, episodeId, MediaThumbnailRespVO.STATUS_EMPTY,
|
||||
@@ -83,6 +89,10 @@ public class EpisodeTranscodeAdminService {
|
||||
return result;
|
||||
}
|
||||
|
||||
private String idString(Long id) {
|
||||
return id == null ? null : String.valueOf(id);
|
||||
}
|
||||
|
||||
private String taskStatusOf(DramaEpisode episode) {
|
||||
return StringUtils.hasText(episode.getTranscodeStatus())
|
||||
? episode.getTranscodeStatus().toUpperCase(Locale.ROOT)
|
||||
|
||||
+3
-3
@@ -14,9 +14,9 @@ import java.util.List;
|
||||
@Schema(description = "分集转码聚合信息")
|
||||
public class EpisodeTranscodeRespVO {
|
||||
|
||||
private Long episodeId;
|
||||
private Long mediaAssetId;
|
||||
private Long taskId;
|
||||
private String episodeId;
|
||||
private String mediaAssetId;
|
||||
private String taskId;
|
||||
private String status;
|
||||
private Integer progress;
|
||||
private Integer retryCount;
|
||||
|
||||
+12
-8
@@ -29,19 +29,23 @@ class EpisodeTranscodeContractTest {
|
||||
|
||||
@Test
|
||||
void should_return_aggregated_episode_transcode_state() throws Exception {
|
||||
String episodeId = "2113150431755636737";
|
||||
String mediaAssetId = "2113150398670966786";
|
||||
String taskId = "2113150398935207938";
|
||||
EpisodeTranscodeRespVO vo = new EpisodeTranscodeRespVO();
|
||||
vo.setEpisodeId(31L);
|
||||
vo.setMediaAssetId(88L);
|
||||
vo.setTaskId(8L);
|
||||
vo.setEpisodeId(episodeId);
|
||||
vo.setMediaAssetId(mediaAssetId);
|
||||
vo.setTaskId(taskId);
|
||||
vo.setStatus("SUCCESS");
|
||||
vo.setProgress(100);
|
||||
given(service.detail(31L)).willReturn(vo);
|
||||
given(service.detail(Long.parseLong(episodeId))).willReturn(vo);
|
||||
|
||||
mockMvc.perform(get("/admin/episodes/31/transcode"))
|
||||
mockMvc.perform(get("/admin/episodes/" + episodeId + "/transcode"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$.code").value(0))
|
||||
.andExpect(jsonPath("$.data.episodeId").value("31"))
|
||||
.andExpect(jsonPath("$.data.mediaAssetId").value("88"))
|
||||
.andExpect(jsonPath("$.data.episodeId").value(episodeId))
|
||||
.andExpect(jsonPath("$.data.mediaAssetId").value(mediaAssetId))
|
||||
.andExpect(jsonPath("$.data.taskId").value(taskId))
|
||||
.andExpect(jsonPath("$.data.status").value("SUCCESS"))
|
||||
.andExpect(jsonPath("$.data.progress").value(100));
|
||||
}
|
||||
@@ -49,7 +53,7 @@ class EpisodeTranscodeContractTest {
|
||||
@Test
|
||||
void should_return_explicit_empty_state_when_episode_has_no_video() throws Exception {
|
||||
EpisodeTranscodeRespVO vo = new EpisodeTranscodeRespVO();
|
||||
vo.setEpisodeId(31L);
|
||||
vo.setEpisodeId("31");
|
||||
vo.setStatus("NO_VIDEO");
|
||||
given(service.detail(31L)).willReturn(vo);
|
||||
|
||||
|
||||
+60
-1
@@ -5,9 +5,13 @@ package com.fruitshorts.admin.service;
|
||||
import com.fruitshorts.content.dal.entity.DramaEpisode;
|
||||
import com.fruitshorts.content.dal.mapper.DramaEpisodeMapper;
|
||||
import com.fruitshorts.media.service.MediaTranscodeOutputService;
|
||||
import com.fruitshorts.media.vo.MediaThumbnailRespVO;
|
||||
import com.fruitshorts.media.vo.TranscodeTaskRespVO;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
@@ -15,6 +19,10 @@ import static org.mockito.Mockito.verifyNoInteractions;
|
||||
|
||||
class EpisodeTranscodeAdminServiceTest {
|
||||
|
||||
private static final Long EPISODE_ID = 2113150431755636737L;
|
||||
private static final Long MEDIA_ASSET_ID = 2113150398670966786L;
|
||||
private static final Long TASK_ID = 2113150398935207938L;
|
||||
|
||||
private DramaEpisodeMapper episodeMapper;
|
||||
private MediaTranscodeOutputService outputService;
|
||||
private EpisodeTranscodeAdminService service;
|
||||
@@ -33,7 +41,7 @@ class EpisodeTranscodeAdminServiceTest {
|
||||
var result = service.detail(404L);
|
||||
|
||||
assertThat(result.getStatus()).isEqualTo("EPISODE_NOT_FOUND");
|
||||
assertThat(result.getEpisodeId()).isEqualTo(404L);
|
||||
assertThat(result.getEpisodeId()).isEqualTo("404");
|
||||
assertThat(result.getRenditions()).isEmpty();
|
||||
verifyNoInteractions(outputService);
|
||||
}
|
||||
@@ -51,4 +59,55 @@ class EpisodeTranscodeAdminServiceTest {
|
||||
assertThat(result.getRenditions()).isEmpty();
|
||||
verifyNoInteractions(outputService);
|
||||
}
|
||||
|
||||
@Test
|
||||
void should_return_exact_snowflake_media_asset_id_as_string() {
|
||||
DramaEpisode episode = episode(MEDIA_ASSET_ID);
|
||||
given(episodeMapper.selectById(EPISODE_ID)).willReturn(episode);
|
||||
given(outputService.resolveMediaAssetId(episode.getVideoUrl())).willReturn(null);
|
||||
given(outputService.mediaAssetExists(MEDIA_ASSET_ID)).willReturn(true);
|
||||
given(outputService.renditionsForMediaAssetId(MEDIA_ASSET_ID)).willReturn(List.of());
|
||||
given(outputService.thumbnailForEpisode(
|
||||
EPISODE_ID, MEDIA_ASSET_ID, 1, 100))
|
||||
.willReturn(MediaThumbnailRespVO.empty(
|
||||
MEDIA_ASSET_ID, EPISODE_ID,
|
||||
MediaThumbnailRespVO.STATUS_EMPTY, 1, 100));
|
||||
TranscodeTaskRespVO task = new TranscodeTaskRespVO();
|
||||
task.setId(TASK_ID);
|
||||
task.setMediaAssetId(MEDIA_ASSET_ID);
|
||||
task.setStatus("SUCCESS");
|
||||
task.setProgress(100);
|
||||
given(outputService.latestTask(MEDIA_ASSET_ID)).willReturn(task);
|
||||
|
||||
var result = service.detail(EPISODE_ID);
|
||||
|
||||
assertThat(result.getEpisodeId()).isEqualTo("2113150431755636737");
|
||||
assertThat(result.getMediaAssetId()).isEqualTo("2113150398670966786");
|
||||
assertThat(result.getTaskId()).isEqualTo("2113150398935207938");
|
||||
}
|
||||
|
||||
@Test
|
||||
void should_return_explicit_empty_state_when_episode_media_is_missing() {
|
||||
DramaEpisode episode = episode(MEDIA_ASSET_ID);
|
||||
given(episodeMapper.selectById(EPISODE_ID)).willReturn(episode);
|
||||
given(outputService.mediaAssetExists(MEDIA_ASSET_ID)).willReturn(false);
|
||||
given(outputService.resolveMediaAssetId(episode.getVideoUrl())).willReturn(null);
|
||||
|
||||
var result = service.detail(EPISODE_ID);
|
||||
|
||||
assertThat(result.getMediaAssetId()).isNull();
|
||||
assertThat(result.getStatus()).isEqualTo("NO_MEDIA_ASSET");
|
||||
assertThat(result.getErrorMsg()).isNotBlank();
|
||||
assertThat(result.getRenditions()).isEmpty();
|
||||
}
|
||||
|
||||
private DramaEpisode episode(Long videoAssetId) {
|
||||
DramaEpisode episode = new DramaEpisode();
|
||||
episode.setId(EPISODE_ID);
|
||||
episode.setDramaId(7L);
|
||||
episode.setDurationSec(120);
|
||||
episode.setVideoAssetId(videoAssetId);
|
||||
episode.setVideoUrl("/files/episode/202610/video.mp4");
|
||||
return episode;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user