通过YouTube Python API添加播放列表条目

1 投票
1 回答
1255 浏览
提问于 2025-04-16 00:10

我正在尝试通过下面的代码向YouTube的播放列表中添加条目。当我把播放列表的链接(http://gdata.youtube.com/feeds/api/users/nashrafeeg/playlists/0F4EF4B14F514476?client=Reddit+playlist+maker)传递给AddPlaylistVideoEntryToPlaylist这个方法时,调用获取播放列表的方法却出现了错误,提示说Invalid request URI(请求的链接无效)。请问有什么好的方法来解决这个问题呢?

import urllib,re
import gdata.youtube
import gdata.youtube.service

class reddit():

    def __init__(self, rssurl ='http://www.reddit.com/r/chillmusic.rss' ):
        self.URL = rssurl
        self._downloadrss()

    def _downloadrss(self):
        if self.URL.endswith('.rss'):
            # Downloadd the RSS feed of the subreddit - save as "feed.rss"
            try:
                print "Downloading rss from reddit..." 
                urllib.urlretrieve (URL, "feed.rss")
            except Exception as e:
                print e

    def clean(self):
        playList = open("feed.rss").read()
        links = re.findall(r'(http?://www.youtube.com\S+)', playList)
        for link in links:
            firstPass = link.replace('">[link]</a>', '')
            secondPass = firstPass.replace('&fmt=18', '')
            thirdpass = secondPass.replace('&feature=related', '')
            finalPass = thirdpass.replace('http://www.youtube.com/watch?v=', '')
            print thirdpass, "\t Extracted:   ", finalPass
            return finalPass


class google(): 
    def __init__(self, username, password):
        self.Username = username
        self.password = password
        #do not change any of the following
        self.key = 'AI39si5DDjGYhG_1W-8n_amjgEjbOU27sa0aw2RQI5gOaoK5KqCD2Fzffbkh8oqGu7CqFQLLQ7N7wK0gz7lrTQbd70srC72Niw'
        self.appname = 'Reddit playlist maker'
        self.service = gdata.youtube.service.YouTubeService()

    def authenticate(self): 
        self.service.email = self.Username
        self.service.password = self.password
        self.service.developer_key = self.key
        self.service.client_id  =  self.appname
        self.service.source = self.appname
        self.service.ssl = False 
        self.service.ProgrammaticLogin()

    def get_playlists(self):
        y_playlist = self.service.GetYouTubePlaylistFeed(username='default')
        l = []
        k = []
        for p in  y_playlist.entry:       
           k=[]
           k=[p.link[1].href, p.title.text]
           l.append(k)
        return l

    def get_playlist_id_from_url(self, href):
            #quick and dirty method to get the playList id's 
            return href.replace('http://www.youtube.com/view_play_list?p=','')

    def creat_playlist(self, name="Reddit list", disc ="videos from reddit"):
        playlistentry = self.service.AddPlaylist(name, disc)
        if isinstance(playlistentry, gdata.youtube.YouTubePlaylistEntry):
            print 'New playlist added'
            return playlistentry.link[1].href

    def add_video_to_playlist(self,playlist_uri,video):
        video_entry = self.service.AddPlaylistVideoEntryToPlaylist(
        playlist_uri, video)
        if isinstance(video_entry, gdata.youtube.YouTubePlaylistVideoEntry):
            print 'Video added'
URL = "http://www.reddit.com/r/chillmusic.rss"

r = reddit(URL)
g = google('xxxxx@gmail.com', 'xxxx')
g.authenticate()

def search_playlist(playlist="Reddit list3"):
    pl_id = None 
    for pl in  g.get_playlists():
        if pl[1] == playlist:
           pl_id = pl[0]
           print pl_id
           break 
    if pl_id == None:
        pl_id = g.creat_playlist(name=playlist)
    return pl_id       
pls = search_playlist()
for video_id in r.clean():
    g.add_video_to_playlist(pls, video_id)

1 个回答

0

不知道怎么获取这个,但如果你把你的播放列表链接中的 '/users/[用户名]' 去掉,它就能正常工作了。

举个例子:

播放列表链接是

http://gdata.youtube.com/feeds/api/users/[用户名]/playlists/[长_id]

应该变成

http://gdata.youtube.com/feeds/api/playlists/[长_id]

撰写回答