|
var folderId = "1T4U5WK0gpoGzfrZW76UIObsg6YNwHLaP"; // id of the folder |
|
var showName = "LOST"; // name of the show |
|
var seasonOverride; |
|
|
|
function run() { |
|
|
|
var episodes = getEpisodeList_(); |
|
var files = getVideoFilesInFolder_(folderId); |
|
|
|
for (var i in files) { |
|
|
|
var fileName = files[i].getName(); |
|
var fileExtension = fileName.split('.').pop(); |
|
var numbers = parse_(fileName); |
|
|
|
Logger.log(numbers); |
|
|
|
// get the episode in our tvdb list |
|
var episode; |
|
for (var j in episodes) { |
|
if (numbers.episode && numbers.episode[1]) { |
|
if (episodes[j].airedSeason == numbers.season[1] && episodes[j].airedEpisodeNumber == numbers.episode[1]) { |
|
episode = episodes[j]; |
|
break; |
|
} |
|
} |
|
} |
|
|
|
if (!episode || !numbers.episode) { |
|
Logger.log("Couldn't find an episode for " + fileName); |
|
continue; |
|
} |
|
|
|
Logger.log("Matched " + fileName + " to TVDB Season " + numbers.season[1] + " Episode " + numbers.episode[1] + ". Renaming..."); |
|
|
|
files[i].setName(showName + " S" + numbers.season[1] + "E" + numbers.episode[1] + " - " + episode.episodeName + "." + fileExtension); |
|
|
|
} |
|
|
|
} |
|
|
|
function getEpisodeList_() { |
|
|
|
var param = {"headers": {"Authorization": "Bearer " + PropertiesService.getScriptProperties().getProperty("token")}}; |
|
|
|
try { |
|
var search = UrlFetchApp.fetch("https://api.thetvdb.com/search/series?name=" + showName, param).getContentText(); |
|
search = JSON.parse(search); |
|
} |
|
catch(e) { |
|
refreshLogin_(); |
|
param = {"headers": {"Authorization": "Bearer " + PropertiesService.getScriptProperties().getProperty("token")}}; |
|
var search = UrlFetchApp.fetch("https://api.thetvdb.com/search/series?name=" + showName, param).getContentText(); |
|
search = JSON.parse(search); |
|
} |
|
|
|
Logger.log("Found " + search.data[0].seriesName + "..."); |
|
|
|
showname = search.data[0].seriesName; |
|
var showId = search.data[0].id; |
|
|
|
var episodesList = UrlFetchApp.fetch("https://api.thetvdb.com/series/" + showId + "/episodes", param).getContentText(); |
|
episodesList = JSON.parse(episodesList); |
|
|
|
var episodes = episodesList.data; |
|
|
|
// if there is pagation on the results (100 per page), grab the next ones and add them to the array |
|
while (episodesList.links.next) { |
|
var episodesList = UrlFetchApp.fetch("https://api.thetvdb.com/series/" + showId + "/episodes?page=" + episodesList.links.next, param).getContentText(); |
|
episodesList = JSON.parse(episodesList); |
|
episodes = episodes.concat(episodesList.data); |
|
} |
|
|
|
// we now have the full list |
|
|
|
// Logger.log(JSON.stringify(episodes)); |
|
// Logger.log(episodes.length); |
|
|
|
return episodes; |
|
|
|
} |
|
|
|
function refreshLogin_() { |
|
var api = {"apikey": "V2XMYATYE81YASDF", "username": "username123", "userkey": "T8ZP6EYL5QX5ASDF"}; // dummy info, edit these |
|
try { |
|
var token = PropertiesService.getScriptProperties().getProperty("token"); |
|
var refresh = UrlFetchApp.fetch("https://api.thetvdb.com/refresh_token", {"headers": {"Authorization": "Bearer " + token}}).getContentText(); |
|
refresh = JSON.parse(refresh); |
|
refresh = refresh.token; |
|
PropertiesService.getScriptProperties().setProperty("token", refresh); |
|
Logger.log("Token refreshed"); |
|
} |
|
catch(e) { |
|
Logger.log("Not authorized yet. Authorizing..."); |
|
var login = UrlFetchApp.fetch("https://api.thetvdb.com/login", {"method": "post", "payload": JSON.stringify(api), "headers": {"Accept": "application/json", "Content-Type": "application/json"}}).getContentText(); |
|
login = JSON.parse(login); |
|
login = login.token; |
|
PropertiesService.getScriptProperties().setProperty("token", login); |
|
} |
|
return PropertiesService.getScriptProperties().getProperty("token"); |
|
} |
|
|
|
function getVideoFilesInFolder_(folderId) { |
|
|
|
var files = []; |
|
|
|
// files in root |
|
var fileIterator = DriveApp.getFolderById(folderId).getFiles(); |
|
while (fileIterator.hasNext()) { |
|
var file = fileIterator.next(); |
|
if (file.getMimeType().indexOf("video") > -1) { |
|
files.push(file); |
|
} |
|
} |
|
|
|
// get folders |
|
var subfolders = []; |
|
var folderIterator = DriveApp.getFolderById(folderId).getFolders(); |
|
while (folderIterator.hasNext()) { |
|
var folder = folderIterator.next(); |
|
subfolders.push(folder); |
|
} |
|
// and add their contents too |
|
for (var i in subfolders) { |
|
var subfolderFiles = getVideoFilesInFolder_(subfolders[i].getId()); |
|
files = files.concat(subfolderFiles); |
|
} |
|
|
|
return files; |
|
|
|
} |
|
|
|
function fixExtensions() { |
|
|
|
var files = getVideoFilesInFolder_(folderId); |
|
|
|
for (var i in files) { |
|
var fileName = files[i].getName(); |
|
var fileExtension = fileName.split('.').pop(); |
|
if (fileExtension.length > 4) { |
|
var mimetype = files[i].getMimeType(); |
|
var extension = getExtensionForMimeType_(mimetype); |
|
Logger.log("Adding " + extension + " extension to " + fileName); |
|
files[i].setName(files[i].getName() + "." + extension); |
|
} |
|
} |
|
|
|
} |
|
|
|
function getExtensionForMimeType_(mime) { |
|
switch(mime.trim().toLowerCase()) { |
|
case "video/mp4": |
|
return "mp4"; |
|
break; |
|
case "video/x-matroska": |
|
return "mkv"; |
|
break; |
|
case "video/webm": |
|
return "webm"; |
|
break; |
|
case "video/quicktime": |
|
return "mov"; |
|
break; |
|
case "video/x-m4v": |
|
return "m4v"; |
|
break; |
|
case "video/x-msvideo": |
|
return "avi"; |
|
break; |
|
case "video/mpeg": |
|
return "mpg"; |
|
break; |
|
case "video/ogg": |
|
return "ogv"; |
|
break; |
|
case "video/3gpp": |
|
return "3gp"; |
|
break; |
|
case "video/3gpp2": |
|
return "3g2"; |
|
break; |
|
default: |
|
throw "Unrecgonized video mimetype: " + mime; |
|
} |
|
} |