diff --git a/app.ico b/app.ico new file mode 100644 index 0000000..cd1b3b0 Binary files /dev/null and b/app.ico differ diff --git a/package.json b/package.json index 5bb5df2..cd7209a 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "productName": "cyb3r-youtube-downloader", "version": "1.0.0", "description": "My Electron application description", - "main": "src/index.js", + "main": "src/main.js", "scripts": { "start": "electron-forge start", "package": "electron-forge package", @@ -31,13 +31,14 @@ "packageManager": "npm" }, "electronWinstallerConfig": { - "name": "cyb3r_youtube_downloader" + "name": "cyb3r_youtube_downloader", + "icon": "app.ico" }, "electronInstallerDebian": {}, "electronInstallerRedhat": {}, "github_repository": { - "owner": "", - "name": "" + "owner": "Theenoro", + "name": "https://git.tooru.thee.moe/theenoro/electron-simple-youtube-downloader" }, "windowsStoreConfig": { "packageName": "", @@ -46,10 +47,11 @@ } }, "dependencies": { - "electron-compile": "^6.4.1", "electron": "^1.6.11", + "electron-compile": "^6.4.1", "mkdirp": "^0.5.1", - "request": "^2.81.0" + "request": "^2.81.0", + "unzip": "^0.1.11" }, "devDependencies": { "babel-plugin-transform-async-to-generator": "^6.24.1", diff --git a/src/app/view/init.html b/src/app/view/init.html new file mode 100644 index 0000000..c1f40fa --- /dev/null +++ b/src/app/view/init.html @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + +
+
+
+
+
+
+ +
+
+
+
+
+ + + diff --git a/src/controller/download.js b/src/controller/download.js new file mode 100644 index 0000000..bc0d7bf --- /dev/null +++ b/src/controller/download.js @@ -0,0 +1,126 @@ +const request = require('request'); +const fs = require('fs') +const ipcMain = require('electron').ipcMain; +const unzip = require('unzip') + + +var libsx = { + "ffmpeg":"ffmpeg", + "ffplay":"ffplay", + "ffprobe":"ffprobe", + "youtube-dl":"youtube-dl" +} +var libs = {}; + +libs.listen = null; +libs.libs = null; +ipcMain +.on('download-lib', (event, arg)=>{ + console.log('TEST') + libs.listen = event; + console.log(`This platform is ${process.platform}`); + switch (process.platform) { + case "win32": + for (var lib in libsx) { + libsx[lib] = libsx[lib]+'.exe'; + } + break; + default: + } + for (var lib in libsx) { + if (fs.existsSync(global.dir+"/lib/"+libsx[lib])) { + + }else{ + libsx[lib] = null; + } + } + libs.libs = libsx; + if(libsx['ffmpeg'] === null || libsx['ffplay'] === null || libsx['ffprobe'] === null ){ + var z = 0; + libs.download(libs.ff(process.platform),"ffmpeg",function(data,file){ + fs.createReadStream(file) + .pipe(unzip.Parse()) + .on('entry', function (entry) { + var fileName = entry.path; + var type = entry.type; // 'Directory' or 'File' + var size = entry.size; + console.log(fileName) + if (fileName === "ffmpeg-latest-win32-static/bin/ffmpeg.exe" || fileName === "ffmpeg-latest-win32-static/bin/ffprobe.exe" || fileName === "ffmpeg-latest-win32-static/bin/ffplay.exe") { + entry.pipe(fs.createWriteStream(global.dir+'/lib/'+fileName.split('/')[2])); + console.log('TEST') + z++; + if(z == 3){ + libs.checkNext('youtube-dl'); + } + } else { + entry.autodrain(); + } + }); + }); + }else{ + libs.checkNext('youtube-dl'); + } + console.dir(libsx); +}) +libs.checkNext = (nxt)=>{ + if( libs.libs['youtube-dl'] === null ){ + libs.yt_dl(process.platform,function(){ + libs.startFull(); + }); + }else{ + libs.startFull(); + } +} +libs.startFull = ()=>{ + libs.listen.sender.send('fin-loading',{}); +} +libs.ff = (os)=>{ + var url = ""; + switch (os) { + case "win32": + url = 'http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-latest-win32-static.zip'; + break; + default: + + } + return url; +} +libs.yt_dl = (os,cb)=>{ + var url = ""; + switch (os) { + case "win32": + url = 'https://yt-dl.org/downloads/2017.08.13/youtube-dl.exe' + break; + default: + + } + libs.download(url,"youtube-dl",function(data,file){ + fs.renameSync(file,global.dir+'/lib/youtube-dl.exe'); + cb(); + }) + +} +libs.download = (url,data,cb)=>{ + var r = request(url); + var actual = 1; + var full = 100; + var perc = 0; + r.on('data', function (chunk) { + actual += chunk.length; + perc = actual / full * 100; + console.log(perc); + libs.listen.sender.send('progress',{percent :Math.floor(perc)}); + }); + + r.on('response', function (res) { + res.pipe(fs.createWriteStream(global.dir+'/tmp/' + data + '.' + res.headers['content-type'].split('/')[1])); + full = res.headers[ 'content-length' ] ; + res.on('end', function () { + cb(data,global.dir+'/tmp/' + data + '.' + res.headers['content-type'].split('/')[1]); + }) + }); +} + + + +module.exports = libs; diff --git a/src/index.js b/src/index.js index 4480a44..7c4c4f2 100644 --- a/src/index.js +++ b/src/index.js @@ -9,45 +9,100 @@ const { } = require('electron'); const fs = require('fs'); const yt_dl = require('./controller/youtube-dl') +const dl = require('./controller/download'); -var win ; +if (!fs.existsSync(global.dir+'/tmp/inst')) { + fs.writeFileSync(global.dir+'/tmp/inst',"out"); + var win; + const createWindow = () =>{ + win = new BrowserWindow({ + width: 320, + height: 500, + show: false, + frame: false + }) + win.once('ready-to-show', () => { + }) -app.getPath('documents') -const createWindow = () =>{ - win = new BrowserWindow({ - width: 1010, - height: 800, - minWidth: 1010, - minHeight: 565, - show: false, - frame: true - }) - win.loadURL(`file://${__dirname}/app/view/layout.html`) - win.once('ready-to-show', () => { - win.show() - //var x = new yt_dl("https://www.youtube.com/watch?v=UbQgXeY_zi4") - //x.download(); - }) + win.on('closed', () => { + win = null; + }); + } + app.on('ready', createWindow); + app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } + }); +}else{ + var win ; - win.on('closed', () => { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. - win = null; + + app.getPath('documents') + const createWindow = () =>{ + + //dl.download(dl.ff(process.platform)); + /* + + win = new BrowserWindow({ + width: 1010, + height: 800, + minWidth: 1010, + minHeight: 565, + show: false, + frame: true + }) + */ + win = new BrowserWindow({ + width: 320, + height: 500, + show: false, + frame: false + }) + ipcMain + .on('start-full', (event, arg)=>{ + + var win2 = new BrowserWindow({ + width: 1010, + height: 800, + minWidth: 1010, + minHeight: 565, + show: true, + frame: true + }) + win.close(); + win2.loadURL(`file://${__dirname}/app/view/layout.html`) + win = win2; + }); + win.loadURL(`file://${__dirname}/app/view/init.html`) + win.once('ready-to-show', () => { + win.show() + //var x = new yt_dl("https://www.youtube.com/watch?v=UbQgXeY_zi4") + //x.download(); + }) + + win.on('closed', () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + win = null; + }); + } + app.on('ready', createWindow); + app.on('window-all-closed', () => { + // On OS X it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit(); + } + }); + app.on('activate', () => { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (mainWindow === null) { + createWindow(); + } }); } -app.on('ready', createWindow); -app.on('window-all-closed', () => { - // On OS X it is common for applications and their menu bar - // to stay active until the user quits explicitly with Cmd + Q - if (process.platform !== 'darwin') { - app.quit(); - } -}); -app.on('activate', () => { - // On OS X it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (mainWindow === null) { - createWindow(); - } -}); + +module.exports = app; diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..4b8fddb --- /dev/null +++ b/src/main.js @@ -0,0 +1,46 @@ +var app = require('./index'); + +var handleStartupEvent = function() { + if (process.platform !== 'win32') { + return false; + } + + var squirrelCommand = process.argv[1]; + console.log(squirrelCommand); + switch (squirrelCommand) { + case '--squirrel-install': + target = path.basename(process.execPath); + updateDotExe = path.resolve(path.dirname(process.execPath), '..', 'update.exe'); + var createShortcut = updateDotExe + ' --createShortcut=' + target + ' --shortcut-locations=Desktop,StartMenu' ; + console.log (createShortcut); + exec(createShortcut); + // Always quit when done + app.quit(); + return true; + + case '--squirrel-uninstall': + // Undo anything you did in the --squirrel-install and + // --squirrel-updated handlers + target = path.basename(process.execPath); + updateDotExe = path.resolve(path.dirname(process.execPath), '..', 'update.exe'); + var createShortcut = updateDotExe + ' --removeShortcut=' + target ; + console.log (createShortcut); + exec(createShortcut); + // Always quit when done + app.quit(); + return true; + case '--squirrel-obsolete': + // This is called on the outgoing version of your app before + // we update to the new version - it's the opposite of + // --squirrel-updated + app.quit(); + return true; + } +}; + +(function(){ + if (handleStartupEvent()) { + return; + } + +}) diff --git a/src/tmp/dummy b/src/tmp/dummy new file mode 100644 index 0000000..e69de29