Browse Source

Merge branch 'playlist-support' of https://github.com/sbma44/youtube-upload into sbma44-playlist-support

Arnau Sanchez 9 years ago
parent
commit
9c2f91f39c
3 changed files with 55 additions and 1 deletions
  1. 1 1
      youtube_upload/auth/__init__.py
  2. 8 0
      youtube_upload/main.py
  3. 46 0
      youtube_upload/playlists.py

+ 1 - 1
youtube_upload/auth/__init__.py

@@ -10,7 +10,7 @@ from youtube_upload import lib
 from youtube_upload.auth import console
 from youtube_upload.auth import browser
 
-YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload"
+YOUTUBE_UPLOAD_SCOPE = ["https://www.googleapis.com/auth/youtube.upload", "https://www.googleapis.com/auth/youtube"]
 
 def _get_credentials_interactively(flow, storage, get_code_callback):
     """Return the credentials asking the user."""

+ 8 - 0
youtube_upload/main.py

@@ -27,6 +27,7 @@ import youtube_upload.auth
 import youtube_upload.upload_video
 import youtube_upload.categories
 import youtube_upload.lib as lib
+import playlists
 
 # http://code.google.com/p/python-progressbar (>= 2.3)
 try:
@@ -151,8 +152,13 @@ def run_main(parser, options, args, output=sys.stdout):
         for index, video_path in enumerate(args):
             video_id = upload_video(youtube, options, video_path, len(args), index)
             video_url = WATCH_VIDEO_URL.format(id=video_id)
+
             if options.thumb:
                 youtube.thumbnails().set(videoId=video_id, media_body=options.thumb).execute()
+
+            if options.playlist:
+                playlists.add_to_playlist(youtube, video_id, options)
+
             debug("Video URL: {0}".format(video_url))
             output.write(video_id + "\n")
     else:
@@ -181,6 +187,8 @@ def main(arguments):
         help='Video location"')
     parser.add_option('', '--thumbnail', dest='thumb', type="string",
         help='Video thumbnail')
+    parser.add_option('', '--playlist', dest='playlist', type="string",
+        help='Playlist title (will create if necessary)')
     parser.add_option('', '--title-template', dest='title_template',
         type="string", default="{title} [{n}/{total}]", metavar="STRING",
         help='Template for multiple videos (default: {title} [{n}/{total}])')

+ 46 - 0
youtube_upload/playlists.py

@@ -0,0 +1,46 @@
+from lib import debug
+
+def add_to_playlist(youtube, video_id, options):
+    # find playlist with given name
+    existing_playlist_id = None
+    playlists = youtube.playlists()
+    request = playlists.list(mine=True, part='id,snippet')
+    while request is not None:
+        results = request.execute()
+        for item in results['items']:
+            if item.get('snippet', {}).get('title') == options.playlist:
+                existing_playlist_id = item.get('id')
+
+        # stop paginating playlists on first matching playlist title
+        if existing_playlist_id is None:
+            request = playlists.list_next(request, results)
+        else:
+            break
+
+    # create playlist, if necessary
+    if existing_playlist_id is None:
+        playlists_insert_response = youtube.playlists().insert(part="snippet,status", body={
+            "snippet": {
+                "title": options.playlist
+            },
+            "status": {
+                "privacyStatus": options.privacy
+            }
+        }).execute()
+        existing_playlist_id = playlists_insert_response.get('id', None)
+
+    # something has gone wrong
+    if existing_playlist_id is None:
+        debug('Error creating playlist')
+    else:
+        # add video to playlist
+        youtube.playlistItems().insert(part='snippet', body={
+            "snippet": {
+                "playlistId": existing_playlist_id,
+                "resourceId": {
+                    "kind": "youtube#video",
+                    "videoId": video_id
+                }
+            }
+        }).execute()
+        debug("Added video to playlist '{0}'".format(options.playlist))