FreeTube/src/renderer/store/modules/invidious.js

161 lines
4.2 KiB
JavaScript

import $ from 'jquery'
import fs from 'fs'
const state = {
currentInvidiousInstance: '',
invidiousInstancesList: null,
isGetChannelInfoRunning: false
}
const getters = {
getIsGetChannelInfoRunning(state) {
return state.isGetChannelInfoRunning
},
getCurrentInvidiousInstance(state) {
return state.currentInvidiousInstance
},
getInvidiousInstancesList(state) {
return state.invidiousInstancesList
}
}
const actions = {
async fetchInvidiousInstances({ commit }, payload) {
const requestUrl = 'https://api.invidious.io/instances.json'
let response
let instances = []
try {
response = await $.getJSON(requestUrl)
instances = response.filter((instance) => {
if (instance[0].includes('.onion') || instance[0].includes('.i2p')) {
return false
} else {
return true
}
}).map((instance) => {
return instance[1].uri.replace(/\/$/, '')
})
} catch (err) {
console.log(err)
// Starts fallback strategy: read from static file
// And fallback to hardcoded entry(s) if static file absent
const fileName = 'invidious-instances.json'
/* eslint-disable-next-line */
const fileLocation = payload.isDev ? './static/' : `${__dirname}/static/`
if (fs.existsSync(`${fileLocation}${fileName}`)) {
console.log('reading static file for invidious instances')
const fileData = fs.readFileSync(`${fileLocation}${fileName}`)
instances = JSON.parse(fileData).map((entry) => {
return entry.url
})
} else {
console.log('unable to read static file for invidious instances')
instances = [
'https://invidious.snopyta.org',
'https://invidious.kavin.rocks/'
]
}
}
commit('setInvidiousInstancesList', instances)
},
setRandomCurrentInvidiousInstance({ commit, state }) {
const instanceList = state.invidiousInstancesList
const randomIndex = Math.floor(Math.random() * instanceList.length)
commit('setCurrentInvidiousInstance', instanceList[randomIndex])
},
invidiousAPICall({ state }, payload) {
return new Promise((resolve, reject) => {
const requestUrl = state.currentInvidiousInstance + '/api/v1/' + payload.resource + '/' + payload.id + '?' + $.param(payload.params)
$.getJSON(requestUrl, (response) => {
resolve(response)
}).fail((xhr, textStatus, error) => {
console.log(xhr)
console.log(textStatus)
console.log(requestUrl)
console.log(error)
reject(xhr)
})
})
},
invidiousGetChannelInfo({ commit, dispatch }, channelId) {
return new Promise((resolve, reject) => {
commit('toggleIsGetChannelInfoRunning')
const payload = {
resource: 'channels',
id: channelId,
params: {}
}
dispatch('invidiousAPICall', payload).then((response) => {
resolve(response)
}).catch((xhr) => {
console.log('found an error')
console.log(xhr)
commit('toggleIsGetChannelInfoRunning')
reject(xhr)
})
})
},
invidiousGetPlaylistInfo({ commit, dispatch }, payload) {
return new Promise((resolve, reject) => {
dispatch('invidiousAPICall', payload).then((response) => {
resolve(response)
}).catch((xhr) => {
console.log('found an error')
console.log(xhr)
commit('toggleIsGetChannelInfoRunning')
reject(xhr)
})
})
},
invidiousGetVideoInformation({ dispatch }, videoId) {
return new Promise((resolve, reject) => {
const payload = {
resource: 'videos',
id: videoId,
params: {}
}
dispatch('invidiousAPICall', payload).then((response) => {
resolve(response)
}).catch((xhr) => {
console.log('found an error')
console.log(xhr)
reject(xhr)
})
})
}
}
const mutations = {
toggleIsGetChannelInfoRunning(state) {
state.isGetChannelInfoRunning = !state.isGetChannelInfoRunning
},
setCurrentInvidiousInstance(state, value) {
state.currentInvidiousInstance = value
},
setInvidiousInstancesList(state, value) {
state.invidiousInstancesList = value
}
}
export default {
state,
getters,
actions,
mutations
}