ImportSongs: Add Google Drive support
- Adds a new page for importing custom songs, where it is possible to pick a local folder (desktop only) or a Google Drive folder (desktop and Android)
- This feature is disabled on iOS due to the lack of OGG audio support in the browser
- In order to not get rate limited, a TJA file is parsed for metadata only when the song is clicked in the song selection, rather than all at once at import time
- The instance maintainer will need to provide the API credentials in the config.py file to enable this feature
- This requires a new project to be created at console.cloud.google.com
- Drive API will have to be enabled
- API and OAuth keys should be created
- API key can be restricted to only have Google Drive and Google Picker APIs
- OAuth Client ID should have Web Application type and JavaScript origins set
- Editing the OAuth consent screen to have a name and icon is recommended
- It is semi-required to submit the consent screen for verification as the permission to download all of the Drive files will be asked.
- Note that the email of the maintainer is publicly visible on the consent screen
- The project number can be found in the IAM & Admin settings page
This commit is contained in:
@@ -5,24 +5,11 @@
|
||||
pageEvents.add(window, ["click", "touchend", "keypress"], this.pageClicked.bind(this))
|
||||
this.gainList = []
|
||||
}
|
||||
load(url, local, gain){
|
||||
if(local){
|
||||
var reader = new FileReader()
|
||||
var loadPromise = pageEvents.load(reader).then(event => {
|
||||
return event.target.result
|
||||
})
|
||||
reader.readAsArrayBuffer(url)
|
||||
}else{
|
||||
var loadPromise = loader.ajax(url, request => {
|
||||
request.responseType = "arraybuffer"
|
||||
})
|
||||
}
|
||||
return loadPromise.then(response => {
|
||||
load(file, gain){
|
||||
return file.arrayBuffer().then(response => {
|
||||
return new Promise((resolve, reject) => {
|
||||
return this.context.decodeAudioData(response, resolve, reject)
|
||||
}).catch(error => {
|
||||
throw [error, url]
|
||||
})
|
||||
}).catch(error => Promise.reject([error, file.url]))
|
||||
}).then(buffer => {
|
||||
return new Sound(gain || {soundBuffer: this}, buffer)
|
||||
})
|
||||
@@ -90,8 +77,8 @@ class SoundGain{
|
||||
}
|
||||
this.setVolume(1)
|
||||
}
|
||||
load(url, local){
|
||||
return this.soundBuffer.load(url, local, this)
|
||||
load(url){
|
||||
return this.soundBuffer.load(url, this)
|
||||
}
|
||||
convertTime(time, absolute){
|
||||
return this.soundBuffer.convertTime(time, absolute)
|
||||
@@ -134,7 +121,7 @@ class Sound{
|
||||
this.sources = new Set()
|
||||
}
|
||||
copy(gain){
|
||||
return new Sound(gain, this.buffer)
|
||||
return new Sound(gain || this.gain, this.buffer)
|
||||
}
|
||||
getTime(){
|
||||
return this.soundBuffer.getTime()
|
||||
|
||||
Reference in New Issue
Block a user