mysql - record and check state of local files #32
12 changed files with 140 additions and 25 deletions
|
@ -1,5 +1,8 @@
|
|||
{
|
||||
"WalletConfig": {
|
||||
"lbryAddress": "LBRY_WALLET_ADDRESS"
|
||||
},
|
||||
"Database": {
|
||||
"MySqlConnectionUri": "MYSQL_CONNECTION_STRING"
|
||||
}
|
||||
}
|
|
@ -4,5 +4,9 @@
|
|||
},
|
||||
"AnalyticsConfig":{
|
||||
"googleId": "none"
|
||||
},
|
||||
"Database": {
|
||||
"MySqlConnectionUri": "none",
|
||||
"DownloadAddress": "C:\\lbry\\speech\\hosted_content"
|
||||
}
|
||||
}
|
|
@ -4,5 +4,8 @@
|
|||
},
|
||||
"AnalyticsConfig":{
|
||||
"googleId": "UA-100747990-1"
|
||||
},
|
||||
"Database": {
|
||||
"MySqlConnectionUri": "none"
|
||||
}
|
||||
}
|
|
@ -4,5 +4,9 @@
|
|||
},
|
||||
"AnalyticsConfig":{
|
||||
"googleId": "UA-60403362-2"
|
||||
},
|
||||
"Database": {
|
||||
"MySqlConnectionUri": "none",
|
||||
"DownloadAddress": "~/Downloads/"
|
||||
}
|
||||
}
|
12
config/test.json
Normal file
12
config/test.json
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"WalletConfig": {
|
||||
"lbryAddress": "none"
|
||||
},
|
||||
"AnalyticsConfig":{
|
||||
"googleId": "UA-100747990-1"
|
||||
},
|
||||
"Database": {
|
||||
"MySqlConnectionUri": "none",
|
||||
"DownloadAddress": "~/Downloads/"
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
var fs = require('fs');
|
||||
var lbryApi = require('../helpers/lbryApi.js');
|
||||
var lbryApi = require('./lbryApi.js');
|
||||
var config = require('config');
|
||||
var db = require("../models");
|
||||
|
||||
var walledAddress = config.get('WalletConfig.lbryAddress');
|
||||
|
||||
|
@ -14,10 +15,10 @@ function handlePublishError(error) {
|
|||
};
|
||||
}
|
||||
|
||||
function createPublishParams(name, filepath, license, nsfw) {
|
||||
function createPublishParams(name, filePath, license, nsfw) {
|
||||
var publishParams = {
|
||||
"name": name,
|
||||
"file_path": filepath,
|
||||
"file_path": filePath,
|
||||
"bid": 0.01,
|
||||
"metadata": {
|
||||
"description": name + " published via spee.ch",
|
||||
|
@ -25,7 +26,7 @@ function createPublishParams(name, filepath, license, nsfw) {
|
|||
"author": "spee.ch",
|
||||
"language": "en",
|
||||
"license": license,
|
||||
"nsfw": (nsfw.toLowerCase() === "true")
|
||||
"nsfw": nsfw
|
||||
},
|
||||
"claim_address": walledAddress,
|
||||
"change_address": walledAddress //requires daemon 0.12.2rc1 or above
|
||||
|
@ -33,33 +34,41 @@ function createPublishParams(name, filepath, license, nsfw) {
|
|||
return publishParams;
|
||||
}
|
||||
|
||||
function deleteTemporaryFile(filepath) {
|
||||
fs.unlink(filepath, function(err) {
|
||||
function deleteTemporaryFile(filePath) {
|
||||
fs.unlink(filePath, function(err) {
|
||||
if (err) throw err;
|
||||
console.log('successfully deleted ' + filepath);
|
||||
console.log('successfully deleted ' + filePath);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
publish: function(name, filepath, license, nsfw, socket, visitor) {
|
||||
publish: function(name, filePath, fileType, license, nsfw, socket, visitor) {
|
||||
nsfw = (nsfw.toLowerCase() === "true");
|
||||
// update the client
|
||||
socket.emit("publish-status", "Your image is being published (this might take a second)...");
|
||||
visitor.event("Publish Route", "Publish Request", filepath).send();
|
||||
// send to analytics
|
||||
visitor.event("Publish Route", "Publish Request", filePath).send();
|
||||
// create the publish object
|
||||
var publishParams = createPublishParams(name, filepath, license, nsfw);
|
||||
var publishParams = createPublishParams(name, filePath, license, nsfw);
|
||||
// get a promise to publish
|
||||
lbryApi.publishClaim(publishParams)
|
||||
.then(function(data){
|
||||
visitor.event("Publish Route", "Publish Success", filepath).send();
|
||||
visitor.event("Publish Route", "Publish Success", filePath).send();
|
||||
console.log("publish promise success. Tx info:", data)
|
||||
socket.emit("publish-complete", {name: name, result: data.result});
|
||||
deleteTemporaryFile(filepath);
|
||||
db.File.create({
|
||||
name: name,
|
||||
path: filePath,
|
||||
file_type: fileType,
|
||||
claim_id: data.result.claim_id,
|
||||
nsfw: nsfw,
|
||||
});
|
||||
})
|
||||
.catch(function(error){
|
||||
visitor.event("Publish Route", "Publish Failure", filepath).send();
|
||||
visitor.event("Publish Route", "Publish Failure", filePath).send();
|
||||
console.log("error:", error);
|
||||
socket.emit("publish-failure", handlePublishError(error));
|
||||
deleteTemporaryFile(filepath);
|
||||
deleteTemporaryFile(filePath);
|
||||
});
|
||||
}
|
||||
}
|
27
models/file.js
Normal file
27
models/file.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
module.exports = function(sequelize, DataTypes){
|
||||
var File = sequelize.define("File", {
|
||||
name: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
validate: {
|
||||
len: [1]
|
||||
}
|
||||
},
|
||||
path: {
|
||||
type: DataTypes.STRING
|
||||
},
|
||||
file_type: {
|
||||
type: DataTypes.STRING
|
||||
},
|
||||
claim_id: {
|
||||
type: DataTypes.STRING
|
||||
},
|
||||
nsfw: {
|
||||
type: DataTypes.BOOLEAN,
|
||||
defaultValue: false
|
||||
}
|
||||
}, {
|
||||
freezeTableName: true
|
||||
});
|
||||
return File;
|
||||
}
|
41
models/index.js
Normal file
41
models/index.js
Normal file
|
@ -0,0 +1,41 @@
|
|||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var Sequelize = require('sequelize');
|
||||
var basename = path.basename(module.filename);
|
||||
var config = require('config');
|
||||
var db = {};
|
||||
|
||||
var connectionUri = config.get('Database.MySqlConnectionUri');
|
||||
var sequelize = new Sequelize(connectionUri);
|
||||
|
||||
sequelize
|
||||
.authenticate()
|
||||
.then(() => {
|
||||
console.log('Connection has been established successfully.');
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('Unable to connect to the database:', err);
|
||||
});
|
||||
|
||||
fs
|
||||
.readdirSync(__dirname)
|
||||
.filter(function(file) {
|
||||
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
|
||||
})
|
||||
.forEach(function(file) {
|
||||
var model = sequelize['import'](path.join(__dirname, file));
|
||||
db[model.name] = model;
|
||||
});
|
||||
|
||||
Object.keys(db).forEach(function(modelName) {
|
||||
if (db[modelName].associate) {
|
||||
db[modelName].associate(db);
|
||||
}
|
||||
});
|
||||
|
||||
db.sequelize = sequelize;
|
||||
db.Sequelize = Sequelize;
|
||||
|
||||
module.exports = db;
|
|
@ -28,7 +28,9 @@
|
|||
"config": "^1.26.1",
|
||||
"express": "^4.15.2",
|
||||
"express-handlebars": "^3.0.0",
|
||||
"mysql2": "^1.3.5",
|
||||
"nodemon": "^1.11.0",
|
||||
"sequelize": "^4.1.0",
|
||||
"socket.io": "^2.0.1",
|
||||
"socketio-file-upload": "^0.6.0",
|
||||
"universal-analytics": "^0.4.13"
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
module.exports = function(app, path, siofu, socketHelpers, ua, googleAnalyticsId) {
|
||||
var socketHelpers = require('../helpers/socketHelpers.js');
|
||||
|
||||
module.exports = function(app, path, siofu, hostedContentPath, ua, googleAnalyticsId) {
|
||||
var http = require('http').Server(app);
|
||||
var io = require('socket.io')(http);
|
||||
|
||||
|
@ -8,9 +10,10 @@ module.exports = function(app, path, siofu, socketHelpers, ua, googleAnalyticsId
|
|||
var visitor = ua(googleAnalyticsId, {https: true});
|
||||
// attach upload listeners
|
||||
var uploader = new siofu();
|
||||
uploader.dir = path.join(__dirname, '../../Uploads');
|
||||
uploader.dir = hostedContentPath; //path.join(__dirname, '../../Uploads');
|
||||
uploader.listen(socket);
|
||||
uploader.on("start", function(event){
|
||||
// server side test to make sure file is not a bad file type
|
||||
if (/\.exe$/.test(event.file.name)) {
|
||||
uploader.abort(event.file.id, socket);
|
||||
}
|
||||
|
@ -20,10 +23,10 @@ module.exports = function(app, path, siofu, socketHelpers, ua, googleAnalyticsId
|
|||
socket.emit("publish-status", event.error)
|
||||
});
|
||||
uploader.on("saved", function(event){
|
||||
console.log("saved " + event.file.name);
|
||||
console.log("saved ", event.file.name, "deets:", event.file);
|
||||
if (event.file.success){
|
||||
socket.emit("publish-status", "file upload successfully completed");
|
||||
socketHelpers.publish(event.file.meta.name, event.file.pathName, event.file.meta.license, event.file.meta.nsfw, socket, visitor)
|
||||
socketHelpers.publish(event.file.meta.name, event.file.pathName, event.file.meta.type, event.file.meta.license, event.file.meta.nsfw, socket, visitor)
|
||||
} else {
|
||||
socket.emit("publish-failure", "file uploaded, but with errors")
|
||||
};
|
||||
|
|
20
server.js
20
server.js
|
@ -9,18 +9,19 @@ var axios = require('axios');
|
|||
var config = require('config');
|
||||
var ua = require('universal-analytics');
|
||||
|
||||
var socketHelpers = require('./helpers/socketHelpers.js');
|
||||
var routeHelpers = require('./helpers/routeHelpers.js');
|
||||
var lbryApi = require('./helpers/lbryApi.js');
|
||||
var lbryHelpers = require('./helpers/lbryHelpers.js');
|
||||
|
||||
var googleAnalyticsId = config.get('AnalyticsConfig.googleId');
|
||||
var hostedContentPath = config.get('Database.DownloadAddress');
|
||||
|
||||
// set port
|
||||
var PORT = 3000;
|
||||
|
||||
// initialize express app
|
||||
var app = express();
|
||||
//require our models for syncing
|
||||
var db = require("./models");
|
||||
|
||||
// make express look in the public directory for assets (css/js/img)
|
||||
app.use(express.static(__dirname + '/public'));
|
||||
|
@ -57,10 +58,15 @@ require("./routes/show-routes.js")(app, routeHelpers, lbryHelpers, ua, googleAna
|
|||
require("./routes/serve-routes.js")(app, routeHelpers, lbryHelpers, ua, googleAnalyticsId);
|
||||
require("./routes/home-routes.js")(app);
|
||||
|
||||
// wrap the server in socket.io to intercept incoming sockets requests
|
||||
var http = require("./routes/sockets-routes.js")(app, path, siofu, socketHelpers, ua, googleAnalyticsId);
|
||||
// require socket.io routes
|
||||
var http = require("./routes/sockets-routes.js")(app, path, siofu, hostedContentPath, ua, googleAnalyticsId);
|
||||
|
||||
// sync sequelize
|
||||
// wrap the server in socket.io to intercept incoming sockets requests
|
||||
// start server
|
||||
http.listen(PORT, function() {
|
||||
console.log("Listening on PORT " + PORT);
|
||||
});
|
||||
db.sequelize.sync({}).then(function(){
|
||||
http.listen(PORT, function() {
|
||||
console.log("Listening on PORT " + PORT);
|
||||
});
|
||||
})
|
||||
|
||||
|
|
|
@ -132,6 +132,7 @@
|
|||
event.file.meta.name = name;
|
||||
event.file.meta.license = license;
|
||||
event.file.meta.nsfw = nsfw;
|
||||
event.file.meta.type = stagedFiles[0].type;
|
||||
// re-set the html in the publish area
|
||||
document.getElementById('publish-active-area').innerHTML = '<div id="publish-status"></div><div id="progress-bar"></div>';
|
||||
// start a progress animation
|
||||
|
|
Loading…
Add table
Reference in a new issue