diff --git a/.gitignore b/.gitignore
index 477e0c8..12784b3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,6 +43,7 @@ Thumbs.db
node_modules/*
backend/node_modules/*
+backend/public/*
YoutubeDL-Material/node_modules/*
backend/video/*
backend/audio/*
diff --git a/chrome-extension.crx b/chrome-extension.crx
new file mode 100644
index 0000000..0e8360b
Binary files /dev/null and b/chrome-extension.crx differ
diff --git a/chrome-extension.pem b/chrome-extension.pem
new file mode 100644
index 0000000..19f4917
--- /dev/null
+++ b/chrome-extension.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMX9Wk5SM5cIfY
+6ReKX3ybY1rsbNbOzG8ceN7yyeXB0mor8pVsX1MOna2HewOyBuaaYNJRO4tJBxic
+7a8zQErfgHL/i/QrVvVCpfJ7xKvq6zij5NYoqd/FBUwawqjeH5/voIcAp9z5Vmsr
+kL0sxJUKy6b4IWNp3noU7Nvq2RwxnXQbKDhz8FrX6oQAnDC6gsG5a2OSPsaE4oqw
+6nmonORJypmpP5hqyHY8ffXBT2lAxjHT7OnYbaCBe2TQP8+rH6rDBOhjVNtUJ089
+ocTQL6LtQEPkcF4yKJmtcOwHl8OPGZs5l9i8xb4j9RuSPkm2lbzZX8sOsdGGoqJZ
+q68nYhsHAgMBAAECggEAXmtKEzfPObq88B/kAcgSk+FngMHZzcmR7bgD3GwdSxnQ
+dkRI9zvk7eQ35tcUwntAr4Lat6/ILjFqlBmVLxrdXHuF5Xz9jcZLYgKzz61xdYM9
+dC6FKF0u5eGIIvbauGAo7jaeGFX1F3Zu5b4lP9kEOGwU1B7sxF0FzsQM5+dtCJgv
+We/hWQeF+9gtoVnkCSS/Mq2p0UomXXHW0Bz4+HuHlTR9aiYbviYnotABiLUhZyzt
+v5yUaktb9qniBfdLpRlq8cp06xYlTEA9gJpa4Pnok8OWUsbAiW6EiXUSaZ/cchVa
+AnO8WWYvVOnnt6WHI3+QdFTnqVjE5TBX4N/7bVhHGQKBgQD0dtbFqp7vZK/jVYvE
+z0WPdySOg2ZDmoSfk5ZlR1+Y9zWToHv0qu8zqoOjL8Ubxrh9fGlOow+cCVdkEuaa
+jWC2AWetuRvW0Z5A3XMXr0/N/1fgOkTqtp3WNrUPjVJahEg3lN+90opgFoT8swSi
+s1oxW0oLcVIlrjhGBXAPCfsAuQKBgQDWBLRhHsRAvGcK5wGuVnxVApTIyBOermsW
+3bJt+7+UI+4sYrBAwkWdQG93IG0cQtn48TEPBgmR2fjRF5IFT9M4/u+QOeeByT7I
+we7nVtHgSY5ByC9N0mjWbcmSg8fktz/LonjldNC4kWdOFb75fxGf8kOGS5rUaMA4
+zHucfB6ZvwKBgQCPHJrysMXGY21MaqIeHzEboaX3ABl37hdBzAa5V6UxSVdGCydF
+vmO2HVZey/JaJmWOoKyNaowSzq0oWqBBTg6VvhDR9JHFmoVId9uOvAS+FYN+Mt5x
+gWK5KuGoLxVNBC+6yh6JY526TrSfsrU+Aj0Es+qO9FIg2PL8muZVB4S3kQKBgH/5
+CDMaxpc/EQ5/2413wZjDllwI51J3USm3Hz6Mzp2ybnSz/lh60k2Zfg1polTH1Lb6
+4i7tmUNRZ2sAARyUAuWN64n+VeRRhe1dqZFDZPQMh7fmEAMk0fOGaoXlrt2ghdEq
+Mchi9Xun1nHmpu9hgBR4NNBU3RwuFuLfwvprbZDZAoGAWa62QJChE86xQGP1MrL2
+SbIzw3cfeP5xdQ3MKldJiy5IkbMR7Z13WZ7FwvPTy0g/onLHD1rqlm1kUMsGRHpD
+5vH06PNpKXQ6x8BYaRGtE6P39jLycO/X+WK/lYTrWo1bR+mGCebDh4B5XrwT3gI6
+x4Gvz134pZCTyQCf5JCwbQs=
+-----END PRIVATE KEY-----
diff --git a/chrome-extension/background.js b/chrome-extension/background.js
new file mode 100644
index 0000000..4785a23
--- /dev/null
+++ b/chrome-extension/background.js
@@ -0,0 +1,20 @@
+// background.js
+
+// Called when the user clicks on the browser action.
+chrome.browserAction.onClicked.addListener(function(tab) {
+ // get the frontend_url
+ chrome.storage.sync.get({
+ frontend_url: 'http://localhost',
+ audio_only: false
+ }, function(items) {
+ chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
+ var activeTab = tabs[0];
+ var url = activeTab.url;
+ if (url.includes('youtube.com')) {
+ var new_url = items.frontend_url + '/#/home;url=' + encodeURIComponent(url) + ';audioOnly=' + items.audio_only;
+ chrome.tabs.create({ url: new_url });
+ }
+ });
+ });
+
+});
\ No newline at end of file
diff --git a/chrome-extension/favicon.png b/chrome-extension/favicon.png
new file mode 100644
index 0000000..81d69e7
Binary files /dev/null and b/chrome-extension/favicon.png differ
diff --git a/chrome-extension/manifest.json b/chrome-extension/manifest.json
new file mode 100644
index 0000000..16754ef
--- /dev/null
+++ b/chrome-extension/manifest.json
@@ -0,0 +1,20 @@
+{
+ "manifest_version": 2,
+ "name": "YoutubeDL-Material",
+ "version": "0.1",
+ "description": "The official chrome extension of YoutubeDL-Material, an open-source and self-hosted YouTube downloader.",
+ "background": {
+ "scripts": ["background.js"]
+ },
+ "browser_action": {
+ "default_icon": "favicon.png"
+ },
+ "permissions": [
+ "tabs",
+ "storage"
+ ],
+ "options_ui": {
+ "page": "options.html",
+ "open_in_tab": false
+ }
+}
diff --git a/chrome-extension/options.html b/chrome-extension/options.html
new file mode 100644
index 0000000..d93ff2a
--- /dev/null
+++ b/chrome-extension/options.html
@@ -0,0 +1,29 @@
+
+
+
YoutubeDL-Material Extension Options
+
+
+Settings
+
+
+
Frontend URL
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/chrome-extension/options.js b/chrome-extension/options.js
new file mode 100644
index 0000000..78597b0
--- /dev/null
+++ b/chrome-extension/options.js
@@ -0,0 +1,31 @@
+// Saves options to chrome.storage
+function save_options() {
+ var frontend_url = document.getElementById('frontend_url').value;
+ var audio_only = document.getElementById('audio_only').checked;
+ chrome.storage.sync.set({
+ frontend_url: frontend_url,
+ audio_only: audio_only
+ }, function() {
+ // Update status to let user know options were saved.
+ var status = document.getElementById('status');
+ status.textContent = 'Options saved.';
+ setTimeout(function() {
+ status.textContent = '';
+ }, 750);
+ });
+ }
+
+ // Restores select box and checkbox state using the preferences
+ // stored in chrome.storage.
+ function restore_options() {
+ chrome.storage.sync.get({
+ frontend_url: 'http://localhost',
+ audio_only: false
+ }, function(items) {
+ document.getElementById('frontend_url').value = items.frontend_url;
+ document.getElementById('audio_only').checked = items.audio_only;
+ });
+ }
+ document.addEventListener('DOMContentLoaded', restore_options);
+ document.getElementById('save').addEventListener('click',
+ save_options);
\ No newline at end of file
diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts
index 64fa517..c71233c 100644
--- a/src/app/main/main.component.ts
+++ b/src/app/main/main.component.ts
@@ -15,7 +15,7 @@ import 'rxjs/add/operator/debounceTime'
import 'rxjs/add/operator/do'
import 'rxjs/add/operator/switch'
import { YoutubeSearchService, Result } from '../youtube-search.service';
-import { Router } from '@angular/router';
+import { Router, ActivatedRoute } from '@angular/router';
import { CreatePlaylistComponent } from 'app/create-playlist/create-playlist.component';
import { Platform } from '@angular/cdk/platform';
import { v4 as uuid } from 'uuid';
@@ -56,6 +56,7 @@ export class MainComponent implements OnInit {
url = '';
exists = '';
percentDownloaded: number;
+ autoStartDownload = false;
// settings
fileManagerEnabled = false;
@@ -198,7 +199,7 @@ export class MainComponent implements OnInit {
};
constructor(private postsService: PostsService, private youtubeSearch: YoutubeSearchService, public snackBar: MatSnackBar,
- private router: Router, public dialog: MatDialog, private platform: Platform) {
+ private router: Router, public dialog: MatDialog, private platform: Platform, private route: ActivatedRoute) {
this.audioOnly = false;
// loading config
@@ -241,12 +242,38 @@ export class MainComponent implements OnInit {
}
}
+ if (this.autoStartDownload) {
+ this.downloadClicked();
+ }
+
}, error => {
console.log(error);
});
}
+ // app initialization.
+ ngOnInit() {
+ this.iOS = this.platform.IOS;
+
+ if (localStorage.getItem('audioOnly') !== null) {
+ this.audioOnly = localStorage.getItem('audioOnly') === 'true';
+ }
+
+ if (localStorage.getItem('multiDownloadMode') !== null) {
+ this.multiDownloadMode = localStorage.getItem('multiDownloadMode') === 'true';
+ }
+
+ // check if params exist
+ if (this.route.snapshot.paramMap.get('url')) {
+ this.url = decodeURIComponent(this.route.snapshot.paramMap.get('url'));
+ this.audioOnly = this.route.snapshot.paramMap.get('audioOnly') === 'true';
+
+ // set auto start flag to true
+ this.autoStartDownload = true;
+ }
+ }
+
// file manager stuff
getMp3s() {
@@ -372,21 +399,6 @@ export class MainComponent implements OnInit {
});
}
-
- // app initialization.
- ngOnInit() {
- // this.iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window['MSStream'];
- this.iOS = this.platform.IOS;
-
- if (localStorage.getItem('audioOnly') !== null) {
- this.audioOnly = localStorage.getItem('audioOnly') === 'true';
- }
-
- if (localStorage.getItem('multiDownloadMode') !== null) {
- this.multiDownloadMode = localStorage.getItem('multiDownloadMode') === 'true';
- }
- }
-
// download helpers
downloadHelperMp3(name, is_playlist = false, forceView = false, new_download = null) {