You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:39:53