同样很快就要注意,是的,我已经在线搜索了相关的任何解决方案,但是只提出了从YouTube上删除“稍后观看”播放列表的错误。也许它可能与API本身有类似的错误。
我刚刚开始尝试使用Google API和YouTube数据API。
我的目标是清理我的“喜欢”播放列表,其中包含大约1000个视频,而我这样做的想法是获取播放列表项目列表,然后从播放列表中逐个删除它们,因此“不喜欢” “他们。
我的小程序运行正常,通过OAuth正确验证,然后运行每个播放列表项,直到遇到私有或已删除的视频。 (我认为对于我无法观看的视频会发生同样的情况。)
以下是抛出异常的堆栈跟踪:
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found { "code": 404, "errors": [ { "domain" : "youtube.playlistItem", "location" : "id", "locationType" : "parameter", "message" : "Playlist item not found.", "reason" : "playlistItemNotFound" } ], "message": "Playlist item not found." } at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146) at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113) at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) at YouAPI.V3ApiTest.removePlaylistItem(V3ApiTest.java:72) at YouAPI.V3ApiTest.run(V3ApiTest.java:30)
这是我的代码。这是一个精简版本,我把所有内容都塞进了一个类,以便能够在这里轻松发布:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.services.samples.youtube.cmdline.Auth;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.model.PlaylistItem;
import com.google.api.services.youtube.model.PlaylistItemListResponse;
import com.google.common.collect.Lists;
public class V3ApiTest
{
private YouTube _youtube;
public void run() throws IOException
{
List<String> scopes = Lists.newArrayList("https://www.googleapis.com/auth/youtube");
Credential credential = Auth.authorize(scopes, "testing");
_youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, credential).setApplicationName("testing").build();
List<PlaylistItem> playlist = getPlaylistItems("<list>");
System.out.println("Playlist size: " + playlist.size());
PlaylistItem deletedVideo = playlist.get(251);
removePlaylistItem(deletedVideo);
}
public List<PlaylistItem> getPlaylistItems(String playlistId) throws IOException
{
List<PlaylistItem> items = new ArrayList<>();
YouTube.PlaylistItems.List request = _youtube.playlistItems().list("contentDetails,snippet");
request.setPlaylistId(playlistId);
PlaylistItemListResponse retrieved = request.execute();
while (retrieved.getNextPageToken() != null)
{
items.addAll(retrieved.getItems());
System.out.println("Retrieving playlist page '" + retrieved.getNextPageToken() + "'");
request = _youtube.playlistItems().list("contentDetails,snippet");
request.setPlaylistId(playlistId);
request.setPageToken(retrieved.getNextPageToken());
retrieved = request.execute();
}
// On the last page (or first if there is only one page), the code within the while loop
// wont get called (because there is no next page) so add all of the videos in the retrieved
// page and add them to the list
if (retrieved.getNextPageToken() == null)
{
items.addAll(retrieved.getItems());
}
System.out.println("Sucessfully retrieved playlist.");
return items;
}
public void removePlaylistItem(PlaylistItem item) throws IOException
{
System.out.println(item.getContentDetails() + ", " + item.getSnippet());
System.out.println("Deleting playlist item '" + item.getId() + "' [video='" + item.getContentDetails().getVideoId() + "', playlist='" + item.getSnippet().getPlaylistId() + "'].");
YouTube.PlaylistItems.Delete deleteCommand = _youtube.playlistItems().delete(item.getId());
deleteCommand.setId(item.getId());
deleteCommand.execute();
System.out.println("Sucessfully deleted playlist item.");
}
}
播放列表中的第251个视频是私有视频,这就是404被抛出的原因,但是我不明白为什么它说没有找到播放列表项,因为我刚刚使用API获取了它。 / p>
任何其他没有私有或删除的索引(如250)都可以正常运行,并会从喜欢的播放列表中删除。
修改
经过一番处理之后,我发现私人视频会在播放列表中完全删除,但是有些类型的视频几乎看不到。这是我第一次开始使用YouTube帐户时的第一个喜欢,所以我的理论是他们不再存在......(某种程度上) 在YouTube API中调用playlistItems.list资源时,它将返回“项目”的JSON列表。 此列表中的正常条目如下所示:
{ "kind": "youtube#playlistItem", "etag": "\"uQc-MPTsstrHkQcRXL3IWLmeNsM/-E5SEVA1M-_RP2FgLOKwU1J3XGg\"", "id": "cHJpdmF0ZXBsYXlsaXN0Zm9ycHJpdmFjLnBJS3NIaDNCRlBJ", "contentDetails": { "videoId": "pIKsHh3BFPI", "videoPublishedAt": "2010-01-02T23:36:50.000Z" } }
然而,在我喜欢的播放列表中,我至少有50个麻烦的视频将返回一个非常相似的条目,除了缺少“videoPublishedAt”属性:
{ "kind": "youtube#playlistItem", "etag": "\"uQc-MPTsstrHkQcRXL3IWLmeNsM/lLin0muEkjiMnqxU6F0_hiAPQu8\"", "id": "cHJpdmF0ZXBsYXlsaXN0Zm9ycHJpdmFjLmVWSGNlNS0xcmVV", "contentDetails": { "videoId": "eVHce5-1reU" } }
基于此,感觉这些视频甚至不再“存在”。我确定他们非常非常老...我不知道这是否是删除视频的样子,但它真的不喜欢它,因为它们标题为“[私人视频]”(你可以告诉基于上面的堆栈跟踪),因为当你在youtube观看页面上找到它们时,它只是说“此视频不可用”。与被删除无关......甚至是私人的。