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) {