diff --git a/.github/ISSUE_TEMPLATE/report-trouble.md b/.github/ISSUE_TEMPLATE/report-trouble.md index eb398f9..a40c725 100644 --- a/.github/ISSUE_TEMPLATE/report-trouble.md +++ b/.github/ISSUE_TEMPLATE/report-trouble.md @@ -7,6 +7,24 @@ assignees: '' --- -## PLEASE NEVER PASTE YOUR ACCESS TOKEN INTO A GITHUB ISSUE AS IT MAY CONTAIN PRIVATE INFORMATION + + +OS: + +Launch command used: + + +
+Verbose log + +``` +PASTE VERBOSE LOG HERE +``` +
diff --git a/README.md b/README.md index f6ebea1..b630624 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,15 @@ CI build status +# BREAKING + +**destreamer v3.0** is just around the corner. Download speed improvement is astonishing and we have a never before seen photo from the design sessions:

+![desilva](https://user-images.githubusercontent.com/6472374/93003437-54a7fd00-f547-11ea-8473-e4602993e69d.jpg) + +Help us pick a codename for the new release:

+![codename](https://user-images.githubusercontent.com/6472374/93003896-20ced680-f54b-11ea-8be1-2c14e0bd3751.png)

+Comment in this thread: https://github.com/snobu/destreamer/issues/223 + ![destreamer](assets/logo.png) _(Alternative artwork proposals are welcome! Submit one through an Issue.)_ @@ -52,6 +61,33 @@ Note that destreamer won't run in an elevated (Administrator/root) shell. Runnin **WSL** (Windows Subsystem for Linux) is not supported as it can't easily pop up a browser window. It *may* work by installing an X Window server (like [Xming][xming]) and exporting the default display to it (`export DISPLAY=:0`) before running destreamer. See [this issue for more on WSL v1 and v2][wsl]. +## Can i plug in my own browser? + +Yes, yes you can. This may be useful if your main browser has some authentication plugins that are required for you to logon to your Microsoft Stream tenant. +To use your own browser for the authentication part, locate the following snippet in `src/destreamer.ts`: + +```typescript +const browser: puppeteer.Browser = await puppeteer.launch({ + executablePath: getPuppeteerChromiumPath(), + headless: false, + userDataDir: (argv.keepLoginCookies) ? chromeCacheFolder : undefined, + args: [ + '--disable-dev-shm-usage', + '--fast-start', + '--no-sandbox' + ] + }); +``` + +Now, change `executablePath` to reflect the path to your browser and profile (i.e. to use Microsoft Edge on Windows): +```typescript + executablePath: "'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe' --profile-directory=Default", +``` + +Note that for Mac/Linux the path will look a little different but no other changes are necessary. + +You need to rebuild (`npm run build`) every time you change this configuration. + ## How to build To build destreamer clone this repository, install dependencies and run the build script - @@ -72,31 +108,35 @@ Options: --help Show help [boolean] --version Show version number [boolean] --username, -u The username used to log into Microsoft Stream (enabling this will fill in the email field for - you) [string] - --videoUrls, -i List of video urls [array] + you). [string] + --videoUrls, -i List of urls to videos or Microsoft Stream groups. [array] --inputFile, -f Path to text file containing URLs and optionally outDirs. See the README for more on outDirs. [string] + --outputDirectory, -o The directory where destreamer will save your downloads. [string] [default: "videos"] --outputTemplate, -t The template for the title. See the README for more info. [string] [default: "{title} - {publishDate} {uniqueId}"] - --outputDirectory, -o The directory where destreamer will save your downloads [string] [default: "videos"] - --keepLoginCookies, -k Let Chromium cache identity provider cookies so you can use "Remember me" during login + --keepLoginCookies, -k Let Chromium cache identity provider cookies so you can use "Remember me" during login. + Must be used every subsequent time you launch Destreamer if you want to log in automatically. [boolean] [default: false] - --noExperiments, -x Do not attempt to render video thumbnails in the console [boolean] [default: false] - --simulate, -s Disable video download and print metadata information to the console[boolean] [default: false] - --verbose, -v Print additional information to the console (use this before opening an issue on GitHub) + --noExperiments, -x Do not attempt to render video thumbnails in the console. [boolean] [default: false] + --simulate, -s Disable video download and print metadata information to the console. [boolean] [default: false] - --closedCaptions, --cc Check if closed captions are aviable and let the user choose which one to download (will not - ask if only one aviable) [boolean] [default: false] - --noCleanup, --nc Do not delete the downloaded video file when an FFmpeg error occurs [boolean] [default: false] + --verbose, -v Print additional information to the console (use this before opening an issue on GitHub). + [boolean] [default: false] + --closedCaptions, --cc Check if closed captions are available and let the user choose which one to download (will not + ask if only one available). [boolean] [default: false] + --noCleanup, --nc Do not delete the downloaded video file when an FFmpeg error occurs.[boolean] [default: false] --vcodec Re-encode video track. Specify FFmpeg codec (e.g. libx265) or set to "none" to disable video. [string] [default: "copy"] --acodec Re-encode audio track. Specify FFmpeg codec (e.g. libopus) or set to "none" to disable audio. [string] [default: "copy"] - --format Output container format (mkv, mp4, mov, anything that FFmpeg supports) + --format Output container format (mkv, mp4, mov, anything that FFmpeg supports). [string] [default: "mkv"] - --skip Skip download if file already exists [boolean] [default: false] + --skip Skip download if file already exists. [boolean] [default: false] ``` +- both --videoUrls and --inputFile also accept Microsoft Teams Groups url so if your Organization placed the videos you are interested in a group you can copy the link and Destreamer will download all the videos it can inside it! A group url looks like this https://web.microsoftstream.com/group/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + - Passing `--username` is optional. It's there to make logging in faster (the username field will be populated automatically on the login form). - You can use an absolute path for `-o` (output directory), for example `/mnt/videos`. @@ -178,7 +218,7 @@ iTerm2 on a Mac - ![screenshot](assets/screenshot-mac.png) -By default, downloads are saved under `videos/` unless specified by `-o` (output directory). +By default, downloads are saved under project root `Destreamer/videos/` ( Not the system media Videos folder ), unless specified by `-o` (output directory). ## Contributing diff --git a/src/ApiClient.ts b/src/ApiClient.ts index 2934c24..7f9c456 100644 --- a/src/ApiClient.ts +++ b/src/ApiClient.ts @@ -43,6 +43,11 @@ export class ApiClient { }); } + /** + * Used to initialize/retrive the active ApiClient + * + * @param session used if initializing + */ public static getInstance(session?: Session): ApiClient { if (!ApiClient.instance) { ApiClient.instance = new ApiClient(session); @@ -51,6 +56,16 @@ export class ApiClient { return ApiClient.instance; } + public setSession(session: Session): void { + if (!ApiClient.instance) { + logger.warn("Trying to update ApiCient session when it's not initialized!"); + } + + this.session = session; + + return; + } + /** * Call Microsoft Stream API. Base URL is sourced from * the session object and prepended automatically. diff --git a/src/CommandLineParser.ts b/src/CommandLineParser.ts index b1bb3cb..6411196 100644 --- a/src/CommandLineParser.ts +++ b/src/CommandLineParser.ts @@ -13,12 +13,12 @@ export const argv: any = yargs.options({ username: { alias: 'u', type: 'string', - describe: 'The username used to log into Microsoft Stream (enabling this will fill in the email field for you)', + describe: 'The username used to log into Microsoft Stream (enabling this will fill in the email field for you).', demandOption: false }, videoUrls: { alias: 'i', - describe: 'List of video urls', + describe: 'List of urls to videos or Microsoft Stream groups.', type: 'array', demandOption: false }, @@ -30,7 +30,7 @@ export const argv: any = yargs.options({ }, outputDirectory: { alias: 'o', - describe: 'The directory where destreamer will save your downloads', + describe: 'The directory where destreamer will save your downloads.', type: 'string', default: 'videos', demandOption: false @@ -44,28 +44,29 @@ export const argv: any = yargs.options({ }, keepLoginCookies: { alias: 'k', - describe: 'Let Chromium cache identity provider cookies so you can use "Remember me" during login', + describe: 'Let Chromium cache identity provider cookies so you can use "Remember me" during login.\n' + + 'Must be used every subsequent time you launch Destreamer if you want to log in automatically.', type: 'boolean', default: false, demandOption: false }, noExperiments: { alias: 'x', - describe: 'Do not attempt to render video thumbnails in the console', + describe: 'Do not attempt to render video thumbnails in the console.', type: 'boolean', default: false, demandOption: false }, simulate: { alias: 's', - describe: 'Disable video download and print metadata information to the console', + describe: 'Disable video download and print metadata information to the console.', type: 'boolean', default: false, demandOption: false }, verbose: { alias: 'v', - describe: 'Print additional information to the console (use this before opening an issue on GitHub)', + describe: 'Print additional information to the console (use this before opening an issue on GitHub).', type: 'boolean', default: false, demandOption: false @@ -92,13 +93,13 @@ export const argv: any = yargs.options({ demandOption: false }, format: { - describe: 'Output container format (mkv, mp4, mov, anything that FFmpeg supports)', + describe: 'Output container format (mkv, mp4, mov, anything that FFmpeg supports).', type: 'string', default: 'mkv', demandOption: false }, skip: { - describe: 'Skip download if file already exists', + describe: 'Skip download if file already exists.', type: 'boolean', default: false, demandOption: false