Skip to content

Commit

Permalink
Subtitle upload
Browse files Browse the repository at this point in the history
- /uploadSubtitle API call
- append results into json_metadata
  • Loading branch information
techcoderx committed Apr 16, 2019
1 parent cd3c494 commit 2700fe5
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 3 deletions.
52 changes: 50 additions & 2 deletions client/uploader.js
Expand Up @@ -60,6 +60,11 @@ for(let i = 0; i < allLangCodes.length; i++) {
}
setTimeout(() => document.getElementById('languages').innerHTML = langOptions,200)

let subtitleList = []
let savedSubtitles = localStorage.getItem('OneLoveSubtitles')
if (savedSubtitles != null)
subtitleList = savedSubtitles

function tabBasicsClicked() {
document.getElementById('advanced').style.display = "none"
document.getElementById('subtitles').style.display = "none"
Expand Down Expand Up @@ -130,6 +135,12 @@ function reenableFieldsImg() {
document.getElementById('submitbutton').disabled = false;
}

function reenableSubtitleFields() {
document.getElementById('newLanguageField').disabled = false
document.getElementById('chooseSubBtn').disabled = false
document.getElementById('uploadSubBtn').disabled = false
}

function submitVideo() {
// Validate data entered
let postBody = document.getElementById('postBody').value;
Expand Down Expand Up @@ -312,6 +323,10 @@ function buildJsonMetadata(sourceHash,snapHash,spriteHash,video240Hash,video480H
tags: SteemTags,
app: 'onelovedtube/0.8.4',
}

if (subtitleList.length > 0)
jsonMeta.video.content.subtitles = subtitleList

return jsonMeta;
}

Expand Down Expand Up @@ -405,11 +420,18 @@ function updateProgressBar(progress) {
}

// Subtitles
let chosenSubtitleContent = ''

function subtitleFileSelected() {
if (document.getElementById('subtitleUpload').files.length == 0)
if (document.getElementById('subtitleUpload').files.length == 0) {
document.getElementById('chooseSubBtn').innerHTML = 'Choose subtitle file'
else
chosenSubtitleContent = ''
} else {
document.getElementById('chooseSubBtn').innerHTML = 'Change subtitle file'
let reader = new FileReader()
reader.onload = (r) => chosenSubtitleContent = r.target.result
reader.readAsText(document.getElementById('subtitleUpload').files[0])
}
}

function uploadSubtitle() {
Expand All @@ -427,6 +449,31 @@ function uploadSubtitle() {
document.getElementById('chooseSubBtn').disabled = true
document.getElementById('uploadSubBtn').disabled = true

const contentType = {
headers: {
"content-type": "text/plain"
}
}

axios.post('/uploadSubtitle?access_token=' + token,chosenSubtitleContent,contentType).then((response) => {
let selectedLangCode = langNameList.indexOf(selectedLanguage)
subtitleList.push({
lang: allLangCodes[selectedLangCode],
hash: response.data.hash
})
console.log(subtitleList)

// Reset fields
document.getElementById('chooseSubBtn').innerHTML = 'Choose subtitle file'
document.getElementById('newLanguageField').value = ''
chosenSubtitleContent = ''
reenableSubtitleFields()
}).catch((err) => {
reenableSubtitleFields()
if (err.response.data.error) alert(err.response.data.error)
else alert(err)
})

return true
}

Expand All @@ -436,6 +483,7 @@ function saveAsDraft() {
localStorage.setItem('OneLoveDescription',document.getElementById('description').value);
localStorage.setItem('OneLoveTags',document.getElementById('tags').value);
localStorage.setItem('OneLovePostBody',document.getElementById('postBody').value);
localStorage.setItem('OneLoveSubtitles',subtitleList)
alert('Metadata saved as draft!')
}

Expand Down
2 changes: 1 addition & 1 deletion dbManager.js
Expand Up @@ -5,7 +5,7 @@ const fs = require('fs')
let usageData = JSON.parse(fs.readFileSync('db/usage.json','utf8'))
let hashes = JSON.parse(fs.readFileSync('db/hashes.json','utf8'))

let possibleTypes = ['videos','thumbnails','sprites','images','video240','video480','video720','video1080']
let possibleTypes = ['videos','thumbnails','sprites','images','video240','video480','video720','video1080','subtitles']

let db = {
// Check if user exist in hashes db
Expand Down
4 changes: 4 additions & 0 deletions index.js
Expand Up @@ -149,6 +149,10 @@ app.post('/uploadImage',ImageUploadAPILimiter,(request,response) => {
Authenticate(request,response,(user) => FileUploader.uploadImage(user,request,response))
})

app.post('/uploadSubtitle',APILimiter,(request,response) => {
Authenticate(request,response,(user) => FileUploader.uploadSubtitles(user,request,response))
})

app.get('/usage',APILimiter, CORS(), (request,response) => {
// API to get usage info
if (!Config.UsageLogs) return response.send('Logs are disabled therefore API is not available for usage.');
Expand Down
24 changes: 24 additions & 0 deletions ipfsUploadHandler.js
Expand Up @@ -5,6 +5,7 @@ const getDuration = require('get-video-duration')
const fs = require('fs')
const async = require('async')
const sanitize = require('sanitize-filename')
const WebVTT = require('node-webvtt')
const Config = require('./config.json')
const db = require('./dbManager')

Expand Down Expand Up @@ -183,6 +184,29 @@ let uploadOps = {
})
}))
})
},
uploadSubtitles: (username,request,response) => {
try {
WebVTT.parse(request.body)
} catch (err) {
return response.status(400).send({error: 'Subtitle error: ' + err})
}

let subtitleBuffer = new Buffer.from(request.body,'utf8')
ipfsAPI.add(subtitleBuffer,(err,result) => {
if (err) return response.status(500).send({error: 'IPFS error: ' + err})
if (Config.UsageLogs) {
db.recordUsage(username,'subtitles',result[0].size)
db.writeUsageData()
}

db.recordHash(username,'subtitles',result[0].hash)
db.writeHashesData()

response.send({
hash: result[0].hash
})
})
}
}

Expand Down
8 changes: 8 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Expand Up @@ -23,6 +23,7 @@
"ipfs-http-client": "^28.1.1",
"jsonwebtoken": "^8.4.0",
"multer": "^1.4.1",
"node-webvtt": "^1.3.0",
"sanitize-filename": "^1.6.1",
"shelljs": "^0.8.2",
"steem": "^0.7.4",
Expand Down

0 comments on commit 2700fe5

Please sign in to comment.