如何通过YouTube Data API 3获取短视频?Android Kotlin场景
用YouTube API筛选长/普通/短视频的实现方案
YouTube Search API本身不支持直接按视频时长筛选,得先获取视频ID,再通过Videos API拿到视频时长信息,最后在本地完成筛选。以下是具体实现步骤:
1. 扩展YoutubeService接口,添加视频详情查询方法
需要新增一个接口方法,调用YouTube的videos端点获取视频的时长(存储在contentDetails.duration字段):
import com.example.alaproapp.model.YoutubeModel import com.example.alaproapp.model.YoutubeVideoDetailsModel // 需要新建对应的数据模型 import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Query interface YoutubeService { @GET("search") fun getAllData( @Query("key") key: String = "your_api_key", @Query("channelId") channelId: String = "UCHVY_-jY-FayjszyX1nlGtQ", @Query("order") order: String = "date", @Query("maxResults") maxResult: String = "50", // Search API最大支持50,1800无效 @Query("part") part: String = "snippet,id", @Query("type") type: String = "video" // 只返回视频,排除播放列表、频道等 ): Call<YoutubeModel> // 获取视频时长等详情 @GET("videos") fun getVideoDetails( @Query("key") key: String = "your_api_key", @Query("id") videoIds: String, // 多个ID用逗号分隔,最多支持50个 @Query("part") part: String = "contentDetails" ): Call<YoutubeVideoDetailsModel> }
2. 新建视频详情的数据模型
根据API返回结构,创建YoutubeVideoDetailsModel(可通过Gson自动解析,或根据JSON结构手动生成):
data class YoutubeVideoDetailsModel( val items: List<VideoItem> ) data class VideoItem( val id: String, val contentDetails: ContentDetails ) data class ContentDetails( val duration: String // 格式为ISO 8601,比如PT5M30S表示5分30秒 )
3. 实现调用与筛选逻辑
步骤1:获取视频ID列表
先调用getAllData接口,拿到目标频道的视频ID,将ID收集为逗号分隔的字符串(每次最多50个,超过需分页处理)。
步骤2:批量获取视频时长
调用getVideoDetails接口,传入视频ID列表,解析每个视频的duration字段。
步骤3:解析时长并筛选
把ISO 8601格式的时长转换为秒,再根据自定义阈值筛选:
- 短视频:时长 < 240秒(4分钟)
- 普通视频:240秒 ≤ 时长 ≤ 1200秒(20分钟)
- 长视频:时长 > 1200秒(20分钟)
解析时长的工具方法示例:
fun parseDurationToSeconds(duration: String): Long { val pattern = Regex("PT(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?") val matchResult = pattern.matchEntire(duration) ?: return 0 val hours = matchResult.groupValues[1].toLongOrNull() ?: 0 val minutes = matchResult.groupValues[2].toLongOrNull() ?: 0 val seconds = matchResult.groupValues[3].toLongOrNull() ?: 0 return hours * 3600 + minutes * 60 + seconds }
筛选逻辑示例:
// 假设已拿到视频详情列表videoItems val shortVideos = mutableListOf<VideoItem>() val normalVideos = mutableListOf<VideoItem>() val longVideos = mutableListOf<VideoItem>() videoItems.forEach { item -> val durationSeconds = parseDurationToSeconds(item.contentDetails.duration) when { durationSeconds < 240 -> shortVideos.add(item) durationSeconds in 240..1200 -> normalVideos.add(item) else -> longVideos.add(item) } }
注意事项
- Search API的
maxResults参数最大只能设为50,若需更多数据,需使用pageToken进行分页查询。 - 每次调用
videos接口最多支持查询50个视频ID,超过需分批次调用。 - 替换代码中的
your_api_key为你实际的YouTube API密钥。
内容的提问来源于stack exchange,提问作者DiyorbekJDK
相关产品推荐
相关产品推荐

