$(document).foundation(); // How many chars at most for the description. var maxcharstablefield = 200; // Bind to the form for submitting a new channel var addchanel0 = new Vue({ el: '#addchanel-0', data: { entry: { title: "", description: "", yTChannelID: "", thumbnailURL: "", }, fail: false, expanded: false }, template: `

Add new Channel

Title
Channel
Description
`, methods: { submit: function (event) { // Send the channel to our API and request tables be updated. var d = this.entry; axios.post('/api_raw/Channels/' + this.entry.yTChannelID) .then(function (response) { this.entry.title = ""; this.entry.description = ""; this.entry.yTChannelID = ""; this.entry.thumbnailURL = ""; this.expanded = false; tbody0.retrieve(); setTimeout(() => videostb.retrieve(), 1000); }.bind(this)) .catch(function (error) { console.log(error); }); }, // Handle when user put in a new URL (verification and thumbnail fetch) newurl: function (event) { // Remove any potential youtube URL from the field. var ytchurl = "https://www.youtube.com/channel/"; if (this.entry.yTChannelID.startsWith(ytchurl)) { this.entry.yTChannelID = this.entry.yTChannelID.replace(ytchurl, ""); } // Check if what remains looks like a youtube channel ID. if (this.entry.yTChannelID.length != "UCyS4xQE6DK4_p3qXQwJQAyA".length) { this.fail = true; return; } this.fail = false; // Get the Channel URL var basestr = 'https://www.googleapis.com/youtube/v3/channels?part=snippet%2CcontentDetails%2Cstatistics'; var apikey = '&key=AIzaSyCuIYkMc5SktlnXRXNaDf2ObX-fQvtWCnQ ' var channel = '&id=' + addchanel0.entry.yTChannelID; axios.get(basestr + channel + apikey) .then(function (response) { // Only attempt to fill the UI text boxes if they are empty. if (this.entry.description.length == 0) { this.entry.description = response.data.items[0].snippet.description; } if (this.entry.title.length == 0) { this.entry.title = response.data.items[0].snippet.title; } // Get client to load the thumbnail this.entry.thumbnailURL = response.data.items[0].snippet.thumbnails.medium.url; }.bind(this)) .catch(function (error) { console.log(error); }); } } }); // Bind to our table of entries. var tbody0 = new Vue({ el: '#subbedchannelstable-0', data: { entries: [""] }, template: `
ID Title Description Actions
{{entry.id}} {{entry.title}} {{entry.description}}
`, methods: { retrieve: function (event) { axios.get('/api/Channels') .then(function (response) { // Wipe out all old entries. this.entries = []; // And fill it with all the retrieved entries. response.data.forEach(function (x) { if (x.description.length > maxcharstablefield) { x.description = x.description.substring(0, maxcharstablefield) + " ..."; } this.entries.push(x); }.bind(this)); }.bind(this)) .catch(function (error) { console.log(error); }); }, forcerefresh: function (event) { axios .post('/api/Admin/Update/' + event.target.id) .catch(function (error) { console.log(error); }); }, deletechannel: function (event) { axios .delete('/api/Channels/' + event.target.id) .catch(function (error) { console.log(error); }); } } }); // Bind to our table of entries. var apistatus = new Vue({ el: '#apistatus-0', data: { apiaccessible: false, updatingjobactive: false }, template: `
API Status
Video Fetching Status
`, methods: { update: function (event) { axios.get('/api/Admin/Update') .then(function (response) { this.apiaccessible = (response.status == 200); this.updatingjobactive = (response.data != "false") }.bind(this) ) .catch(function (error) { console.log(error); }); } } }); // Grid of images. var videostb = new Vue({ el: '#videosindbtable-0', data: { Videos: [] }, template: `
ID Title Description Channel
{{video.id}} {{video.title}} {{video.description}} {{video.channel}}
`, methods: { // Get new videos from the web api. retrieve: function (event) { axios.get('/api/Videos') .then(function (response) { // And fill it with all the retrieved entries. response.data.forEach(function (x) { // Trim description if needed. if (x.description.length > maxcharstablefield) { x.description = x.description.substring(0, maxcharstablefield) + " ..."; } // Add it to our array this.Videos.push(x); }.bind(this)); }.bind(this)) .catch(function (error) { console.log(error); }); } } }); window.addEventListener('load', function () { apistatus.update(); tbody0.retrieve(); videostb.retrieve(); });