浏览代码

Added community station youtube playlist importing.

KrisVos130 8 年之前
父节点
当前提交
0c467f032f
共有 4 个文件被更改,包括 105 次插入3 次删除
  1. 90 0
      app/client/scripts/events.js
  2. 3 0
      app/client/scripts/helpers.js
  3. 10 0
      app/client/templates/communityStation.html
  4. 2 3
      app/server/server.js

+ 90 - 0
app/client/scripts/events.js

@@ -2091,6 +2091,96 @@ Template.communityStation.events({
         });
         $("#edit_playlist_modal").closeModal();
     },
+    "click #import-youtube-playlist": function() {
+        if (!Session.get("importingPlaylist")) {
+            Session.set("songResults", []);
+            var playlist_link = $("#import_youtube_playlist_input").val();
+            var playlist_id = gup("list", playlist_link);
+            var ytImportQueue = [];
+            var totalVideos = 0;
+            var videosInPlaylist = 0;
+            var videosInvalid = 0;
+            var ranOnce = false;
+
+            Session.set("importingPlaylist", true);
+
+            $("#import-progress").css({width: "0%"});
+
+            function makeAPICall(playlist_id, nextPageToken) {
+                if (nextPageToken !== undefined) {
+                    nextPageToken = "&pageToken=" + nextPageToken;
+                } else {
+                    nextPageToken = "";
+                }
+                $.ajax({
+                    type: "GET",
+                    url: "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=" + playlist_id + nextPageToken + "&key=AIzaSyAgBdacEWrHCHVPPM4k-AFM7uXg-Q__YXY",
+                    applicationType: "application/json",
+                    contentType: "json",
+                    success: function (data) {
+                        if (!ranOnce) {
+                            ranOnce = true;
+                            totalVideos = data.pageInfo.totalResults;
+                        }
+                        var nextToken = data.nextPageToken;
+                        for (var i in data.items) {
+                            var item = data.items[i];
+                            if (item.snippet.thumbnails !== undefined) {
+                                var name = Session.get("editingPlaylistName");
+                                if (PrivatePlaylists.find({
+                                        type: name,
+                                        "songs.id": item.snippet.resourceId.videoId
+                                    }, {songs: {$elemMatch: {id: item.snippet.resourceId.videoId}}}).count() !== 0) {
+                                    videosInPlaylist++;
+                                } else {
+                                    var percentage = ytImportQueue.length / (totalVideos - videosInvalid) * 100;
+                                    $("#import-progress").css({width: percentage + "%"});
+                                    ytImportQueue.push({id: item.snippet.resourceId.videoId});
+                                }
+                            } else {
+                                videosInvalid++;
+                            }
+                        }
+                        if (nextToken !== undefined) {
+                            makeAPICall(playlist_id, nextToken);
+                        } else {
+                            Session.set("importingPlaylist", false);
+                            $("#import-progress").css({width: "100%"});
+                            var failed = 0;
+                            var successful = 0;
+                            ytImportQueue.forEach(function(item) {
+                                Meteor.call("addVideoToPrivatePlaylist", Session.get("editingPlaylistName"), item.id, function(err, res) {
+                                    if (err) {
+                                        console.log(err);
+                                        failed++;
+                                    } else if (res) {
+                                        successful++;
+                                    }
+                                    checkDone();
+                                });
+                            });
+                            function checkDone() {
+                                if (failed + successful === ytImportQueue.length) {
+                                    var $toastContent = $('<span><strong>Imported songs. Success: ' + successful + '. Failed: ' + failed + '.</strong></span>');
+                                    Materialize.toast($toastContent, 2000);
+                                }
+                            }
+                        }
+                    },
+                    error: function() {
+                        Session.set("importingPlaylist", false);
+                        $("#import-progress").css({width: "0%"});
+                        $("#import-playlist-button").removeAttr("disabled");
+                        $("#import-playlist-button").removeClass("disabled");
+                        $("#playlist-url").removeAttr("disabled");
+                        $("#playlist-url").removeClass("disabled");
+                    }
+                })
+            }
+
+            makeAPICall(playlist_id);
+        }
+    },
     "click #create_playlist_submit": function() {
         var name = $("#create_playlist_name").val();
         var displayName = $("#create_playlist_display_name").val();

+ 3 - 0
app/client/scripts/helpers.js

@@ -809,6 +809,9 @@ Template.communityStation.helpers({
             Materialize.updateTextFields();
         }, 100);
         return CommunityStations.findOne({name: id});
+    },
+    importingPlaylist: function() {
+        return Session.get("importingPlaylist");
     }
 });
 

+ 10 - 0
app/client/templates/communityStation.html

@@ -258,6 +258,16 @@
                 <label for="search_for_song">Search for song to add</label>
             </div>
             <a class="waves-effect waves-light btn" id="search-song"><i class="material-icons left">search</i>Search</a>
+            <div class="input-field">
+                <input id="import_youtube_playlist_input" type="text" class="validate">
+                <label for="import_youtube_playlist_input">YouTube Playlist URL</label>
+            </div>
+            <a class="waves-effect waves-light btn" id="import-youtube-playlist"><i class="material-icons left">search</i>Import</a>
+            {{#if importingPlaylist}}
+                <div class="progress">
+                    <div class="determinate" id="import-progress" style="width: 0%"></div>
+                </div>
+            {{/if}}
             {{#if singleVideoResultsActive}}
                 <div id="single-video-results">
                     <div style="overflow: auto; height: 400px; margin-top: 1rem;">

+ 2 - 3
app/server/server.js

@@ -448,9 +448,8 @@ function CommunityStation(name) {
     var currentId = songs[currentSong];
 
     var song = songs[songs.indexOf(currentId)];
-    if (song === undefined) {
-        song = {id: "60ItHLz5WEA", duration: 213, title: "Alan Walker - Faded"};
-    }
+    if (song === undefined)
+        song = {};
     if (this.isPartyModeEnabled()) {
         var res = CommunityStations.update({name: name}, {
             $set: {