Compare commits

..

5 Commits
dev ... master

Author SHA1 Message Date
Luca Jäntsch
6aa9ecc3d5 Aktualisieren README.md 2019-03-21 21:39:53 +01:00
Luca Jäntsch
196a8f06c6 1.5.2 2019-03-21 21:33:22 +01:00
Luca Jäntsch
8c48ace39e Added WMA 2019-03-21 21:16:39 +01:00
Luca Jäntsch
b5b992e568 Update download.js 2019-03-21 19:51:03 +01:00
Luca Jäntsch
54cb464d0f Update README.md 2018-12-17 12:09:11 +01:00
22 changed files with 1006 additions and 17452 deletions

2
.gitignore vendored
View File

@ -71,5 +71,3 @@ out
*.mp3 *.mp3
*.part *.part
*.ytdl *.ytdl
*.webm

View File

@ -1,15 +1,20 @@
# Cyb3r Downloader # Cyb3r Downloader
![./current-preview.PNG](./current-preview.PNG) ![./current-preview.PNG](https://gitlab.thee.moe/theenoro/cyb3r-downloader/raw/master/current-preview.PNG)
# Download 1.5.2 release
- Added WMA
[Download Installer](https://cl.thee.moe/index.php/s/aACn3iNAMHCFwk7)
# Download 1.5.1 release # Download 1.5.1 release
So I've changed a lot from 1.5.1, not program technically but for the install process and a bit the design So I've changed a lot from 1.5.1, not program technically but for the install process and a bit the design
The starter is a batch file, you have to keep it open to run it :( but you can minimize it. The starter is a batch file, you have to keep it open to run it :( but you can minimize it.
For the browser script located in "browser_out" or [Link](https://git.tooru.thee.moe/theenoro/electron-simple-youtube-downloader/blob/master/browser_out/tampermonkey_plugin.js) in the repo you can use it with "tampermonkey". Create a new script and copy & paste the source code in. Now if you are on YT in the navbar is a new button. For the browser script located in "browser_out" or [Link](https://gitlab.thee.moe/theenoro/cyb3r-downloader/blob/master/browser_out/tampermonkey_plugin.js) in the repo you can use it with "tampermonkey". Create a new script and copy & paste the source code in. Now if you are on YT in the navbar is a new button.
[Download](https://cl.thee.moe/index.php/s/Z5YvrlHaPfvEdbu) ~~[Download](https://cl.thee.moe/index.php/s/aACn3iNAMHCFwk7)~~
> 24.09.2017 Fixed Installer > 24.09.2017 Fixed Installer
@ -21,16 +26,16 @@ Checks if node is installed, if not it downloads it for you and you have only to
# Download 1.5 # Download 1.5
At the moment it have a few bugs. If you find some talk to me and I will list them here and fix it as soon as possible At the moment it have a few bugs. If you find some talk to me and I will list them here and fix it as soon as possible
or if you have an git account just add them in the issues tab. [Issues](https://git.tooru.thee.moe/theenoro/electron-simple-youtube-downloader/issues) or if you have an git account just add them in the issues tab. [Issues](https://gitlab.thee.moe/theenoro/cyb3r-downloader/issues)
[Download](https://cl.thee.moe/index.php/s/hd9ILsF2etPoa6r) ~~[Download](https://cl.thee.moe/index.php/s/hd9ILsF2etPoa6r)~~
# v 1.4.0 Alpha # v 1.4.0 Alpha
Preview [Video](https://cl.thee.moe/index.php/s/T8FEaFFxyhlxIj6) Preview [Video](https://cl.thee.moe/index.php/s/Grfn3gQMAEnB3t3)
# Download 1.3.0 # Download 1.3.0
Win32 / Win64 Install exe Win32 / Win64 Install exe
- [Download](https://www.dropbox.com/s/7eoo7yf3f7nwr8j/cyb3r-youtube-downloader-1.3.0%20Setup.exe?dl=0) - ~~[Download](https://www.dropbox.com/s/7eoo7yf3f7nwr8j/cyb3r-youtube-downloader-1.3.0%20Setup.exe?dl=0)~~

16820
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -56,17 +56,17 @@
} }
}, },
"dependencies": { "dependencies": {
"body-parser": "^1.17.2", "body-parser": "^1.17.2",
"cors": "^2.8.4", "cors": "^2.8.4",
"electron": "^1.7.6", "electron": "^1.7.6",
"electron-config": "^1.0.0", "electron-config": "^1.0.0",
"express": "^4.15.4", "express": "^4.15.4",
"fs": "0.0.1-security", "fs": "0.0.1-security",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
"node-id3": "0.0.10", "node-id3": "0.0.10",
"path": "^0.12.7", "path": "^0.12.7",
"request": "^2.81.0", "request": "^2.81.0",
"unzip": "^0.1.11", "unzip": "^0.1.11",
"watchr": "^3.0.1" "watchr": "^3.0.1"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1,4 +1,3 @@
const shared = require(global.__dirname + '/../js/shared');
$(function() { $(function() {
const Config = require('electron-config'); const Config = require('electron-config');
const config = new Config(); const config = new Config();
@ -8,11 +7,11 @@ $(function() {
var download_progress = $('#download-progress'); var download_progress = $('#download-progress');
var format = "mp3"; var format = "mp3";
if (typeof config.get('format') !== 'undefined') { if(typeof config.get('format') !== 'undefined'){
format = config.get('format'); format = config.get('format');
} }
var path = ""; var path = "";
if (typeof config.get('path') !== 'undefined') { if(typeof config.get('path') !== 'undefined'){
path = config.get('path'); path = config.get('path');
} }
var out = $('#output'); var out = $('#output');
@ -23,11 +22,11 @@ $(function() {
const helperx = require('./../../controller/webLoader/router'); const helperx = require('./../../controller/webLoader/router');
var shell = require('electron').shell; var shell = require('electron').shell;
//open links externally by default //open links externally by default
$(document).on('click', 'a[href^="http"]', function(event) { $(document).on('click', 'a[href^="http"]', function(event) {
event.preventDefault(); event.preventDefault();
shell.openExternal(this.href); shell.openExternal(this.href);
}); });
const { const {
dialog dialog
@ -58,8 +57,16 @@ $(function() {
}); });
ipcRenderer.on('process-fin', function(event, arg) { ipcRenderer.on('process-fin', function(event, arg) {
console.log(arg); // prints "pong" console.log(arg); // prints "pong"
$('#download-progress-' + arg.id).css("width", arg.percent); if(arg.percent==101){
$('#download-progress-' + arg.id).html("CONVERTED"); $('#download-progress-' + arg.id).css("width", 100);
$('#download-progress-' + arg.id).html("CONVERTING");
}else{
$('#download-progress-' + arg.id).css("width", arg.percent);
$('#download-progress-' + arg.id).html("CONVERTED");
}
}); });
ipcRenderer.on('file', function(event, arg) { ipcRenderer.on('file', function(event, arg) {
console.log('DOWNLOADED') console.log('DOWNLOADED')
@ -94,7 +101,7 @@ $(function() {
}); });
} }
}) })
$('body').delegate('#navigota li', 'click', function() { $('body').delegate('#navigota li','click',function(){
console.log('TEST') console.log('TEST')
$('#togmenu').click(); $('#togmenu').click();
}) })
@ -148,17 +155,7 @@ $(function() {
var YT = JSON.parse(body); var YT = JSON.parse(body);
$( $(
`<div class="media"> `<div class="media">
<div class="d-flex alogn-self-start mr-3" style=" <img id="img-` + video_id + `" class="d-flex align-self-start mr-3" src="`+ YT.thumbnail_url +`" alt="Generic placeholder image">
background:url(` + YT.thumbnail_url + `);
width: 189px;
height: 104px;
background-size: 189px;
background-position: 0px -18px;
">
<div class="media-out-` + video_id + `" style=" color: #FFF !important;
text-shadow: #454545 1px 1px 1px;
margin: auto;"></div>
</div>
<div class="media-body" id="body-` + video_id + `"> <div class="media-body" id="body-` + video_id + `">
<h5 class="mt-0">` + YT.title + `</h5> <h5 class="mt-0">` + YT.title + `</h5>
Author: ` + YT.author_name + ` Author: ` + YT.author_name + `
@ -180,9 +177,9 @@ $(function() {
.get('https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=' + video_id + '&format=json', function(err, httpResponse, body) { .get('https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=' + video_id + '&format=json', function(err, httpResponse, body) {
var YT = JSON.parse(body); var YT = JSON.parse(body);
$( $(
`<div class="media"> `<div class="media">
<div class="d-flex alogn-self-start mr-3" style=" <div class="d-flex alogn-self-start mr-3" style="
background:url(` + YT.thumbnail_url + `); background:url(`+YT.thumbnail_url+`);
width: 189px; width: 189px;
height: 104px; height: 104px;
background-size: 189px; background-size: 189px;
@ -202,12 +199,11 @@ $(function() {
</div>` </div>`
).prependTo('#output'); ).prependTo('#output');
cache[video_id] = YT.title; cache[video_id] = YT.title;
ipcRenderer.send('start-download', { ipcRenderer.send('start-download', {
url: $('#url').val(), url: $('#url').val(),
id: video_id, id: video_id
title: helper.replace(YT.title)
}); });
}) })
} }
@ -225,15 +221,11 @@ $(function() {
}) })
function getCommandLine() { function getCommandLine() {
switch (process.platform) { switch (process.platform) {
case 'darwin': case 'darwin' : return 'open';
return 'open'; case 'win32' : return 'start';
case 'win32': case 'win64' : return 'start';
return 'start'; default : return 'xdg-open';
case 'win64': }
return 'start';
default:
return 'xdg-open';
}
} }
}) })

View File

@ -1,4 +1,3 @@
const shared = require(global.__dirname+'/../js/shared');
$(function() { $(function() {
const ipcRenderer = require('electron').ipcRenderer; const ipcRenderer = require('electron').ipcRenderer;
ipcRenderer.send('pot_real_open', {x:"xx"}); ipcRenderer.send('pot_real_open', {x:"xx"});
@ -21,4 +20,6 @@ $(function() {
$('body').on( "mouseenter",function () { $('body').on( "mouseenter",function () {
$('.navbar').css('opacity',"1") $('.navbar').css('opacity',"1")
}); });
}) })

View File

@ -1,13 +0,0 @@
var shared = {};
var test = "";
shared.setLog = (text)=>{
test = text;
}
shared.log = ()=>{
console.log(test);
}
module.exports = shared;

View File

@ -14,194 +14,191 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title></title> <title></title>
<style> <style>
body { body {
margin: 0; margin: 0;
background: #333; background: #333;
} }
@keyframes arrow-spin { @keyframes arrow-spin {
100% { 100% {
transform: rotate(179deg); transform: rotate(179deg);
} }
} }
@-webkit-keyframes arrow-spin { @-webkit-keyframes arrow-spin {
100% { 100% {
-webkit-transform: rotate(179deg); -webkit-transform: rotate(179deg);
} }
} }
.psoload, .psoload,
.psoload *, .psoload *,
.psoload *:before, .psoload *:before,
.psoload *:after { .psoload *:after {
box-sizing: border-box; box-sizing: border-box;
transition: all 0.3s; transition: all 0.3s;
-webkit-transition: all 0.3s; -webkit-transition: all 0.3s;
} }
.psoload { .psoload {
position: relative; position: relative;
margin: 30px auto; margin: 30px auto;
height: 150px; height: 150px;
width: 150px; width: 150px;
} }
.psoload .straight, .psoload .straight,
.psoload .curve { .psoload .curve {
position: absolute; position: absolute;
top: 17.5%; top: 17.5%;
left: 17.5%; left: 17.5%;
width: 65%; width: 65%;
height: 65%; height: 65%;
border-radius: 100%; border-radius: 100%;
animation: arrow-spin 0.85s cubic-bezier(0.2, 0.8, 0.9, 0.1) infinite; animation: arrow-spin 0.85s cubic-bezier(0.2, 0.8, 0.9, 0.1) infinite;
-webkit-animation: arrow-spin 0.85s cubic-bezier(0.2, 0.8, 0.9, 0.1) infinite; -webkit-animation: arrow-spin 0.85s cubic-bezier(0.2, 0.8, 0.9, 0.1) infinite;
} }
.psoload .straight:before, .psoload .straight:before,
.psoload .straight:after { .psoload .straight:after {
content: ''; content: '';
position: absolute; position: absolute;
width: 15%; width: 15%;
border-bottom: 3px solid #eee; border-bottom: 3px solid #eee;
transform: rotate(45deg); transform: rotate(45deg);
-webkit-transform: rotate(45deg); -webkit-transform: rotate(45deg);
} }
.psoload .straight:before { .psoload .straight:before {
top: 5px; top: 5px;
left: 5px; left: 5px;
} }
.psoload .straight:after { .psoload .straight:after {
bottom: 5px; bottom: 5px;
right: 5px; right: 5px;
} }
.psoload .curve:before, .psoload .curve:before,
.psoload .curve:after { .psoload .curve:after {
content: ''; content: '';
position: absolute; position: absolute;
width: 45px; width: 45px;
height: 10px; height: 10px;
border: solid 3px transparent; border: solid 3px transparent;
border-top-color: #eee; border-top-color: #eee;
border-radius: 50%/10px 10px 0 0; border-radius: 50%/10px 10px 0 0;
z-index: 90001; z-index: 90001;
} }
.psoload .curve:before { .psoload .curve:before {
transform: rotate(-63deg) translateX(-27px) translateY(-4px); transform: rotate(-63deg) translateX(-27px) translateY(-4px);
-webkit-transform: rotate(-63deg) translateX(-27px) translateY(-4px); -webkit-transform: rotate(-63deg) translateX(-27px) translateY(-4px);
} }
.psoload .curve:after { .psoload .curve:after {
bottom: 5px; bottom: 5px;
right: 5px; right: 5px;
transform: rotate(115deg) translateX(-26px) translateY(-12px); transform: rotate(115deg) translateX(-26px) translateY(-12px);
-webkit-transform: rotate(115deg) translateX(-26px) translateY(-12px); -webkit-transform: rotate(115deg) translateX(-26px) translateY(-12px);
} }
.psoload .center { .psoload .center {
position: absolute; position: absolute;
top: 20%; top: 20%;
left: 20%; left: 20%;
width: 60%; width: 60%;
height: 60%; height: 60%;
border-radius: 100%; border-radius: 100%;
border: 3px solid #eee; border: 3px solid #eee;
} }
.psoload .inner { .psoload .inner {
position: absolute; position: absolute;
top: 25%; top: 25%;
left: 25%; left: 25%;
width: 50%; width: 50%;
height: 50%; height: 50%;
border-radius: 100%; border-radius: 100%;
animation: arrow-spin 0.85s cubic-bezier(0.2, 0.8, 0.9, 0.1) infinite reverse; animation: arrow-spin 0.85s cubic-bezier(0.2, 0.8, 0.9, 0.1) infinite reverse;
-webkit-animation: arrow-spin 0.85s cubic-bezier(0.2, 0.8, 0.9, 0.1) infinite reverse; -webkit-animation: arrow-spin 0.85s cubic-bezier(0.2, 0.8, 0.9, 0.1) infinite reverse;
} }
.psoload .inner:before, .psoload .inner:before,
.psoload .inner:after { .psoload .inner:after {
content: ''; content: '';
position: absolute; position: absolute;
width: 0; width: 0;
height: 0; height: 0;
border: 6px solid transparent; border: 6px solid transparent;
border-bottom-width: 11px; border-bottom-width: 11px;
border-bottom-color: #eee; border-bottom-color: #eee;
} }
.psoload .inner:before { .psoload .inner:before {
top: 12px; top: 12px;
left: 12px; left: 12px;
transform: rotate(128deg); transform: rotate(128deg);
-webkit-transform: rotate(128deg); -webkit-transform: rotate(128deg);
} }
.psoload .inner:after { .psoload .inner:after {
bottom: 12px; bottom: 12px;
right: 12px; right: 12px;
transform: rotate(-48deg); transform: rotate(-48deg);
-webkit-transform: rotate(-48deg); -webkit-transform: rotate(-48deg);
} }
.progress{
height:10px;
}
.progress .progress-bar{
height:5px;
width:30px;
background-color:#FFF;
content:"";
.progress { }
height: 10px;
}
.progress .progress-bar {
height: 5px;
width: 30px;
background-color: #FFF;
content: "";
}
</style> </style>
</head> </head>
<body> <body>
<div class="psoload"> <div class="psoload">
<div class="straight"></div> <div class="straight"></div>
<div class="curve"></div> <div class="curve"></div>
<div class="center"></div> <div class="center"></div>
<div class="inner"></div> <div class="inner"></div>
</div> </div>
<iframe id="coub" src="https://coub.com/embed/ulak9?muted=false&autostart=true&originalSize=false&startWithHD=false" allowfullscreen="true" frameborder="0" width="320" height="180"></iframe> <iframe id="coub" src="https://coub.com/embed/ulak9?muted=false&autostart=true&originalSize=false&startWithHD=false" allowfullscreen="true" frameborder="0" width="320" height="180"></iframe><script async src="https://c-cdn.coub.com/embed-runner.js"></script>
<script async src="https://c-cdn.coub.com/embed-runner.js"></script>
<hr/> <hr/>
<div class="progress"> <div class="progress">
<div class="progress-bar" id="main"></div> <div class="progress-bar" id="main"></div>
<div class="progress-bar" id="single"></div> <div class="progress-bar" id="single"></div>
</div> </div>
<script> <script>
$(function() { $(function(){
var start = [ var start = [
"whbex", "1k7kx5",
"wf0jb", "1nhvi0",
"ulak9", "1qfipa",
"wc5e2", "1kfn1h",
"xza2z"
]; ];
var x = Math.floor(Math.random() * start.length) var x = Math.floor(Math.random()*start.length)
$('#coub').attr('src', 'https://coub.com/embed/' + start[x] + '?muted=false&autostart=true&originalSize=false&startWithHD=false') $('#coub').attr('src','https://coub.com/embed/'+start[x]+'?muted=false&autostart=true&originalSize=false&startWithHD=false')
const ipcRenderer = require('electron').ipcRenderer; const ipcRenderer = require('electron').ipcRenderer;
ipcRenderer.send('download-lib', {}); ipcRenderer.send('download-lib', {});
ipcRenderer.on('progress', function(event, arg) { ipcRenderer.on('progress', function(event, arg) {
console.log(arg); // prints "pong" console.log(arg); // prints "pong"
$('#single').css("width", arg.percent + "%"); $('#single').css("width",arg.percent+"%");
}).on('fin-loading', function(event, arg) { }).on('fin-loading',function(event,arg){
$('#main').css("width", "100%"); $('#main').css("width","100%");
setTimeout(function() { setTimeout(function(){
ipcRenderer.send('start-full', {}); ipcRenderer.send('start-full', {});
}, 1000) },1000)
}) })
}) })
</script> </script>
</body> </body>
</html> </html>

View File

@ -2,60 +2,62 @@
<html> <html>
<head> <head>
<script> <script>
if (typeof module === 'object') { if (typeof module === 'object') {
window.module = module; window.module = module;
module = undefined; module = undefined;
} }
</script> </script>
<script src="./../libs/jquery/jquery-3.2.1.min.js"></script> <!--<script src="./../libs/jquery/jquery-3.2.1.min.js"></script>
<script src="./../libs/popper.min.js"></script> <script src="./../libs/bootstrap/js/bootstrap.js"></script>-->
<script src="./../libs/bootstrap/bootstrap.min.js"></script> <script src="./../libs/jquery/jquery-3.2.1.slim.min.js"></script>
<script src="./../js/player.js"></script> <script src="./../libs/popper.min.js"></script>
<meta charset="utf-8"> <script src="./../libs/bootstrap/bootstrap.min.js"></script>
<title>Cyb3r Downloader</title> <script src="./../js/player.js"></script>
<link rel="stylesheet" href="./../libs/bootstrap/bootstrap.min.css"> <meta charset="utf-8">
<link rel="stylesheet" href="./../libs/font-awesome/css/font-awesome.min.css" /> <title>Cyb3r Downloader</title>
<link rel="stylesheet" href="./../style/bootstrap.min.css" /> <!--<link rel="stylesheet" href="./../libs/bootstrap/css/bootstrap.css" />
<link rel="stylesheet" href="./../style/style.css" /> <link rel="stylesheet" href="./../libs/bootstrap/css/bootstrap-theme.css" />-->
<link rel="stylesheet" href="./../style/player.css" /> <link rel="stylesheet" href="./../libs/bootstrap/bootstrap.min.css">
<link rel="stylesheet" href="./../libs/font-awesome/css/font-awesome.min.css" />
<link rel="stylesheet" href="./../style/bootstrap.min.css" />
<link rel="stylesheet" href="./../style/style.css" />
<link rel="stylesheet" href="./../style/player.css" />
</head> </head>
<body> <body>
<div class="container-fluid"> <div class="container-fluid">
<div class="collapse" id="navigota" style=" position: fixed; top: 56px; left: 0px;z-index: 999999;"> <div class="collapse" id="navigota" style=" position: fixed; top: 56px; left: 0px;z-index: 999999;">
<div class="bg-dark p-4"> <div class="bg-dark p-4">
<div class="list-group" role="tablist" id=""> <div class="list-group" role="tablist" id="">
<li role="presentation" class="list-group-item list-group-item-action"><a href="#download" aria-controls="download" role="tab" data-toggle="tab">Download</a></li> <li role="presentation" class="list-group-item list-group-item-action"><a href="#download" aria-controls="download" role="tab" data-toggle="tab">Download</a></li>
<li role="presentation" class="list-group-item list-group-item-action"><a href="#player" aria-controls="player" role="tab" data-toggle="tab">Player</a></li> <li role="presentation" class="list-group-item list-group-item-action"><a href="#player" aria-controls="player" role="tab" data-toggle="tab">Player</a></li>
<li role="presentation" class="list-group-item list-group-item-action"><a href="#wt" aria-controls="wt" role="tab" data-toggle="tab">Watch Together</a></li> <li role="presentation" class="list-group-item list-group-item-action"><a href="#info" aria-controls="info" role="tab" data-toggle="tab">Info</a></li>
<li role="presentation" class="list-group-item list-group-item-action"><a href="#info" aria-controls="info" role="tab" data-toggle="tab">Info</a></li> </div>
</div>
</div> </div>
</div> <nav class="navbar fixed-top navbar-dark bg-dark justify-content-between" style="-webkit-app-region: drag">
</div> <button id="togmenu" style="-webkit-app-region: no-drag;" class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigota" aria-controls="navbarToggleExternalContent" aria-expanded="false" aria-label="Toggle navigation">
<nav class="navbar fixed-top navbar-dark bg-dark justify-content-between" style="-webkit-app-region: drag">
<button id="togmenu" style="-webkit-app-region: no-drag;" class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navigota" aria-controls="navbarToggleExternalContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<a class="navbar-brand">Cyb3r Downloader</a> <a class="navbar-brand">Cyb3r Downloader</a>
<form class="form-inline"> <form class="form-inline">
<button class="btn btn-outline-success my-2 my-sm-0" id="close" style="-webkit-app-region: no-drag;">X</button> <button class="btn btn-outline-success my-2 my-sm-0" id="close" style="-webkit-app-region: no-drag;">X</button>
</form> </form>
</nav> </nav>
<div class="row"> <div class="row">
<div class="col-md-2" style="display:none"> <div class="col-md-2" style="display:none">
<div class="list-group" role="tablist"> <div class="list-group" role="tablist" >
<li role="presentation" class="list-group-item list-group-item-action"><a href="#download" aria-controls="download" role="tab" data-toggle="tab">Download</a></li> <li role="presentation" class="list-group-item list-group-item-action"><a href="#download" aria-controls="download" role="tab" data-toggle="tab">Download</a></li>
<li role="presentation" class="list-group-item list-group-item-action"><a href="#player" aria-controls="player" role="tab" data-toggle="tab">Player</a></li> <li role="presentation" class="list-group-item list-group-item-action"><a href="#player" aria-controls="player" role="tab" data-toggle="tab">Player</a></li>
<li role="presentation" class="list-group-item list-group-item-action"><a href="#wt" aria-controls="wt" role="tab" data-toggle="tab">Watch Together</a></li> <li role="presentation" class="list-group-item list-group-item-action"><a href="#info" aria-controls="info" role="tab" data-toggle="tab">Info</a></li>
<li role="presentation" class="list-group-item list-group-item-action"><a href="#info" aria-controls="info" role="tab" data-toggle="tab">Info</a></li> </div>
</div> </div>
</div> <div class="col-md-12" >
<div class="col-md-12"> <div style="max-width:380px;margin:auto;margin-bottom:25px;">
<div style="max-width:380px;margin:auto;margin-bottom:25px;">
<div style=" margin: 0; <div style=" margin: 0;
padding: 0; padding: 0;
height: 35px; height: 35px;
display: flex; display: flex;
@ -67,28 +69,28 @@
box-shadow: 0px -1px 8px 4px rgba(69, 69, 69, 0.18); box-shadow: 0px -1px 8px 4px rgba(69, 69, 69, 0.18);
z-index:99999999; z-index:99999999;
"> ">
<button class="btn nabbar-btn btn-link" style="margin:0;" id="play"><i class="fa fa-pause-circle-o" aria-hidden="true"></i></button> <button class="btn nabbar-btn btn-link" style="margin:0;" id="play"><i class="fa fa-pause-circle-o" aria-hidden="true"></i></button>
<div id="time"> <div id="time">
<span></span> <span></span>
</div> </div>
<button class="btn nabbar-btn btn-link" style="margin:0;"><i class="fa fa-volume-up" aria-hidden="true"></i></button> <button class="btn nabbar-btn btn-link" style="margin:0;"><i class="fa fa-volume-up" aria-hidden="true"></i></button>
<div id="volume"> <div id="volume">
<span></span> <span></span>
</div> </div>
<button class="btn nabbar-btn btn-link" id="pot" style="margin:0;"><i class="fa fa-window-restore" aria-hidden="true"></i></button> <button class="btn nabbar-btn btn-link" id="pot" style="margin:0;"><i class="fa fa-window-restore" aria-hidden="true"></i></button>
</div> </div>
</div> </div>
<div class="tab-content"> <div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="download"> <div role="tabpanel" class="tab-pane active" id="download">
<input id="business" type="file" style="display: none" /> <input id="business" type="file" style="display: none" />
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="input-group"> <div class="input-group">
<span class="input-group-btn"> <span class="input-group-btn">
<button id="party" class="btn btn-secondary" type="button">Select Folder</button> <button id="party" class="btn btn-secondary" type="button">Select Folder</button>
</span> </span>
<input type="text" class="form-control" id="url" placeholder="YT-Url" aria-label="Product name"> <input type="text" class="form-control" id="url" placeholder="YT-Url" aria-label="Product name">
<span class="input-group-btn"> <span class="input-group-btn">
<div class="dropdown show"> <div class="dropdown show">
<a class="btn btn-secondary dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a class="btn btn-secondary dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Format Format
@ -96,125 +98,65 @@
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink"> <div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
<a class="dropdown-item format" href="#" data-format="mp3">MP3</a> <a class="dropdown-item format" href="#" data-format="mp3">MP3</a>
<a class="dropdown-item format" href="#" data-format="vorbis">OGG</a> <a class="dropdown-item format" href="#" data-format="wma">WMA</a>
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a class="dropdown-item format" href="#" data-format="mp4">MP4</a> <a class="dropdown-item format" href="#" data-format="mp4">MP4</a>
</div> </div>
</div> </div>
</span> </span>
<span class="input-group-btn"> <span class="input-group-btn">
<button class="btn btn-secondary" type="button" id="start-download">Download</button> <button class="btn btn-secondary" type="button" id="start-download">Download</button>
</span> </span>
</div>
</div>
</div>
<div class="row scroll">
<div class="col-md-12" id="output">
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane fade" id="player">
<div class="row">
<div class="col-md-12">
<div class="embed-responsive embed-responsive-16by9">
<video id="video"></video>
</div>
<div id="watchr_files">
</div>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane fade" id="info">
<div class="row">
<div class="col-md-12">
<h1>Info</h1>
<a href="https://git.tooru.thee.moe/theenoro/electron-simple-youtube-downloader" target="_blank">Git</a>
</div>
</div>
</div>
</div> </div>
</div>
</div> </div>
<div class="row scroll"> <!--<div class="col-md-4">
<div class="col-md-12" id="output">
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane fade" id="player">
<div class="row">
<div class="col-md-12">
<div class="embed-responsive embed-responsive-16by9">
<video id="video"></video>
</div>
<div id="watchr_files">
</div>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane fade" id="wt">
<div class="row">
<div class="col-md-12">
<div class="input-group">
<input type="text" class="form-control" id="webview-url" placeholder="www..." aria-label="Product name">
<span class="input-group-btn">
<button class="btn btn-secondary" type="button" id="webviewload">-></button>
<button class="btn btn-secondary" type="button" id="webviewdownload">Cyb3r Download</button>
</span>
</div>
<webview id="foo" src="https://youtube.com/" style="display:inline-flex; width:100%; height:calc(100vh - 144px)"></webview>
</div>
<script>
$(function(){
require('remote').getCurrentWindow().toggleDevTools();
const webview = document.querySelector('webview')
const indicator = document.querySelector('.indicator')
const loadstart = () => {
}
const loadstop = () => {
$('#webview-url').val(webview.getURL());
}
$('#webviewload').click(()=>{
var url = $('#webview-url').val();
webview.loadURL(url)
})
$('#webviewdownload').click(()=>{
var url = $('#webview-url').val();
$.post( "http://127.0.0.1:54167/download?url="+encodeURI(url),function() {
});
})
webview.addEventListener('did-start-loading', loadstart)
webview.addEventListener('did-stop-loading', loadstop)
});
</script>
</div>
</div>
<div role="tabpanel" class="tab-pane fade" id="info">
<div class="row">
<div class="col-md-12">
<h1>Info</h1>
<a href="https://git.tooru.thee.moe/theenoro/electron-simple-youtube-downloader" target="_blank">Git</a>
<div id="rss">
</div>
<script>
/*
$(()=>{
$.get( "https://git.tooru.thee.moe/theenoro/electron-simple-youtube-downloader/commits/master?format=atom", function( data ) {
$xml = $( data ),
$title = $xml.find( "title" );
console.log($xml)
$('#rss').html(data.toString());
alert( "Load was performed." );
});
})
*/
</script>
</div>
</div>
</div>
</div>
</div>
<!--<div class="col-md-4">
<div class="left-playlist"> <div class="left-playlist">
</div> </div>
</div>--> </div>-->
</div>
</div> </div>
</div> <script src="./../js/app.js"></script>
<script src="./../js/app.js"></script> <script>
<script> document.addEventListener("keydown", function (e) {
if (e.which === 123) {
document.addEventListener("keydown", function(e) { require('remote').getCurrentWindow().toggleDevTools();
if (e.which === 123) { } else if (e.which === 116) {
location.reload();
} else if (e.which === 116) { }
location.reload(); });
} </script>
});
</script>
</body> </body>
</html> </html>

View File

@ -1,109 +0,0 @@
const request = require('request');
// https://vivo.sx/46b5f0d914
var vivo = (url,cb)=>{
request('https://vivo.sx/76aa530aac', function(error, response, body) {
console.log('error:', error); // Print the error if one occurred
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
//console.log('body:', body); // Print the HTML for the Google homepage.
var html = body;
var bse64 = html.split('Core.InitializeStream (\'')[1].split('\');')[0];
console.log(bse64)
var arr = eval(Base64.decode(bse64));
console.log(arr[0])
cb(arr[0]);
});
}
module.exports = vivo;
var Base64 = {
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
encode: function(e) {
var t = "";
var n, r, i, s, o, u, a;
var f = 0;
e = Base64._utf8_encode(e);
while (f < e.length) {
n = e.charCodeAt(f++);
r = e.charCodeAt(f++);
i = e.charCodeAt(f++);
s = n >> 2;
o = (n & 3) << 4 | r >> 4;
u = (r & 15) << 2 | i >> 6;
a = i & 63;
if (isNaN(r)) {
u = a = 64
} else if (isNaN(i)) {
a = 64
}
t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
}
return t
},
decode: function(e) {
var t = "";
var n, r, i;
var s, o, u, a;
var f = 0;
e = e.replace(/[^A-Za-z0-9+/=]/g, "");
while (f < e.length) {
s = this._keyStr.indexOf(e.charAt(f++));
o = this._keyStr.indexOf(e.charAt(f++));
u = this._keyStr.indexOf(e.charAt(f++));
a = this._keyStr.indexOf(e.charAt(f++));
n = s << 2 | o >> 4;
r = (o & 15) << 4 | u >> 2;
i = (u & 3) << 6 | a;
t = t + String.fromCharCode(n);
if (u != 64) {
t = t + String.fromCharCode(r)
}
if (a != 64) {
t = t + String.fromCharCode(i)
}
}
t = Base64._utf8_decode(t);
return t
},
_utf8_encode: function(e) {
e = e.replace(/rn/g, "n");
var t = "";
for (var n = 0; n < e.length; n++) {
var r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r)
} else if (r > 127 && r < 2048) {
t += String.fromCharCode(r >> 6 | 192);
t += String.fromCharCode(r & 63 | 128)
} else {
t += String.fromCharCode(r >> 12 | 224);
t += String.fromCharCode(r >> 6 & 63 | 128);
t += String.fromCharCode(r & 63 | 128)
}
}
return t
},
_utf8_decode: function(e) {
var t = "";
var n = 0;
var r = c1 = c2 = 0;
while (n < e.length) {
r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r);
n++
} else if (r > 191 && r < 224) {
c2 = e.charCodeAt(n + 1);
t += String.fromCharCode((r & 31) << 6 | c2 & 63);
n += 2
} else {
c2 = e.charCodeAt(n + 1);
c3 = e.charCodeAt(n + 2);
t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
n += 3
}
}
return t
}
}

View File

@ -7,20 +7,20 @@ const fs = require('fs');
var crunch = {}; var crunch = {};
crunch.session_save = (session) => { crunch.session_save = (session)=>{
var net = `# Netscape HTTP Cookie File\n var net = `# Netscape HTTP Cookie File\n
# http://curl.haxx.se/rfc/cookie_spec.html\n # http://curl.haxx.se/rfc/cookie_spec.html\n
# This is a generated file! Do not edit.\n\n`; # This is a generated file! Do not edit.\n\n`;
var old_exp = 0; var old_exp = 0;
for (var i = 0; i < session.length; i++) { for(var i = 0;i<session.length;i++){
if (typeof session[i].expirationDate == 'undefined') { if(typeof session[i].expirationDate == 'undefined'){
session[i].expirationDate = old_exp; session[i].expirationDate = old_exp;
} }
if (session[i].expirationDate > old_exp) { if(session[i].expirationDate>old_exp){
old_exp = session[i].expirationDate; old_exp = session[i].expirationDate;
} }
net += session[i].domain + ' ' + session[i].httpOnly.toString().toUpperCase() + ' ' + session[i].path + ' ' + session[i].secure.toString().toUpperCase() + ' ' + Math.ceil(session[i].expirationDate) + ' ' + session[i].name + ' ' + session[i].value + '\n'; net += session[i].domain+' '+session[i].httpOnly.toString().toUpperCase()+' '+session[i].path+' '+session[i].secure.toString().toUpperCase()+' '+Math.ceil(session[i].expirationDate)+' '+session[i].name+' '+session[i].value+'\n';
} }
//console.log(net); //console.log(net);
/*fs.writeFile(global.dir+"/tmp/c", net, function(err) { /*fs.writeFile(global.dir+"/tmp/c", net, function(err) {

View File

@ -1,188 +1,138 @@
const request = require('request'); const request = require('request');
const fs = require('fs') const fs = require('fs')
const ipcMain = require('electron').ipcMain; const ipcMain = require('electron').ipcMain;
const unzip = require('unzip'); const unzip = require('unzip')
const {
spawn
} = require('child_process');
var libsx = { var libsx = {
"ffmpeg": "ffmpeg", "ffmpeg":"ffmpeg",
"ffplay": "ffplay", "ffplay":"ffplay",
"ffprobe": "ffprobe", "ffprobe":"ffprobe",
"youtube-dl": "youtube-dl" "youtube-dl":"youtube-dl"
} }
var libs = {}; var libs = {};
libs.listen = null; libs.listen = null;
libs.libs = null; libs.libs = null;
ipcMain ipcMain
.on('download-lib', (event, arg) => { .on('download-lib', (event, arg)=>{
console.log('TEST') console.log('TEST')
libs.listen = event; libs.listen = event;
console.log(`This platform is ${process.platform}`); console.log(`This platform is ${process.platform}`);
switch (process.platform) { switch (process.platform) {
case "win32": case "win32":
for (var lib in libsx) { for (var lib in libsx) {
libsx[lib] = libsx[lib] + '.exe'; 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;
var url = libs.ff(process.platform);
if(url === ''){
libs.checkNext('youtube-dl');
}else{
libs.download(url,"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');
} }
break; } else {
default: entry.autodrain();
} }
});
for (var lib in libsx) { });
if (fs.existsSync(global.dir + "/lib/" + libsx[lib])) { }
}else{
} else { libs.checkNext('youtube-dl');
libsx[lib] = null; }
} console.dir(libsx);
} })
libs.libs = libsx; libs.checkNext = (nxt)=>{
if (libsx['ffmpeg'] === null || libsx['ffplay'] === null || libsx['ffprobe'] === null) { if( libs.libs['youtube-dl'] === null ){
var z = 0; libs.yt_dl(process.platform,function(){
var url = libs.ff(process.platform);
if (url === '') {
libs.checkNext('youtube-dl');
} else {
switch (process.platform) {
case "win32":
libs.download(url, "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();
}
});
});
break;
case "linux":
libs.download(url, "ffmpeg", function(data, file) {
const ls = spawn('tar', ['xvf', './src/tmp/ffmpeg.x-xz', '-C', './src/tmp']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
var folder = "";
console.log(`child process exited with code ${code}`);
const ls = spawn('rm', ['./src/tmp/ffmpeg.x-xz']).on('close', () => {
const ls = spawn('ls', ['./src/tmp/']).stdout.on(data, (data) => {
console.log(data)
if (data.match('ffmpeg-') && data.match('-static')) {
folder = data;
}
}).on('close', () => {
const ls = spawn('cp', ['./src/tmp/' + folder + '/ffmpeg', './src/lib/ffmpeg']).on('close', () => {
const ls = spawn('cp', ['./src/tmp/' + folder + '/ffprobe', './src/lib/ffprobe']).on('close', () => {
libs.checkNext('youtube-dl');
});
});
});
});
});
})
break;
default:
}
}
} 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(); libs.startFull();
}); });
} else { }else{
libs.startFull(); libs.startFull();
} }
} }
libs.startFull = () => { libs.startFull = ()=>{
libs.listen.sender.send('fin-loading', {}); libs.listen.sender.send('fin-loading',{});
} }
libs.ff = (os) => { libs.ff = (os)=>{
var url = ""; var url = "";
switch (os) { switch (os) {
case "win32": case "win32":
url = 'http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-latest-win32-static.zip'; url = 'http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-latest-win32-static.zip';
break; break;
case "linux": case "linux":
url = 'https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz' url = ''
default: default:
} }
return url; return url;
} }
libs.yt_dl = (os, cb) => { libs.yt_dl = (os,cb)=>{
var url = ""; var url = "";
switch (os) { switch (os) {
case "win32": case "win32":
url = 'https://yt-dl.org/downloads/2017.08.13/youtube-dl.exe'; url = 'https://yt-dl.org/downloads/latest/youtube-dl.exe';
libs.download(url, "youtube-dl", function(data, file) { libs.download(url,"youtube-dl",function(data,file){
fs.renameSync(file, global.dir + '/lib/youtube-dl.exe'); fs.renameSync(file,global.dir+'/lib/youtube-dl.exe');
cb(); cb();
}) })
break; break;
case "linux": case "linux":
url = 'https://yt-dl.org/downloads/latest/youtube-dl' url = ''
libs.download(url, "youtube-dl", function(data, file) { cb();
fs.renameSync(file, global.dir + '/lib/youtube-dl');
cb();
})
default: default:
} }
} }
libs.download = (url, data, cb) => { libs.download = (url,data,cb)=>{
var r = request(url); var r = request(url);
var actual = 1; var actual = 1;
var full = 100; var full = 100;
var perc = 0; var perc = 0;
r.on('data', function(chunk) { r.on('data', function (chunk) {
actual += chunk.length; actual += chunk.length;
perc = actual / full * 100; perc = actual / full * 100;
console.log(perc); console.log(perc);
libs.listen.sender.send('progress', { libs.listen.sender.send('progress',{percent :Math.floor(perc)});
percent: Math.floor(perc)
});
}); });
r.on('response', function(res) { r.on('response', function (res) {
res.pipe(fs.createWriteStream(global.dir + '/tmp/' + data + '.' + res.headers['content-type'].split('/')[1])); res.pipe(fs.createWriteStream(global.dir+'/tmp/' + data + '.' + res.headers['content-type'].split('/')[1]));
full = res.headers['content-length']; full = res.headers[ 'content-length' ] ;
res.on('end', function() { res.on('end', function () {
cb(data, global.dir + '/tmp/' + data + '.' + res.headers['content-type'].split('/')[1]); cb(data,global.dir+'/tmp/' + data + '.' + res.headers['content-type'].split('/')[1]);
}) })
}); });
} }
function win_ffmpeg() {
}
module.exports = libs; module.exports = libs;

View File

@ -1,6 +1,4 @@
const { const { exec } = require('child_process');
exec
} = require('child_process');
var install = {}; var install = {};
@ -8,50 +6,48 @@ var install = {};
install.init = (cb) => { install.init = (cb)=>{
var url = [ var url = [
['ffmpeg', 'https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-64bit-static.tar.xz'], ['ffmpeg','https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-64bit-static.tar.xz'],
['youtube-dl', 'https://yt-dl.org/downloads/latest/youtube-dl'] ['youtube-dl' ,'https://yt-dl.org/downloads/latest/youtube-dl']
] ]
var download = (i) => { var download = (i)=>{
install.download(url[i], function(path) { install.download(url[i],function(path){
switch (i) { switch (i) {
case 0: case 0:
shell. shell.
break; break;
default: default:
} }
if (i < url.length - 1) { if(i<url.length-1){
download(i++); download(i++);
} else { }else{
cb(); cb();
} }
}) })
}; };
download(0) download(0)
} }
install.download = (url, cb) => { install.download = (url,cb) =>{
var r = request(url); var r = request(url);
var actual = 1; var actual = 1;
var full = 100; var full = 100;
var perc = 0; var perc = 0;
r.on('data', function(chunk) { r.on('data', function (chunk) {
actual += chunk.length; actual += chunk.length;
perc = actual / full * 100; perc = actual / full * 100;
console.log(perc); console.log(perc);
libs.listen.sender.send('progress', { libs.listen.sender.send('progress',{percent :Math.floor(perc)});
percent: Math.floor(perc) });
}); r.on('response', function (res) {
}); var path = global.dir+'/tmp/'+url.split('/')[url.split('/').length-1];
r.on('response', function(res) { res.pipe(fs.createWriteStream( path ));
var path = global.dir + '/tmp/' + url.split('/')[url.split('/').length - 1]; full = res.headers[ 'content-length' ] ;
res.pipe(fs.createWriteStream(path)); res.on('end', function () {
full = res.headers['content-length']; cb(path);
res.on('end', function() { })
cb(path); });
})
});
} }

View File

@ -15,40 +15,36 @@ var s = null;
var pot_open_ev = null; var pot_open_ev = null;
ipcMain ipcMain
.on('close_pot', (event, arg) => { .on('close_pot',(event,arg)=>{
console.log('CLOSE') console.log('CLOSE')
pot.close(event); pot.close(event);
}) })
.on('pot_run', (event, arg) => { .on('pot_run',(event,arg)=>{
pot_open_ev.sender.send('pot_play', arg); pot_open_ev.sender.send('pot_play',arg);
}) })
.on('pot_real_open', (event, arg) => { .on('pot_real_open',(event,arg)=>{
console.log('POT EVENT SET') console.log('POT EVENT SET')
pot_open_ev = event; pot_open_ev = event;
}) })
.on('open-pot', (event, arg) => { .on('open-pot',(event,arg)=>{
pot.open(event); pot.open(event);
}) })
pot.isOpen = false; pot.isOpen = false;
pot.open = (e) => { pot.open = (e) => {
s = e; s = e;
if (win !== null) { if (win !== null) {
e.sender.send('play-in-Window', { e.sender.send('play-in-Window',{do :false});
do: false
});
win.close(); win.close();
} }
var x = new playerOnTop(e); var x = new playerOnTop(e);
} }
pot.close = () => { pot.close = ()=>{
console.log('CLOSE') console.log('CLOSE')
s.sender.send('play-in-Window', { s.sender.send('play-in-Window',{do :false});
do: false
});
win.close(); win.close();
} }
@ -64,25 +60,21 @@ class playerOnTop {
alwaysOnTop: true, alwaysOnTop: true,
icon: global.dir + '/app.ico' icon: global.dir + '/app.ico'
}) })
e.sender.send('play-in-Window', { e.sender.send('play-in-Window',{do :true});
do: true
});
win = this.win; win = this.win;
win.loadURL(`file://${global.dir}/app/view/pot.html`) win.loadURL(`file://${global.dir}/app/view/pot.html`)
win.once('ready-to-show', () => { win.once('ready-to-show', () => {
win.show(); win.show();
}) })
win.on('resize', function() { win.on('resize', function () {
setTimeout(function() { setTimeout(function () {
var size = win.getSize(); var size = win.getSize();
win.setSize(size[0], parseInt(size[0] * 9 / 16)); win.setSize(size[0], parseInt(size[0] * 9 / 16));
}, 0); }, 0);
}); });
win.on('closed', () => { win.on('closed', () => {
pot.isOpen = false; pot.isOpen = false;
e.sender.send('play-in-Window', { e.sender.send('play-in-Window',{do :false});
do: false
});
win = null; win = null;
}); });
} }

View File

@ -1,41 +1,20 @@
const { const {app, Menu, Tray} = require('electron')
app,
Menu,
Tray
} = require('electron')
const main_window = require('./windows.js/main.js') const main_window = require('./windows.js/main.js')
const path = require('path')
module.exports = () => { module.exports = ()=>{
switch (process.platform) {
case 'win32':
break; let tray = new Tray(global.dir+'/app.ico')
case 'linux': const contextMenu = Menu.buildFromTemplate([
{label: 'Open', click(){ main_window.open() }},
break;
}
let tray = new Tray(path.join(global.dir + '/app.png'))
const contextMenu = Menu.buildFromTemplate([{
label: 'Open',
click() {
main_window.open()
}
},
/*{label: 'About',click() { console.log('item 1 clicked') }}, /*{label: 'About',click() { console.log('item 1 clicked') }},
{label: 'Item1', type: 'radio'}, {label: 'Item1', type: 'radio'},
{type: 'separator'}, {type: 'separator'},
{label: 'Item2', type: 'radio'}, {label: 'Item2', type: 'radio'},
{label: 'Item3', type: 'radio', checked: true},*/ {label: 'Item3', type: 'radio', checked: true},*/
{ {label: 'Beenden', click() { main_window.close(); }},
label: 'Beenden',
click() {
main_window.close();
}
},
]) ])
tray.setToolTip('Cyb3r Downloader.') tray.setToolTip('Cyb3r Downloader.')
tray.setContextMenu(contextMenu) tray.setContextMenu(contextMenu)

View File

@ -1,14 +1,14 @@
const watchr = require('watchr'); const watchr = require('watchr');
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const ipcMain = require('electron').ipcMain; const ipcMain = require('electron').ipcMain;
var watch_event = null; var watch_event = null;
ipcMain ipcMain
.on('watchr_event', (event, arg) => { .on('watchr_event', (event, arg)=>{
watch_event = event watch_event = event
}) })
class folderWatchr { class folderWatchr {
constructor(folder) { constructor(folder) {
@ -20,12 +20,9 @@ class folderWatchr {
files.push(folder + '/' + file); files.push(folder + '/' + file);
}); });
for (var i = 0; i < files.length; i++) { for(var i = 0;i<files.length;i++){
files[i] = files[i].replace(/\\/g, "/"); files[i]=files[i].replace(/\\/g, "/");
watch_event.sender.send('watchr_file', { watch_event.sender.send('watchr_file',{type:"add",file:files[i]});
type: "add",
file: files[i]
});
} }
function listener(changeType, fullPath, currentStat, previousStat) { function listener(changeType, fullPath, currentStat, previousStat) {
@ -39,16 +36,10 @@ class folderWatchr {
console.log('the file', fullPath, 'was created', currentStat) console.log('the file', fullPath, 'was created', currentStat)
files.push(fullPath); files.push(fullPath);
watch_event.sender.send('watchr_file', { watch_event.sender.send('watchr_file',{type:"add",file:fullPath});
type: "add",
file: fullPath
});
break; break;
case 'delete': case 'delete':
watch_event.sender.send('watchr_file', { watch_event.sender.send('watchr_file',{type:"remove",file:fullPath});
type: "remove",
file: fullPath
});
files.splice(files.indexOf(fullPath), 1); files.splice(files.indexOf(fullPath), 1);
break; break;
} }
@ -60,9 +51,9 @@ class folderWatchr {
} }
// Watch the path with the change listener and completion callback // Watch the path with the change listener and completion callback
this.stalker = watchr.open(this.folder, listener, next); this.stalker = watchr.open(this.folder , listener, next);
} }
destroy() { destroy(){
this.stalker.close() this.stalker.close()
} }
} }

View File

@ -3,9 +3,9 @@ var cors = require('cors')
app.use(cors()) app.use(cors())
const bodyParser = require('body-parser'); const bodyParser = require('body-parser');
app.use(bodyParser.json()); // to support JSON-encoded bodies app.use( bodyParser.json() ); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
extended: true extended: true
})); }));

