feat(playback): 播放票据返回各清晰度地址

This commit is contained in:
Zhou Weidong committed 2026-10-23 12:34:13 +08:00
1 parent ab58641bbe
commit 5a80e6693f
4 files changed
+68

No files matched your search

@@ -13,6 +13,7 @@ import com.fruitshorts.media.service.TranscodeService;
import com.fruitshorts.playback.dal.entity.PlaybackTicket;
import com.fruitshorts.playback.dal.mapper.PlaybackTicketMapper;
import com.fruitshorts.playback.vo.PlayRespVO;
import com.fruitshorts.playback.vo.PlayTrackVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -87,6 +88,7 @@ public class PlaybackService {
vo.setAccessible(true);
vo.setAccessType(entitled && !free ? ACCESS_ENTITLED : ACCESS_FREE);
vo.setPlayUrl(signedUrl);
vo.setTracks(tracksOf(episode.getId(), signedUrl));
if (userId != null) {
recordTicket(userId, drama.getId(), episode.getId(), signedUrl, deviceId, clientIp);
@@ -115,6 +117,29 @@ public class PlaybackService {
return qualities;
}
/** AUTO 用主列表,其余档位用各自的 index.m3u8,地址都签名。 */
private List<PlayTrackVO> tracksOf(Long episodeId, String signedAuto) {
List<PlayTrackVO> tracks = new ArrayList<>();
tracks.add(track("AUTO", signedAuto));
for (MediaRendition rendition : transcodeService.listRenditions(episodeId)) {
if (!StringUtils.hasText(rendition.getPlayUrl())) {
continue;
}
if (!"ready".equalsIgnoreCase(rendition.getStatus())) {
continue;
}
tracks.add(track(rendition.getQuality(), signer.sign(rendition.getPlayUrl())));
}
return tracks;
}
private PlayTrackVO track(String quality, String playUrl) {
PlayTrackVO track = new PlayTrackVO();
track.setQuality(quality);
track.setPlayUrl(playUrl);
return track;
}
private void recordTicket(Long userId, Long dramaId, Long episodeId, String playUrl,
String deviceId, String clientIp) {
PlaybackTicket ticket = new PlaybackTicket();
@@ -23,6 +23,8 @@ public class PlayRespVO {
private String playUrl;
/** 可用的清晰度档位 */
private List<String> qualities;
/** 各档签名地址。AUTO 是主播放列表,其余是单档 HLS。 */
private List<PlayTrackVO> tracks;
/** 雪碧图 WebVTT 时间轴地址;没有产物时为 null */
private String thumbnailsUrl;
/** 需要多少金币解锁 */
@@ -0,0 +1,16 @@
// Author: fruit.com.cn
package com.fruitshorts.playback.vo;
import lombok.Data;
/** 一档可切换的清晰度及其签名播放地址。 */
@Data
public class PlayTrackVO {
/** AUTO 或 360p/480p/720p/1080p。 */
private String quality;
/** 签名后的播放地址,客户端原样使用。 */
private String playUrl;
}