删除已删除或隐私视频的播放列表项

时间:2017-03-27 15:02:20

标签: java youtube youtube-data-api

同样很快就要注意,是的,我已经在线搜索了相关的任何解决方案,但是只提出了从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观看页面上找到它们时,它只是说“此视频不可用”。与被删除无关......甚至是私人的。

0 个答案:

没有答案