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 @@
+# 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:
+
+
+Help us pick a codename for the new release:
+
+Comment in this thread: https://github.com/snobu/destreamer/issues/223
+

_(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 -

-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