View File

@ -1,12 +1,14 @@
const { const {
BrowserWindow, BrowserWindow,
session session
} = require('electron'); } = require('electron');
const crunch = require('./../crunchyroll') const crunch = require('./../crunchyroll')
class browser { class browser {
constructor(url) { constructor(url){
console.log("TEST") console.log("TEST")
this.window = new BrowserWindow({ this.window = new BrowserWindow({
width: 500, width: 500,
@ -15,14 +17,12 @@ class browser {
frame: true, frame: true,
icon: global.dir + '/app.ico' icon: global.dir + '/app.ico'
}) })
setInterval(function() { setInterval(function(){
session.defaultSession.cookies.get({ session.defaultSession.cookies.get({url:'http://crunchyroll.com'}, (error, cookies) => {
url: 'http://crunchyroll.com' //console.log(error, cookies)
}, (error, cookies) => { crunch.session_save(cookies);
//console.log(error, cookies)
crunch.session_save(cookies);
}) })
}, 3000) },3000)
var window = this.window var window = this.window
window.loadURL(url) window.loadURL(url)
window.once('ready-to-show', () => { window.once('ready-to-show', () => {
@ -30,7 +30,7 @@ class browser {
}) })
this.window.on('closed', () => { this.window.on('closed', () => {
window = null; window = null;
}); });
} }
} }

View File

@ -1,10 +1,5 @@
const { const { spawn } = require('child_process');
spawn const {Notification,ipcMain}= require('electron');
} = require('child_process');
const {
Notification,
ipcMain
} = require('electron');
const dl_routine = require('./youtube-dl.routine') const dl_routine = require('./youtube-dl.routine')
const nodeID3 = require('node-id3'); const nodeID3 = require('node-id3');
@ -20,189 +15,181 @@ var format = "mp3";
var fol = null; var fol = null;
var pot_open_ev = null; var pot_open_ev = null;
var request = require('request').defaults({ var request = require('request').defaults({ encoding: null });
encoding: null
});
var list = [];
ipcMain ipcMain
.on('start-download', (event, arg) => { .on('start-download', (event, arg)=>{
path = orig_path; path = orig_path
if(list.length != 0){ var download = new yt_dl(arg.url,arg.id);
list.push([arg,event]); download.addListen(event)
}else{ download.download();
list.push([arg,event]); })
var download = new yt_dl(arg.url, arg.id, arg.title); .on('set-format',(event,arg)=>{
download.addListen(event) format = arg.format;
download.download(); })
} .on('start-download-pl', (event, arg)=>{
var mkdirp = require('mkdirp');
}) if(orig_path === ""){
.on('set-format', (event, arg) => { path = '.'
format = arg.format; }else{
}) path = orig_path
.on('start-download-pl', (event, arg) => { }
var mkdirp = require('mkdirp'); mkdirp(path+'/'+arg.folder, function(err) {
if (orig_path === "") { path = path+'/'+arg.folder;
path = '.' // path exists unless there was an error
} else { var download = new yt_dl(arg.url,arg.id);
path = orig_path download.addListen(event)
} download.download();
mkdirp(path + '/' + arg.folder, function(err) {
path = path + '/' + arg.folder;
// path exists unless there was an error
var download = new yt_dl(arg.url, arg.id);
download.addListen(event)
download.download();
});
})
.on('setPath', function(event, arg) {
path = arg.path;
orig_path = arg.path;
if (fol !== null) {
fol.destroy()
}
fol = new folderWatchr(path);
console.log('SET Path: ' + path)
}); });
})
.on('setPath', function(event, arg) {
path = arg.path;
orig_path = arg.path;
if(fol !== null){
fol.destroy()
}
fol = new folderWatchr(path);
console.log('SET Path: '+path)
});
var yt_dl = class { var yt_dl = class{
constructor(url, id, title) { constructor(url,id){
this.url = url; this.url = url ;
this.percent = 0; this.percent = 0;
this.lwrite = null; this.lwrite = null;
this.id = id; this.id = id;
this.title = title
} }
addListen(e) { addListen(e){
this.lwrite = e this.lwrite = e
} }
status(stat) { status(stat){
this.lwrite('download-progress', stat); this.lwrite('download-progress', stat);
} }
download() { download(){
var log = []; var log = [];
var me = this; var me = this;
var ls; var ls;
var m = dl_routine(path, this.url, format, this.title); var m = dl_routine(path,this.url,format);
console.log('CMD: '+m[0]+' '+ m[1]); ls = spawn(m[0],m[1]);
ls = spawn(m[0], m[1]);
if (path == '') { if(path == ''){
//ls = spawn(global.dir+'/lib/youtube-dl', ['-x','--audio-format','mp3','-i',this.url]); //ls = spawn(global.dir+'/lib/youtube-dl', ['-x','--audio-format','mp3','-i',this.url]);
} else { }else{
//ls = spawn(global.dir+'/lib/youtube-dl', ['-x','--audio-format','mp3','-i',this.url,'-o',path+'/%(title)s.%(ext)s']); //ls = spawn(global.dir+'/lib/youtube-dl', ['-x','--audio-format','mp3','-i',this.url,'-o',path+'/%(title)s.%(ext)s']);
} }
ls.stdout.on('data', (data) => { ls.stdout.on('data', (data) => {
data = data.toString('utf8'); data = data.toString('utf8');
log.push(data); log.push(data);
//console.log(data); //console.log(data);
try { try{
var z = data.replace(/(\r\n|\n|\r)/gm, "").split(' '); var z = data.replace(/(\r\n|\n|\r)/gm,"").split(' ');
console.log(z) console.log(z)
switch (z[0]) { switch (z[0]) {
case '[download]': case '[download]':
var percent = data.split(']')[1].split('of')[0]; var percent = data.split(']')[1].split('of')[0];
//console.log(z) //console.log(z)
me.percent = percent.trim(); me.percent = percent.trim();
me.lwrite.sender.send('download-progress', { me.lwrite.sender.send('download-progress',{percent :me.percent,id:me.id});
percent: me.percent, break;
id: me.id default:
}); }
break; var m = z.length;
default: for(var i = 0;i<m;i++){
} if(z[i] === '[ffmpeg]'){
var m = z.length; if(z[i+1] === 'Merging'){
for (var i = 0; i < m; i++) { var file = "";
if (z[i] === '[ffmpeg]') { for(var x = i+4;x<m;x++){
if (z[i + 1] === 'Merging') { console.log(z[x])
var file = ""; if(z[x] === 'has' && z[x+1] === "already" && z[x+2] === "been" && z[x+3] === 'downloaded'){
for (var x = i + 4; x < m; x++) { break;
console.log(z[x]) }
if (z[x] === 'has' && z[x + 1] === "already" && z[x + 2] === "been" && z[x + 3] === 'downloaded') { file = z[x];
break; }
} me.lwrite.sender.send('file',{id:me.id,file:file});
file = z[x]; break;
} }
me.lwrite.sender.send('file', { }
id: me.id, }
file: file }catch(e){
}); console.log(e);
break; }finally{
}
}
}
} catch (e) {
console.log(e);
} finally {
} }
}); });
ls.stderr.on('data', (data) => { ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`); console.log(`stderr: ${data}`);
}); });
ls.on('close', (code) => { ls.on('close', (code) => {
console.log(`child process exited with code ${code}`); console.log(`child process exited with code ${code}`);
me.lwrite.sender.send('file', {
id: me.id, switch(format){
file: log[log.length - 2].split('[ffmpeg] Destination: ')[1] case "wma":
}); me.lwrite.sender.send('process-fin',{percent :101,id:me.id});
me.lwrite.sender.send('process-fin', { setTimeout(function(){
percent: me.percent, var fo = log[log.length-2].split('[ffmpeg] Destination: ')[1].replace(/\\/g,'/').trim();
id: me.id var f = fo.replace('.mp3','.'+format);
}); console.log(f)
const bat = spawn(global.dir+'/lib/ffmpeg', ['-i',fo,f,'-loglevel','repeat+level+verbose']);
console.dir(bat)
bat.stdout.on('data', (data) => {
console.log(data.toString());
});
bat.stderr.on('data', (data) => {
console.log(data.toString());
});
bat.on('exit', (code) => {
console.log(`Child exited with code ${code}`);
me.lwrite.sender.send('file',{id:me.id,file:log[log.length-2].split('[ffmpeg] Destination: ')[1]});
me.lwrite.sender.send('process-fin',{percent :me.percent,id:me.id});
});
},2000)
break;
default:
me.lwrite.sender.send('file',{id:me.id,file:log[log.length-2].split('[ffmpeg] Destination: ')[1]});
me.lwrite.sender.send('process-fin',{percent :me.percent,id:me.id});
break;
}
list.splice(0,1);
if(list.length>0){
dl(list[0][0],list[0][1]);
}
var title = this.title;
if (this.url.match('youtube') && format === 'mp3') {
var url = this.url; /* if(this.url.match('youtube')){
var video_id = this.url.split('v=')[1]; var url = this.url;
var ampersandPosition = video_id.indexOf('&'); var video_id = this.url.split('v=')[1];
if (ampersandPosition != -1) { var ampersandPosition = video_id.indexOf('&');
video_id = video_id.substring(0, ampersandPosition); if (ampersandPosition != -1) {
video_id = video_id.substring(0, ampersandPosition);
}
/*
var x = new Notification({
title:"Cyb3r Downloader",
body :"finished download for "+url,
//icon : body
})
x.show()
//request.get('https://i.ytimg.com/vi/'+video_id+'/hqdefault.jpg', function (err, res, body) {
//log[log.length-2].split('[ffmpeg] Destination: ')[1]
/*var tags = {
image: body
} }
var fornoti = title; var success = nodeID3.write(tags, log[log.length-2].split('[ffmpeg] Destination: ')[1]);
if (title === "") { console.log(success);
fornoti = url; });
} }*/
var x = new Notification({
title: "Cyb3r Downloader",
body: "finished download for " + title,
//icon : body
})
x.show()
request.get('https://i.ytimg.com/vi/' + video_id + '/hqdefault.jpg', function(err, res, body) {
//log[log.length-2].split('[ffmpeg] Destination: ')[1]
var tags = {
image: body
}
var success = nodeID3.write(tags, path + '/' + title + '.' + format);
console.log(success);
});
}
}); });
} }
} }
function dl(arg,event){
var download = new yt_dl(arg.url, arg.id, arg.title);
download.addListen(event)
download.download();
}
module.exports = yt_dl; module.exports = yt_dl;

View File

@ -1,29 +1,33 @@
module.exports = (path, url, format, title = "%(title)s") => {
var command = global.dir + '/lib/youtube-dl';
var param = [];
module.exports = (path,url,format)=>{
var command = global.dir+'/lib/youtube-dl';
var param = [];
console.log(url); console.log(url);
if (url.match('youtube')) { if(url.match('youtube')){
console.log('youtube') console.log('youtube')
switch (format) { switch (format) {
case "vorbis":
param = ['-x', '-f', 'bestaudio[acodec^=opus]', '--audio-format', 'vorbis', '-i', url, '-o', path + '/'+title+'.%(ext)s'];
break;
case "mp3": case "mp3":
param = ['--audio-quality', '0','-f','bestaudio[ext=m4a]','--audio-format','mp3', url, '-o', path + '/'+title+'.%(ext)s']; param = ['-x','--audio-format','mp3','-i',url,'-o',path+'/%(title)s.%(ext)s'];
break;
case "wma":
param = ['-x','--audio-format','mp3','-i',url,'-o',path+'/%(title)s.%(ext)s'];
break; break;
case "mp4": case "mp4":
param = ['-w', '-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4', url, '-o', path + '/'+title+'.%(ext)s']; param = ['-w','-f','bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4',url,'-o',path+'/%(title)s.%(ext)s'];
break; break;
default: default:
} }
} else if (url.match('crunchyroll')) { }
else if(url.match('crunchyroll')){
console.log('crunchyroll') console.log('crunchyroll')
param = ['--cookie', global.dir + '/tmp/c', '--all-subs', '--sub-format', 'srt', '--write-sub', '--embed-subs', url, '-o', path + '/%(title)s.%(ext)s']; param = ['--cookie', global.dir+'/tmp/c', '--all-subs', '--sub-format', 'srt', '--write-sub', '--embed-subs',url,'-o',path+'/%(title)s.%(ext)s'];
} }
return [command, param]; return [command,param];

View File

@ -20,6 +20,29 @@ let tray_win = null;
if (!fs.existsSync(global.dir+'/tmp/inst')) { if (!fs.existsSync(global.dir+'/tmp/inst')) {
fs.writeFileSync(global.dir+'/tmp/inst',"out"); fs.writeFileSync(global.dir+'/tmp/inst',"out");
app.quit(); app.quit();
/*var win;
const createWindow = () =>{
win = new BrowserWindow({
width: 320,
height: 500,
show: false,
frame: false,
icon: __dirname + '/app.ico'
})
win.once('ready-to-show', () => {
})
win.on('closed', () => {
win = null;
});
}
app.on('ready', createWindow);
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
*/
}else{ }else{
var win ; var win ;
app.getPath('documents') app.getPath('documents')
@ -33,6 +56,8 @@ if (!fs.existsSync(global.dir+'/tmp/inst')) {
}) })
ipcMain ipcMain
.on('start-full', (event, arg)=>{ .on('start-full', (event, arg)=>{
//main_window.createWindow(); //main_window.createWindow();
//main_window.open(); //main_window.open();
tray_win = tray(); tray_win = tray();
@ -42,18 +67,27 @@ if (!fs.existsSync(global.dir+'/tmp/inst')) {
win.loadURL(`file://${__dirname}/app/view/init.html`) win.loadURL(`file://${__dirname}/app/view/init.html`)
win.once('ready-to-show', () => { win.once('ready-to-show', () => {
win.show() win.show()
//var x = new yt_dl("https://www.youtube.com/watch?v=UbQgXeY_zi4")
//x.download();
}) })
win.on('closed', () => { 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; win = null;
}); });
} }
app.on('ready', createWindow); app.on('ready', createWindow);
app.on('window-all-closed', () => { 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') { if (process.platform !== 'darwin') {
app.quit(); app.quit();
} }
}); });
app.on('activate', () => { 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) { if (mainWindow === null) {
createWindow(); createWindow();
} }