按顺序播放位于 Google Drive 中的多个音乐文件

问题描述 投票:0回答:2

现在,我们的 Google 云端硬盘中保存了音乐 CD,因此多个教室都可以访问它们。但是,第一首歌曲将播放,而不会继续播放第二首、第三首等。有解决办法吗?或者有没有办法使用 Apps 脚本告诉它播放文件夹中的所有歌曲?

google-apps-script audio-player
2个回答
0
投票

不幸的是,Google Drive 无法连续播放音乐文件。您无法使用 Google Apps 脚本播放文件夹中的所有歌曲。考虑使用音乐播放器应用或服务来连续播放。您可以使用 Google Drive API 和 Python 等编程语言来创建一个脚本,按顺序播放文件夹中的所有歌曲。下面是一个示例,说明如何使用 pydrive 库进行 Google Drive 访问和 pygame 库进行音频播放来实现此目的。


0
投票

这是一个网络应用程序,我每天早上用它来听音乐。唯一需要注意的是,如果您在其中一个选择停止之前离开此页面,则必须返回此页面,否则它将不会继续播放所有选择,除非 Web 应用程序是当前选择的页面。

该脚本在电子表格上创建一个播放列表,允许您通过一列复选框选择当前想要收听的音乐。

您需要稍微摆弄一下,因为它是我为我编写的,因此它可能有一些对我来说是独一无二的默认设置。

html:music1.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <style>
      label{margin:2px 10px;}
    </style>
  </head>
  <script>
    var selectionList=["BarbaraAnn.mp3","Don't Let Me Come Home a Stranger.mp3"];
    var gVolume=0.2;
    var index=0;
    $(function(){
       document.getElementById('msg').innerHTML="Loading Playlist";
       google.script.run
       .withSuccessHandler(function(Obj){
         selectionList=Obj.playlist;
         console.log(Obj.playlist);
         document.getElementById('list').innerHTML=Obj.html;
         google.script.run
         .withSuccessHandler(function(fObj){
           $('#audio1').attr('src',fObj.uri);
           var audio=document.getElementById("audio1");
           audio.volume=gVolume;
           audio.onended=function() {
             document.getElementById('status').innerHTML='Ended...';
             playnext();
           }
           var msg=document.getElementById('msg');
           msg.innerHTML="Click play to begin playlist. Additional selections will begin automatically";        
           audio.onplay=function() {
             document.getElementById('msg').innerHTML='Playing: ' + selectionList[index-1];
             document.getElementById('status').innerHTML='Playing...';
             document.getElementById('skipbtn').disabled=false;
           }
           audio.onvolumechange=function(){
             gVolume=audio.volume;
           }         
         })
         .convMediaToDataUri(selectionList[index++]);
       })
       .getPlaylist();
    });
    
    function playnext() {
      if(index<selectionList.length) {
        document.getElementById('status').innerHTML='Loading...';
        document.getElementById('msg').innerHTML='Next Selection: ' + selectionList[index];
        google.script.run
        .withSuccessHandler(function(fObj){
          $('#audio1').attr('src',fObj.uri);
          var audio=document.getElementById('audio1');
          audio.onended = '':
          audio.volume=gVolume;
          audio.play();
        })
        .convMediaToDataUri(selectionList[index++]);
      }else{
        document.getElementById('status').innerHTML='Playlist Complete';
        document.getElementById('msg').innerHTML='';
        document.getElementById('cntrls').innerHTML='<input type="button" value="Replay Playlist" onClick="replayPlaylist()" />';
      }
    }
   function replayPlaylist() {
     index=0;
     document.getElementById('cntrls').innerHTML='';
     playnext();
   }
   function skip() {
     var audio=document.getElementById('audio1');
     document.getElementById('skipbtn').disabled=true;
     audio.pause();
     playnext();
   }
   function playThis(idx) {
     index=idx;
     var audio=document.getElementById('audio1');
     //audio.pause();
     playnext();
   }
  </script>
  <body>
    <div id="msg"></div>
    <audio controls id="audio1" src=""></audio><br />
    <div id="status"></div>
    <div><input type="button" id="skipbtn" value="Skip" onClick="skip()" disabled /></div>
    <div id="cntrls"></div>
    <div id="list"></div>
  </body>
</html>

gs:

function onOpen() {
  SpreadsheetApp.getUi().createMenu('My Music')
  .addItem('Launch Music', 'launchMusicDialog')
  .addItem('Create New Music List', 'createMusicList')
  .addToUi();
}

function convMediaToDataUri(filename){
  var filename=filename || "You Make Loving Fun.mp3";
  var folder=DriveApp.getFolderById("folderid");
  var files=folder.getFilesByName(filename);
  var n=0;
  while(files.hasNext()) {
    var file=files.next();
    n++;
  }
  if(n==1) {
    var blob=file.getBlob();
    var b64DataUri='data:' + blob.getContentType() + ';base64,' + Utilities.base64Encode(blob.getBytes());
    Logger.log(b64DataUri)
    var fObj={filename:file.getName(),uri:b64DataUri}
    return fObj;
  }
  throw("Multiple Files with same name.");
  return null;
}


function launchMusicDialog() {
  var userInterface=HtmlService.createHtmlOutputFromFile('music1');
  SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Music');
}


function doGet() {
  return HtmlService.createHtmlOutputFromFile('music1').addMetaTag('viewport', 'width=device-width, initial-scale=1');
}

function createMusicList() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("MusicList");
  var folder=DriveApp.getFolderById("folderid");
  var files=folder.getFiles();
  var mA=[['Item','File Name','File Type','File Id','Play List']];
  sh.clearContents()
  var n=1;
  while(files.hasNext()) {
    var file=files.next();
    mA.push([n++,file.getName(),file.getMimeType(),file.getId(),'']);
  }
  sh.getRange(1,1,mA.length,mA[0].length).setValues(mA);
  sh.getRange(2,2,sh.getLastRow()-1,sh.getLastColumn()-1).sort({column:2,ascending:true});
  sh.getRange(2,5,sh.getLastRow()-1,1).insertCheckboxes();
}

function getPlaylist() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('MusicList');
  var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
  var vA=rg.getValues();
  var pl=[];
  var idx=0;
  var html='<style>th,td{border:1px solid black;}</style><table><tr><th>Index</th><th>Item</th><th>FileName</th><th>&nbsp;</th></tr>';
  for(var i=0;i<vA.length;i++) {
    if(vA[i][4]) {
      pl.push(vA[i][1]);
      html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td><td><input type="button" value="Play This" onClick="playThis(%s)" /></td></tr>',idx,vA[i][0],vA[i][1],idx++);
    }
  }
  html+='</table>';
  return {playlist:pl,html:html};
}

有几个默认列表和 ID,您在首次设置时必须进行修改。我写这篇文章是为了我自己,而不是为了其他经验较少的用户。它已经工作了六年多了。

© www.soinside.com 2019 - 2024. All rights reserved.