Перебирайте папки / подпапки / файлы на Google Диске и получайте продолжительность видео - PullRequest
1 голос
/ 19 марта 2020

Моя цель - рассчитать общую длину (в секундах) всех видео во всех подкаталогах папки Google Диска.

Я следовал ответу отсюда: Перебирайте папки / подпапки / файлы на Google Диске , чтобы попытаться создать скрипт, который перебирает все каталоги в папке и захватывает количество файлов, а также имя файла и продолжительность видео, если файл является видео.

В настоящее время я использую:

function testTraverse(){
  var originFolder = DriveApp.getFoldersByName('All Media').next(); 
  var totalCount = traverseFolder(originFolder,0);
  Logger.log('total files = '+totalCount);
}

 function getVideoDuration(folder,folderId, files) {  
  var q = "'" + folderId + "' in parents and trashed=false";
  var fields = "files(mimeType,name,videoMediaMetadata)"; 
  var url = "https://www.googleapis.com/drive/v3/files?q=" + encodeURIComponent(q) + "&fields=" + encodeURIComponent(fields) + "&access_token=" + ScriptApp.getOAuthToken();
  var res = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
  var obj = JSON.parse(res);  

   for (var i = 0; i < obj.files.length; i++) {
      sum += obj.files[i].videoMediaMetadata.durationMillis / 1000; 
   }
   Logger.log("Total duration: " + sum);    
 }

function traverseFolder(folder,total) {
  var name = folder.getName();
  var count = 0;
  var files = folder.getFiles();     
  var folderId = folder.getId();     


  while (files.hasNext()) {
    count++; 
    getVideoDuration(folderId, files);

  }

  var subs = folder.getFolders();
  while (subs.hasNext()) {
    total+=traverseFolder(subs.next(),count);
  }
  return total;
}

Выполнение вышеуказанного выдает ошибку из строки: for (var i = 0; i < obj.files.length; i++):

Cannot read property 'length' of undefined

Что сбивает с толку, потому что я в каталоге с несколькими файлами.

И функция, с которой я далеко ухожу, - это getVideoDuration, которую я использовал из примера сценария из ответа здесь: Как программно получить продолжительность файла (видео) файла Google Drive? .

Мой желаемый результат - рассчитать общую продолжительность (в секундах) всех видео во всех подкаталогах.

Есть ли более простой способ сделать это?

1 Ответ

2 голосов
/ 19 марта 2020
  • Вы хотите получить все файлы из всех подпапок в указанной папке c.
  • Из полученных файлов вы хотите получить только видеофайлы. И вы хотите получить количество файлов, имен файлов и общую длину видеофайлов.
  • Вы хотите добиться этого с помощью скрипта Google Apps.

Если мое понимание верно как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки модификации:

  • Я думаю, что ваша ошибка Cannot read property 'length' of undefined вызвана следующими двумя причинами.
    1. О getVideoDuration(folderId, files) в traverseFolder, вы отправляете folderId, files в качестве аргументов. Но при функции getVideoDuration сценарий getVideoDuration(folder,folderId, files). При этом идентификатор папки не используется. Кроме того, files не используется в getVideoDuration.
    2. Начиная с этого официального документа , параметр запроса access_token теперь нельзя использовать. Поэтому необходимо использовать токен доступа в заголовке запроса. Я думал, что я изменил свои ответы, связанные с этим. Но я забыл изменить этот ответ . Я прошу прощения за это.
  • sum не объявлено. При этом возникает ошибка.
  • Когда файлы, кроме видео, находятся в папке, ошибка возникает в obj.files[i].videoMediaMetadata.durationMillis.

Когда вышеуказанные точки отражаются в вашем сценарии, это делается следующим образом.

Модифицированный скрипт:

// Please run this function.
function testTraverse() {
  var originFolder = DriveApp.getFoldersByName('All Media').next(); 
  var res = traverseFolder(originFolder, {totalLength: 0, totalFiles: 0, filenames: []});
  Logger.log(res)
}

function getVideoDuration(folderId, o) {
  var q = "'" + folderId + "' in parents and trashed=false";
  var fields = "files(mimeType,name,videoMediaMetadata)"; 
  var url = "https://www.googleapis.com/drive/v3/files?q=" + encodeURIComponent(q) + "&fields=" + encodeURIComponent(fields);
  var res = UrlFetchApp.fetch(url, {muteHttpExceptions: true, headers: {authorization: "Bearer " + ScriptApp.getOAuthToken()}});
  var obj = JSON.parse(res);
  for (var i = 0; i < obj.files.length; i++) {
    var file = obj.files[i];
    if (file.hasOwnProperty("videoMediaMetadata")) {
      o.filenames.push(file.name);
      o.totalFiles++;
      o.totalLength += file.videoMediaMetadata.durationMillis / 1000;
    }
  }
 }

function traverseFolder(folder, obj) {
  var name = folder.getName();
  var count = 0;
  var files = folder.getFiles();
  var folderId = folder.getId();
  if (files.hasNext()) getVideoDuration(folderId, obj);
  var subs = folder.getFolders();
  while (subs.hasNext()) {
    traverseFolder(subs.next(), obj);
  }
  return obj;
}
  • В этом случае результат возвращает объект типа {totalLength: ##, totalFiles: ##, filenames: [###]}. totalLength, totalFiles и filenames - общая длина видео, общее количество видеофайлов и имена файлов видеофайлов соответственно.

Примечание:

  • К сожалению, я не уверен насчет mimeTypes ваших видеофайлов. Поэтому, если mimeTypes найдены, я думаю, что стоимость процесса может быть немного снижена. Поскольку файлы могут быть извлечены с помощью mimeTypes.
  • Я думаю, что этот модифицированный скрипт можно запускать с V8 и без него.

Ссылка:

Если я неправильно понял ваш вопрос и это не то направление, которое вы хотите, я приношу свои извинения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...