Update documents

This commit is contained in:
jafea7 2025-05-13 15:46:02 +10:00
parent 02395612cf
commit 34e0419367
10 changed files with 291 additions and 473 deletions

View File

@ -18,90 +18,62 @@ server:
##### Values ##### Values
The application and the server share the same configuration file structure. That's why there are The application and the server share the same configuration file structure. That's why there are values, which don't make sense in the server configuration and vice versa. These values are simply ignored. This is a collection of the most interesting values:
values, which don't make sense in the server configuration and vice versa. These values are simply
ignored. This is a collection of the most interesting values:
- **chooseStreamQuality** (app only) - [`true`,`false`] Opens the stream resolution selection dialog, when you start recording a model. - **chooseStreamQuality** (app only) - [`true`,`false`] Opens the stream resolution selection dialog, when you start recording a model.
- **concurrentRecordings** - [0 - 2147483647] Limits the number of concurrently running recordings. Once this number is reached, now more recordings are started - **concurrentRecordings** - [0 - 2147483647] Limits the number of concurrently running recordings. Once this number is reached, now more recordings are started until a recording is finished. 0 means unlimited.
until a recording is finished. 0 means unlimited.
- **determineResolution** (app only) - [`true`,`false`] Display the stream resolution on the thumbnails. - **determineResolution** (app only) - [`true`,`false`] Display the stream resolution on the thumbnails.
- **hlsdlExecutable** - Path to the hlsdl executable, which is used, if `useHlsdl` is set to true - **hlsdlExecutable** - Path to the hlsdl executable, which is used, if `useHlsdl` is set to true
- **httpPort** - [1 - 65536] The TCP port, the server listens on. In the server config, this will tell the server, which port to use. In the application this - **httpPort** - [1 - 65536] The TCP port, the server listens on. In the server config, this will tell the server, which port to use. In the application this will set the port ctbrec tries to connect to, if it is run in remote mode.
will set
the port ctbrec tries to connect to, if it is run in remote mode.
- **httpServer** (app only) - The TCP host where the server is running. Has no effect, if ctbrec is run in local reocrding mode. - **httpServer** (app only) - The TCP host where the server is running. Has no effect, if ctbrec is run in local reocrding mode.
- **httpTimeout** - [1 - 2147483647] in milliseconds. In the server configuration this sets the idle timeout for connections to the server. In the app this sets - **httpTimeout** - [1 - 2147483647] in milliseconds. In the server configuration this sets the idle timeout for connections to the server. In the app this sets the connect and read timeout for any HTTP connection.
the connect and read timeout for any HTTP connection.
- **httpUserAgent** - The user agent, which is used in the HTTP header, when ctbrec connects to a camsite. This is used to disguise, that it actually is a - **httpUserAgent** - The user agent, which is used in the HTTP header, when ctbrec connects to a camsite. This is used to disguise, that it actually is a recording software :)
recording software :)
- **httpUserAgentMobile** - Same as *httpUserAgent*, but in some cases we have to pretend to be a mobile phone :) - **httpUserAgentMobile** - Same as *httpUserAgent*, but in some cases we have to pretend to be a mobile phone :)
- **key** - Key for the HMAC based authentication. If this is set in server config and contains values, the HMAC authentication is automatically active. - **key** - Key for the HMAC based authentication. If this is set in server config and contains values, the HMAC authentication is automatically active.
- **livePreviews** (app only) - Enables the live preview feature in the app.
- **logFFmpegOutput** - [`true`,`false`] The output from FFmpeg (from recordings or post-processing steps) will be logged in temporary files. - **logFFmpegOutput** - [`true`,`false`] The output from FFmpeg (from recordings or post-processing steps) will be logged in temporary files.
- **loghlsdlOutput** - [`true`,`false`] The output from hlsdl will be logged in temporary files. Only in effect, if `useHlsdl` is set to true - **loghlsdlOutput** - [`true`,`false`] The output from hlsdl will be logged in temporary files. Only in effect, if `useHlsdl` is set to true
- **minimumResolution** - [1 - 2147483647]. Sets the minimum video height for a recording. ctbrec tries to find a stream quality, which is higher than or equal - **minimumResolution** - [1 - 2147483647]. Sets the minimum video height for a recording. ctbrec tries to find a stream quality, which is higher than or equal to this value. If the only provided stream quality is below this threshold, ctbrec won't record the stream.
to this value. If the only provided stream quality is below this threshold, ctbrec won't record the stream.
- **maximumResolution** - [1 - 2147483647]. Sets the maximum video height for a recording. ctbrec tries to find a stream quality, which is lower than or equal - **maximumResolution** - [1 - 2147483647]. Sets the maximum video height for a recording. ctbrec tries to find a stream quality, which is lower than or equal to this value. If the only provided stream quality is above this threshold, ctbrec won't record the stream.
to this value. If the only provided stream quality is above this threshold, ctbrec won't record the stream.
- **minimumLengthInSeconds** - **Deprecated. Add a post-processing step instead. See [Post-Processing](PostProcessing.md)** [0 - 2147483647] - **minimumLengthInSeconds** - **Deprecated. Add a post-processing step instead. See [Post-Processing](PostProcessing.md)** [0 - 2147483647] Automatically delete recordings, which are shorter than this amount of seconds. 0 disables this feature.
Automatically delete recordings, which are shorter than this amount of seconds. 0 disables this feature.
- **minimumSpaceLeftInBytes** - [0 - 9223372036854775807] The space in bytes ctbrec should conserve on the hard drive. 1 GiB = 1024 MiB = 1048576 KiB = - **minimumSpaceLeftInBytes** - [0 - 9223372036854775807] The space in bytes ctbrec should conserve on the hard drive. 1 GiB = 1024 MiB = 1048576 KiB = 1073741824 bytes
1073741824 bytes
- **onlineCheckIntervalInSecs** - [1 - 2147483647] How often ctbrec checks, if a model is online. This is not a guaranteed interval: If you record many models, - **onlineCheckIntervalInSecs** - [1 - 2147483647] How often ctbrec checks, if a model is online. This is not a guaranteed interval: If you record many models, the online check for all models can take longer than this interval. A minute is a reasonable value, but you can go lower, if you don't want to miss a anything. But don't go too low, or you risk to do too many requests in a short amount of time and get banned by some sites.
the online check for all models can take longer than this interval. A minute is a reasonable value, but you can go lower, if you don't want to miss a
anything. But don't go too low, or you risk to do too many requests in a short amount of time and get banned by some sites.
- **onlineCheckSkipsPausedModels** - [`true`,`false`] Skip the online check for paused models. If you have many models in the recording list, this can reduce - **onlineCheckSkipsPausedModels** - [`true`,`false`] Skip the online check for paused models. If you have many models in the recording list, this can reduce the delay when a recording starts after a model came online.
the delay when a recording starts after a model came online.
- **postProcessing** - **Deprecated. See [Post-Processing](PostProcessing.md)** Absolute path to a script, which is executed once a recording is - **postProcessing** - **Deprecated. See [Post-Processing](PostProcessing.md)** Absolute path to a script, which is executed once a recording is finished.
finished.
- **recordingsDir** - Where ctbrec saves the recordings. - **recordingsDir** - Where ctbrec saves the recordings.
- **recordingsDirStructure** (server only) - [`FLAT`, `ONE_PER_MODEL`, `ONE_PER_GROUP`, `ONE_PER_RECORDING`] How recordings are stored in the file system. `FLAT` - all - **recordingsDirStructure** (server only) - [`FLAT`, `ONE_PER_MODEL`, `ONE_PER_GROUP`, `ONE_PER_RECORDING`] How recordings are stored in the file system. `FLAT` - all recordings in one directory; `ONE_PER_MODEL` - one directory per model; `ONE_PER_GROUP` - one directory per model group; `ONE_PER_RECORDING` - each recordings ends up in its own directory. Change this only, if you have `recordSingleFile` set to `true`
recordings in one directory; `ONE_PER_MODEL` - one directory per model; `ONE_PER_GROUP` - one directory per model group; `ONE_PER_RECORDING` - each recordings ends up in its own directory. Change this only,
if you have `recordSingleFile` set to `true`
- **recordSingleFile** (server only) - [`true`,`false`] - How recordings are stored in the file system. `true` means, each recording is saved in one large - **recordSingleFile** (server only) - [`true`,`false`] - How recordings are stored in the file system. `true` means, each recording is saved in one large file. `false` means, ctbrec just downloads the stream segments.
file. `false` means, ctbrec just downloads the stream segments.
- **splitStrategy** - [`DONT`, `TIME`, `SIZE`, `TIME_OR_SIZE`] Defines if and how to split recordings. Also see `splitRecordingsAfterSecs` - **splitStrategy** - [`DONT`, `TIME`, `SIZE`, `TIME_OR_SIZE`] Defines if and how to split recordings. Also see `splitRecordingsAfterSecs` and `splitRecordingsBiggerThanBytes`
and `splitRecordingsBiggerThanBytes`
- **splitRecordingsAfterSecs** - [0 - 2147483647] in seconds. Split recordings after this amount of seconds. The recordings are split up into several individual - **splitRecordingsAfterSecs** - [0 - 2147483647] in seconds. Split recordings after this amount of seconds. The recordings are split up into several individual recordings, which have the defined length (roughly). Has to be activated with `splitStrategy`.
recordings,
which have the defined length (roughly). Has to be activated with `splitStrategy`.
- **splitRecordingsBiggerThanBytes** - [0 - 9223372036854775807] in bytes. Split recordings, if the size on disk exceeds this value. The recordings are split up - **splitRecordingsBiggerThanBytes** - [0 - 9223372036854775807] in bytes. Split recordings, if the size on disk exceeds this value. The recordings are split up into several individual recordings, which have the defined size (roughly). Has to be activated with `splitStrategy`.
into several individual recordings,
which have the defined size (roughly). Has to be activated with `splitStrategy`.
- **timeoutRecordingStartingAt** - [00:00 - 23:59] - Start of the recording timeout timeframe - No new recordings will be started in this period - **timeoutRecordingStartingAt** - [00:00 - 23:59] - Start of the recording timeout timeframe - No new recordings will be started in this period
- **timeoutRecordingEndingAt** - [00:00 - 23:59] - End of the recording timeout timeframe - No new recordings will be started in this period - **timeoutRecordingEndingAt** - [00:00 - 23:59] - End of the recording timeout timeframe - No new recordings will be started in this period
- **useHlsdl** - [`true`,`false`] Use hlsdl to record the live streams. You also have to set `hlsdlExecutable`, if hlsdl is not globally available on your - **useHlsdl** - [`true`,`false`] Use hlsdl to record the live streams. You also have to set `hlsdlExecutable`, if hlsdl is not globally available on your system. hlsdl won't be used for Showup.
system. hlsdl won't be used for Showup.
- **webinterface** (server only) - [`true`,`false`] Enables the webinterface for the server. You can access it with http://host:port/static/index.html Don't - **webinterface** (server only) - [`true`,`false`] Enables the webinterface for the server. You can access it with http://host:port/static/index.html **Don't activate this on a machine which can be accessed from the internet because this is totally unprotected at the moment.**
activate this on
a machine, which can be accessed from the internet, because this is totally unprotected at the moment.

View File

@ -19,11 +19,11 @@ It is available for all major platforms. FFmpeg can be used to manually and auto
* Open a terminal (command prompt) and cd into the directory of the recording * Open a terminal (command prompt) and cd into the directory of the recording
* Run FFmpeg: * Run FFmpeg:
`ffmpeg -i AwesomeGirl_-2019-04-04_15-46-19_195.ts -c:v copy -c:a copy AwesomeGirl_-2019-04-04_15-46-19_195.mp4` `ffmpeg -i AwesomeGirl_-2019-04-04_15-46-19_195.ts -c:v copy -c:a copy AwesomeGirl_-2019-04-04_15-46-19_195.mkv`
or
`ffmpeg -i AwesomeGirl_-2019-04-04_15-46-19_195.ts -c:v copy -c:a copy -movflags faststart AwesomeGirl_-2019-04-04_15-46-19_195.mp4`
As you can see, the codecs for video and audio are set to copy, which means, that the recording is not reencoded, but just "copied" to As you can see, the codecs for video and audio are set to copy, which means, that the recording is not reencoded, but just "copied" to another container format. You could also use another container suffix and FFmpeg would create that respective file. Depending on your hardware specs and the length of the recording, this process probably takes a few seconds up to a couple of minutes.
another container format. You could also use mkv or avi for the output file suffix and FFmpeg would create that respective file. Depending
on your hardware specs and the length of the recording, this process probably takes a few seconds up to a couple of minutes.
##### Automatic remuxing ##### Automatic remuxing

View File

@ -1,7 +1,6 @@
#### MKVToolNix #### MKVToolNix
[MKVToolNix](https://mkvtoolnix.download/) is a collection of tools for the Matroska media container format. [MKVToolNix](https://mkvtoolnix.download/) is a collection of tools for the Matroska media container format.
It is available for all major platforms. MKVToolNix can be used to manually remux recordings and convert them It is available for all major platforms. MKVToolNix can be used to manually remux recordings and convert them from .ts to .mkv.
from .ts to .mkv.
1. Open the .ts file with MKVToolNix GUI 1. Open the .ts file with MKVToolNix GUI
2. Define the output file at the bottom 2. Define the output file at the bottom

View File

@ -1,47 +1,38 @@
#### Post-Processing #### Post-Processing
The post-processing gives you the possibility to execute different actions after a recording has finished. You can use that to convert The post-processing gives you the possibility to execute different actions after a recording has finished. You can use that to convert the files to another format, create preview images, rename / move the file etc.
the files to another format, create preview images, rename / move the file etc.
##### Available Steps ##### Available Steps
- **create a copy** - Creates a copy of the original recording. All following post-processing steps are executed on the copy, not on the - **create a copy** - Creates a copy of the original recording. All following post-processing steps are executed on the copy, not on the original recording. This means, that the post-processing can be rerun in case a step failed, because the original recording is still available.
original recording. This means, that the post-processing can be rerun in case a step failed, because the original recording is still
available.
- **rename** - Renames the recording with the help of variables. See [Variables](#variables) - **rename** - Renames the recording with the help of variables. See [Variables](#variables)
- **move** - Moves the recording with the help of variables. See [Variables](#variables) - **move** - Moves the recording with the help of variables. See [Variables](#variables)
- **remux / transcode** - Executes FFmpeg with the given arguments on the recording. This step can be used to convert a recording to - **remux / transcode** - Executes FFmpeg with the given arguments on the recording. This step can be used to convert a recording to MP4 or re-encode it to a different format / resolution. The input and output file don't have to be defined. If the step was successful the input file gets deleted.
MP4 or re-encode it to a different format / resolution. The input and output file don't have to be defined. If the step was successful - **execute script** - Executes a script or program with the given arguments. You can use the [variables](#variables) to define what to pass over to the script.
the input file gets deleted. - **delete too short** - Delete a recording, if it is shorter than the given duration. This post-processing step has replaced the setting, which was available in the post-processing category before
- **execute script** - Executes a script or program with the given arguments. You can use the [variables](#variables) to define what - **delete original** - This is a companion step for "create a copy". If you use the copy step and all other steps are successful, you probably want to get rid of the original file and just keep the result of the post-processing. That's what this step does.
to pass over to the script.
- **delete too short** - Delete a recording, if it is shorter than the given duration. This post-processing step has replaced the
setting, which was available in the post-processing category before
- **delete original** - This is a companion step for "create a copy". If you use the copy step and all other steps are successful,
you probably want to get rid of the original file and just keep the result of the post-processing. That's what this step does.
- **remove recording, but keep the files** - Removes the recording from the recordings list, but keeps the files untouched. - **remove recording, but keep the files** - Removes the recording from the recordings list, but keeps the files untouched.
- **create contactsheet** - create a contact sheet with preview images of the recording - **create contactsheet** - create a contact sheet with preview images of the recording
#### Planned for future releases #### Planned for future releases
- **call a webhook** - call a URL once a recording is finished - **call a webhook** - call a URL once a recording is finished
- **create timeline thumbnails** - create a small thumbnail for every second or every few seconds, which can be used to very fast - **create timeline thumbnails** - create a small thumbnail for every second or every few seconds, which can be used to very fast scan through a recording
scan through a recording
#### How to configure the server to do post-processing #### How to configure the server to do post-processing
There is currently no user interface to configure the post-processing for the server. It has to be added manually to the server config. There is currently no user interface to configure the post-processing for the server. It has to be added manually to the server config.
I suggest to start the app and configure the post-processing steps in the settings. Afterwards you close the app and copy the I suggest to start the app and configure the post-processing steps in the settings. Afterwards you close the app and copy the post-processing section from the settings.json to your server.json file. To find out, where these files are on your system, read [Configuration File](ConfigurationFile.md).
post-processing section from the settings.json to your server.json file. To find out, where these files are on your system, read
[Configuration File](ConfigurationFile.md).
The part you have to copy is The part you have to copy is:
``` ```
postProcessors: [ postProcessors: [
... ...
], ],
``` ```
**NOTE:** There are discrepencies between the way Windows and Linux directories are written, you will need to adjust if copying from one OS to the other.
#### Variables #### Variables
@ -50,24 +41,17 @@ The part you have to copy is
###### Available variables: ###### Available variables:
- **${modelName}** - the name of the recorded model - **${modelName}** - the name of the recorded model
- **${modelDisplayName}** - the name of the recorded model, which is shown on the webpage. Might be the same as - **${modelDisplayName}** - the name of the recorded model, which is shown on the webpage. Might be the same as ${modelName}
${modelName}
- **${modelGroupName}** - name of the model group, if the model is part of a group - **${modelGroupName}** - name of the model group, if the model is part of a group
- **${modelGroupId}** - the unique ID of the model group, if the model is part of a group - **${modelGroupId}** - the unique ID of the model group, if the model is part of a group
- **${siteName}** - the name of the cam site, the model streams on - **${siteName}** - the name of the cam site, the model streams on
- **${fileSuffix}** - the file extension of the recording. E.g. ts or mp4. In case of a standard server recording, - **${fileSuffix}** - the file extension of the recording. E.g. ts or mp4. In case of a standard server recording, this will be empty
this will be empty
- **${epochSecond}** - timestamp of the recording in seconds since 1970-01-01 (unixtime) - **${epochSecond}** - timestamp of the recording in seconds since 1970-01-01 (unixtime)
- **${modelNotes}** - sanitized model notes. The following characters are replaced by an underscore: - **${modelNotes}** - sanitized model notes. The following characters are replaced by an underscore: \\, /, ', " and space
\\, /, ', " and space - **${recordingNotes}** - sanitized recording notes. The following characters are replaced by an underscore: \\, /, ', " and space. Useful for the download of recordings from the server.
- **${recordingNotes}** - sanitized recording notes. The following characters are replaced by an underscore: - **${recordingsDir}** - the base directory of all recordings. Same as Recordings Directory in the Recorder settings section.
\\, /, ', " and space. Useful for the download of recordings from the server. - **${absolutePath}** - the absolute path in the filesystem to the recording file (or the recording directory in case of a server recording)
- **${recordingsDir}** - the base directory of all recordings. Same as Recordings Directory in the Recorder settings - **${absoluteParentPath}** - the absolute path to the parent directory of the recording in the filesystem (or the recording dir in case of a server recording)
section.
- **${absolutePath}** - the absolute path in the filesystem to the recording file (or the recording directory in case of
a server recording)
- **${absoluteParentPath}** - the absolute path to the parent directory of the recording in the filesystem (or the
recording dir in case of a server recording)
- **${utcDateTime}** and **${localDateTime}** - the timestamp of the recording in the UTC or your local timezone - **${utcDateTime}** and **${localDateTime}** - the timestamp of the recording in the UTC or your local timezone
#### Functions #### Functions
@ -76,21 +60,17 @@ The part you have to copy is
- **$upper** - converts all of the characters to upper case - `$upper(hello world)` becomes `HELLO WORLD` - **$upper** - converts all of the characters to upper case - `$upper(hello world)` becomes `HELLO WORLD`
- **$lower** - converts all of the characters to lower case - `$lower(hElLo WORLD)` becomes `hello world` - **$lower** - converts all of the characters to lower case - `$lower(hElLo WORLD)` becomes `hello world`
- **$capitalize** - capitalizes words changing the first character to upper case - `$capitalize(hElLo WorLD)` becomes `HElLo WorLD` - **$capitalize** - capitalizes words changing the first character to upper case - `$capitalize(hElLo WorLD)` becomes `HElLo WorLD`
- **$sanitize** - removes problematic characters - `$sanitize(hEl'Lo / WO"RLD)` becomes `hEl_Lo___WO_RLD`. The following characters are replaced by an - **$sanitize** - removes problematic characters - `$sanitize(hEl'Lo / WO"RLD)` becomes `hEl_Lo___WO_RLD`. The following characters are replaced by an underscore: \\, /, ', " and space
underscore: - **$orElse** - provide an alternative in case a variable is not set - `$orElse(${variable},someValue)` - becomes `${variable}`, if it is set or `someValue`, if `${variable}` is not set
\\, /, ', " and space
- **$orElse** - provide an alternative in case a variable is not set - `$orElse(${variable},someValue)` - becomes `${variable}`, if it is set or `someValue`, if
`${variable}` is not set
- **$format** - formats a date, can be used with a pattern or without. - **$format** - formats a date, can be used with a pattern or without.
Examples: Examples:
- `$format(${localDateTime})` - becomes something like `2023-02-26_12-23-15` - `$format(${localDateTime})` - becomes something like `2023-02-26_12-23-15`
- `$format(${localDateTime},yyyyMMdd-HHmmss)` would lead to `20200928-173605` - `$format(${localDateTime},yyyyMMdd-HHmmss)` would lead to `20200928-173605`
<table class="table-striped"> <table class="table-striped">
<thead>
<thead>
<tr><th scope="col">Symbol</th> <th scope="col">Meaning</th> <th scope="col">Presentation</th> <th scope="col">Examples</th> <tr><th scope="col">Symbol</th> <th scope="col">Meaning</th> <th scope="col">Presentation</th> <th scope="col">Examples</th>
</tr></thead> </tr></thead>
<tbody> <tbody>
<tr><th scope="row">G</th> <td>era</td> <td>text</td> <td>AD; Anno Domini; A</td> <tr><th scope="row">G</th> <td>era</td> <td>text</td> <td>AD; Anno Domini; A</td>
</tr><tr><th scope="row">u</th> <td>year</td> <td>year</td> <td>2004; 04</td> </tr><tr><th scope="row">u</th> <td>year</td> <td>year</td> <td>2004; 04</td>
</tr><tr><th scope="row">y</th> <td>year-of-era</td> <td>year</td> <td>2004; 04</td> </tr><tr><th scope="row">y</th> <td>year-of-era</td> <td>year</td> <td>2004; 04</td>
@ -142,3 +122,5 @@ For more information see: [DateTimeFormatter](https://docs.oracle.com/en/java/ja
#### Full Example #### Full Example
`$orElse(${modelGroupName},$sanitize(${modelName}))_$format(${localDateTime})_${recordingNotes}` `$orElse(${modelGroupName},$sanitize(${modelName}))_$format(${localDateTime})_${recordingNotes}`
The Settings -> Post-processing tab in the standalone includes a `Variable Playground` where you can try various variables.

View File

@ -1,20 +1,15 @@
#### Are ticket / gold / private shows supported? #### Are ticket / gold / private shows supported?
No. I never intended to record these kind of shows and I never tested it. You might be able to record No. I never intended to record these kind of shows and I never tested it. You might be able to record them, but you have to figure it out yourself.
them, but you have to figure it out yourself.
#### How can I convert the recordings to mp4 / mkv? #### How can I convert the recordings to MP4 / MKV containers?
To convert the files to another format, you have to remux them. You don't have to reencode them, since the To convert the files to another format, you have to remux them. You don't have to reencode them, since the files (usually, have not seen an exception yet) already contain H.264 video and AAC audio. You can remux the files manually with tools like [Avidemux](Avidemux.md), [MKVToolNix](MKVToolNix.md) or [FFmpeg](FFmpeg.md) or use the `remux/transcode` step in [post-processing](PostProcessing.md).
files (usually, have not seen an exception yet) already contain H.264 video and AAC audio. You can remux the
files manually with tools like [Avidemux](Avidemux.md), [MKVToolNix](MKVToolNix.md) or
[FFmpeg](FFmpeg.md) or use the `remux/transcode` step in [post-processing](PostProcessing.md).
#### Streams are not getting recorded even though the model is online #### Streams are not getting recorded even though the model is online
- Is "Leave space on device set" and do you have enough space left? - Is "Leave space on device set" and do you have enough space left?
- Is "Maximum resolution" set? In case maximum resolution is set and ctbrec cannot determine the - Is "Maximum resolution" set? In case maximum resolution is set and ctbrec cannot determine the resolution of a stream, the stream will not be recorded.
resolution of a stream, the stream will not be recorded.
- Is "Concurrent Recordings" set and you reached the maximum? - Is "Concurrent Recordings" set and you reached the maximum?
#### How can I playback the recorded .ts files? #### How can I playback the recorded .ts files?
@ -33,34 +28,29 @@ Use one of the following players:
- [mpv](https://mpv.io/installation/) - [mpv](https://mpv.io/installation/)
- [VLC](https://www.videolan.org/vlc/) - [VLC](https://www.videolan.org/vlc/)
If you have direct access to the recordings you can use these players and open the playlist.m3u8. If you have direct access to the recordings you can use these players and open the `playlist.m3u8`.
Otherwise use the ctbrec client. Set the **Record Location** to **Remote** and configure your server. Otherwise use the ctbrec client. Set the **Record Location** to **Remote** and configure your server.
Under **General** select the **Player** of your choice. Then you can start the playback directly from the Under **General** select the **Player** of your choice. Then you can start the playback directly from the **Recordings** tab.
**Recordings** tab.
#### The login for site XYZ does not work anymore and the credentails work in a browser #### The login for site XYZ does not work anymore and the credentails work in a browser
Stop CTB Recorder. Then open the settings directory (check [ConfigurationFile](ConfigurationFile.md) for the location) and - Delete the cookies by going to Settings->Sites then use the `Delete Cookies` button for the site.
delete the cookies file for that site. Start CTB Recorder again and it should work again. If it does not work, check the log
file for errors. The log file is called ctbrec.log and you can find it in the installation directory of CTB Recorder. If it does not work, check the log file for errors. The log file is called `ctbrec.log` and you can find it in the installation directory of CTB Recorder.
If that does not work go back to your settings directory, go up to the parent directory and delete ctbrec-minimal-browser, if it If that does not work go back to your settings directory, go up to the parent directory and delete ctbrec-minimal-browser, if it exists.
exists.
#### It takes a long time until a recording starts for a model #### It takes a long time until a recording starts for a model
You probably have a lot of models in the "Recording" list. CTB Recorder checks the models one after the other. This is done on You probably have a lot of models in the "Recording" list. CTB Recorder checks the models one after the other. This is done on purpose to not fire too many requests in a short amount of time because this can cause blocks by the camsites.
purpose to not fire too many requests in a short amount of time because this can cause blocks by the camsites.
#### Can I run several instances of CTB Recorder #### Can I run several instances of CTB Recorder
It is possible to define the configuration directory and configuration file, which is used by ctbrec. This way you It is possible to define the configuration directory and configuration file, which is used by ctbrec. This way you can create several instances with different configurations.
can create several instances with different configurations. On Windows, create a file called `ctbrec.l4j.ini` right next to `ctbrec.exe`. Add one of the following settings or both to the file:
On Windows, create a file called `ctbrec.l4j.ini` right next to `ctbrec.exe`. Add one of the following settings
or both to the file:
To change the config directory: To change the config directory:
`-Dctbrec.config.dir=C:\Users\boobface\Desktop\ctbrec\conf` `-Dctbrec.config.dir=D:\ctbrec\conf`
To change only the config file: To change only the config file:
@ -68,6 +58,6 @@ To change only the config file:
On Linux and macOS edit `ctbrec.sh` and add one or both of the above mentioned settings to the start line (preferably directly after $JAVA): On Linux and macOS edit `ctbrec.sh` and add one or both of the above mentioned settings to the start line (preferably directly after $JAVA):
`$JAVA -Dctbrec.config=alternate-settings.json -Djdk.gtk.version=3 -cp ctbrec-1.19.1-final.jar ctbrec.ui.Launcher` `$JAVA -Dctbrec.config=alternate-settings.json -Djdk.gtk.version=3 -cp ctbrec-5.3.0-final.jar ctbrec.ui.Launcher`
<iframe width="560" height="315" src="https://www.youtube.com/embed/ATeS6HgADUo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <iframe width="560" height="315" src="https://www.youtube.com/embed/ATeS6HgADUo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

View File

@ -15,17 +15,16 @@ On macOS it is `/Users/{your user name}/Library/Preferences/ctbrec/<version>/ser
You can open this file in a text editor and change it to your likings. You probably only want to change `httpPort` and `recordingsDir`. Most of the other stuff is irrelevant since the server and CTB Recorder use the same config file format. When the server is running, you can connect to it with CTB Recorder by changing the setting "Record location" to "Remote". You can open this file in a text editor and change it to your likings. You probably only want to change `httpPort` and `recordingsDir`. Most of the other stuff is irrelevant since the server and CTB Recorder use the same config file format. When the server is running, you can connect to it with CTB Recorder by changing the setting "Record location" to "Remote".
Do not try to edit the `server.json` while the server is running, it will be overwritten and any changes lost.
### Web Interface ### Web Interface
You can enable the server's web interface in the configuration server.json. Just set `webinterface` to true and set values for `webinterfaceUsername` and `webinterfacePassword`. You can enable the server's web interface in the configuration server.json. Just set `webinterface` to true and set values for `webinterfaceUsername` and `webinterfacePassword`.
### SSL / TLS ### SSL / TLS
Since version 2.2.0 CTB Recorder supports SSL / TLS. To switch it on/off you have to change the server and client configuration. On the server side open the server.json and set Since version 2.2.0 CTB Recorder supports SSL / TLS. To switch it on/off you have to change the server and client configuration. On the server side open the `server.json` and set `transportLayerSecurity` to true. The server will then open an additional port, which can be configured with `httpSecurePort`.
`transportLayerSecurity` to true. The server will then open an additional port, which can be configured with `httpSecurePort`. On the client side open CTB Recorder and on the Settings tab change the port to the value of `httpSecurePort`. Then tick `Use Secure Communication (TLS)`. Afterwards restart CTB Recorder and you should be able to connect to the server.
On the client side open CTB Recorder and on the Settings tab change the port to the value of `httpSecurePort`. Then tick `Use Secure Communication (TLS)`. Afterwards restart
CTB Recorder and you should be able to connect to the server.
By default, CTB Recorder uses a self-signed certificate. If you also use the webinterface, your browser will complain about that, but you can just ignore the warning and add the By default, CTB Recorder uses a self-signed certificate. If you also use the webinterface, your browser will complain about that, but you can just ignore the warning and add the certificate to your trusted certificates.
certificate to your trusted certificates.
#### Custom certificate #### Custom certificate
You can also use your own certificate, if you want to. Follow these steps to create a keystore, which can be used by the server: You can also use your own certificate, if you want to. Follow these steps to create a keystore, which can be used by the server:

View File

@ -17,6 +17,16 @@ This section contains video tutorials, which how different aspects of running CT
``` ```
#### How to run multiple instances on Windows
<iframe width="560" height="315" src="https://www.youtube.com/embed/ATeS6HgADUo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
```
```
The following is redundant, see [post-processing](PostProcessing.md).
#### How to rename recordings with a post-processing script (Windows) #### How to rename recordings with a post-processing script (Windows)
<iframe width="560" height="315" src="https://www.youtube.com/embed/QIZhrhBFhoc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <iframe width="560" height="315" src="https://www.youtube.com/embed/QIZhrhBFhoc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
@ -24,11 +34,3 @@ This section contains video tutorials, which how different aspects of running CT
``` ```
#### How to run multiple instances on Windows 10
<iframe width="560" height="315" src="https://www.youtube.com/embed/ATeS6HgADUo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
```
```

View File

@ -26,11 +26,11 @@
<script> <script>
$( "#search" ).autocomplete({ $( "#search" ).autocomplete({
source: "@{/search}", source: "@{/search}",
minLength: 2, minLength: 2,
select: function( event, ui ) { select: function( event, ui ) {
location.href = "@{/docs/}" + ui.item.value; location.href = "@{/docs/}" + ui.item.value;
} }
}); });
</script> </script>

View File

@ -15,7 +15,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="CTB Recorder is a free recording software for Chaturbate"> <meta name="description" content="CTB Recorder is a free recording software for Chaturbate">
<meta name="author" content=""> <meta name="author" content="0xb00bface">
<title>CTB Recorder</title> <title>CTB Recorder</title>

View File

@ -1,51 +1,41 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-129283922-1"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-129283922-1"></script>
<script> <script>
window.dataLayer = window.dataLayer || []; window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-129283922-1');
</script>
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'UA-129283922-1');
</script>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="CTB Recorder is a free recording software for Chaturbate"> <meta name="description" content="CTB Recorder is a free recording software for Chaturbate">
<meta name="author" content=""> <meta name="author" content="">
<title>CTB Recorder</title> <title>CTB Recorder</title>
<!-- Bootstrap core CSS --> <!-- Bootstrap core CSS -->
<link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom fonts for this template --> <!-- Custom fonts for this template -->
<link href="vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"> <link href="vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,700" rel="stylesheet" type="text/css"> <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700" rel="stylesheet" type="text/css">
<link href="https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic" rel="stylesheet" type="text/css"> <link href="https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic" rel="stylesheet" type="text/css">
<!-- Plugin CSS --> <!-- Plugin CSS -->
<link href="vendor/magnific-popup/magnific-popup.css" rel="stylesheet" type="text/css"> <link href="vendor/magnific-popup/magnific-popup.css" rel="stylesheet" type="text/css">
<!-- Custom styles for this template --> <!-- Custom styles for this template -->
<link href="css/freelancer.min.css" rel="stylesheet"> <link href="css/freelancer.min.css" rel="stylesheet">
<link rel="shortcut icon" href="img/favicon.png" type="image/x-icon" /> <link rel="shortcut icon" href="img/favicon.png" type="image/x-icon" />
</head> </head>
<body id="page-top"> <body id="page-top">
<!-- Navigation --> <!-- Navigation -->
<nav class="navbar navbar-expand-lg bg-secondary fixed-top text-uppercase" id="mainNav"> <nav class="navbar navbar-expand-lg bg-secondary fixed-top text-uppercase" id="mainNav">
<div class="container"> <div class="container">
<a class="navbar-brand js-scroll-trigger" href="#page-top"><img src="https://raw.githubusercontent.com/0xboobface/ctbrec/master/client/src/main/resources/icon64.png" alt="Logo"/>CTB Recorder</a> <a class="navbar-brand js-scroll-trigger" href="#page-top">
<button class="navbar-toggler navbar-toggler-right text-uppercase bg-primary text-white rounded" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"> <img src="https://raw.githubusercontent.com/0xboobface/ctbrec/master/client/src/main/resources/icon64.png" alt="Logo" />CTB Recorder </a>
Menu <button class="navbar-toggler navbar-toggler-right text-uppercase bg-primary text-white rounded" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"> Menu <i class="fa fa-bars"></i>
<i class="fa fa-bars"></i>
</button> </button>
<div class="collapse navbar-collapse" id="navbarResponsive"> <div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ml-auto"> <ul class="navbar-nav ml-auto">
@ -62,15 +52,14 @@
<a class="nav-link py-3 px-0 px-lg-3 rounded js-scroll-trigger" href="#code">Source Code</a> <a class="nav-link py-3 px-0 px-lg-3 rounded js-scroll-trigger" href="#code">Source Code</a>
</li> </li>
<li class="nav-item mx-0 mx-lg-1"> <li class="nav-item mx-0 mx-lg-1">
<a href="#donate" class="js-scroll-trigger" style="float:right; margin-left: 10px"> <a href="#donate" class="js-scroll-trigger" style="float:right; margin-left: 10px">
<img src="img/buymeacoffee/Button/button-red.png" alt="Buy a coffee" style="width:150px; padding-top: 7px"/> <img src="img/buymeacoffee/Button/button-red.png" alt="Buy a coffee" style="width:150px; padding-top: 7px" />
</a> </a>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<!-- Header --> <!-- Header -->
<header class="masthead bg-primary text-white text-center"> <header class="masthead bg-primary text-white text-center">
<div class="container"> <div class="container">
@ -79,10 +68,9 @@
--> -->
<h1 class="text-uppercase mb-0">CTB Recorder</h1> <h1 class="text-uppercase mb-0">CTB Recorder</h1>
<hr class="star-light"> <hr class="star-light">
<h2 class="font-weight-light mb-0">A free recording software for different camsites.<br/>Currently supported: BongaCams, Cam4, CamSoda, Chaturbate, Dreamcam, FC2Live, Flirt4Free, MyFreeCams, Showup.tv, Streamate, Streamray, Stripchat, WinkTv, XLovecam</h2> <h2 class="font-weight-light mb-0">A free recording software for different camsites. <br />Currently supported: BongaCams, Cam4, CamSoda, Chaturbate, Dreamcam, FC2Live, Flirt4Free, MyFreeCams, Showup.tv, Streamate, Streamray, Stripchat, WinkTv, XLovecam </h2>
</div> </div>
</header> </header>
<!-- About/Download Section --> <!-- About/Download Section -->
<section class="text-secondary mb-0" id="about"> <section class="text-secondary mb-0" id="about">
<div class="container"> <div class="container">
@ -97,106 +85,97 @@
</div> </div>
</div> </div>
<script> <script>
let cnt = 10; let cnt = 10;
function downloadCounter(uri) {
window.setTimeout(function() { function downloadCounter(uri) {
if(cnt === 0) { window.setTimeout(function() {
location.href = uri; if (cnt === 0) {
} else { location.href = uri;
cnt--; } else {
$('#download-counter').html("Your download starts in... " + cnt); cnt--;
downloadCounter(uri); $('#download-counter').html("Your download starts in... " + cnt);
} downloadCounter(uri);
}, 1000); }
} }, 1000);
function downloadFile(uri) { }
cnt = 10;
$('#download-counter').show(); function downloadFile(uri) {
$('#download-counter').html("Your download starts in... " + cnt); cnt = 10;
downloadCounter(uri); $('#download-counter').show();
} $('#download-counter').html("Your download starts in... " + cnt);
</script> downloadCounter(uri);
}
</script>
<div class="row text-center"> <div class="row text-center">
<div class="col"> <div class="col">
<a id="download_windows" class="btn btn-xl btn-outline-dark" href="#donate" onclick="downloadFile('https://github.com/0xboobface/ctbrec/releases/download/1.18.0/ctbrec-1.18.0-win64-jre.zip');"> <a id="download_windows" class="btn btn-xl btn-outline-dark" href="#donate" onclick="downloadFile('https://github.com/0xboobface/ctbrec/releases/download/1.18.0/ctbrec-1.18.0-win64-jre.zip');">
<i class="fa fa-windows mr-2"></i> <i class="fa fa-windows mr-2"></i> Download for Windows! </a>
Download for Windows! </div>
</a> <div class="col">
</div> <a id="download_macos" class="btn btn-xl btn-outline-dark" href="#donate" onclick="downloadFile('https://github.com/0xboobface/ctbrec/releases/download/1.18.0/ctbrec-1.18.0-macos-jre.zip');">
<div class="col"> <i class="fa fa-apple mr-2"></i> Download for macOS! </a>
<a id="download_macos" class="btn btn-xl btn-outline-dark" href="#donate" onclick="downloadFile('https://github.com/0xboobface/ctbrec/releases/download/1.18.0/ctbrec-1.18.0-macos-jre.zip');"> </div>
<i class="fa fa-apple mr-2"></i> <div class="col">
Download for macOS! <a id="download_linux" class="btn btn-xl btn-outline-dark" href="#donate" onclick="downloadFile('https://github.com/0xboobface/ctbrec/releases/download/1.18.0/ctbrec-1.18.0-linux-jre.zip');">
</a> <i class="fa fa-linux mr-2"></i> Download for Linux! </a>
</div> </div>
<div class="col">
<a id="download_linux" class="btn btn-xl btn-outline-dark" href="#donate" onclick="downloadFile('https://github.com/0xboobface/ctbrec/releases/download/1.18.0/ctbrec-1.18.0-linux-jre.zip');">
<i class="fa fa-linux mr-2"></i>
Download for Linux!
</a>
</div>
</div> </div>
</div> </div>
</section> </section>
<section class="portfolio bg-primary text-light" id="donate"> <section class="portfolio bg-primary text-light" id="donate">
<div class="container"> <div class="container">
<h2 class="text-center text-uppercase mb-0">Donate</h2> <h2 class="text-center text-uppercase mb-0">Donate</h2>
<hr class="star-light mb-5"> <hr class="star-light mb-5">
<div class="row"> <div class="row">
<div class="col-lg-10 mx-auto text-center"> <div class="col-lg-10 mx-auto text-center">
<p id="download-counter" class="lead text-center" style="display:none"></p> <p id="download-counter" class="lead text-center" style="display:none"></p>
<p class="lead"> <p class="lead"> CTB Recorder is free and open source. I'm a student and wrote this software in my spare time. If you like the software or want to suggest a new feature, please consider buying me a coffee or two. Thanks! </p>
CTB Recorder is free and open source. I'm a student and wrote this software in my spare time. </div>
If you like the software or want to suggest a new feature, please consider buying me a coffee or two. Thanks! </div>
</p> <div class="row text-center">
</div> <div class="col">
</div> <p class="lead">
<div class="row text-center"> <a href="https://www.buymeacoffee.com/0xboobface" target="_blank">
<div class="col"> <img src="img/buymeacoffee-round.png" alt="Buy a coffee" style="height: 160px; margin: 20px" />
<p class="lead"> </a>
<a href="https://www.buymeacoffee.com/0xboobface" target="_blank"> <br />
<img src="img/buymeacoffee-round.png" alt="Buy a coffee" style="height: 160px; margin: 20px"/> <input type="button" value="Buy a coffee" onclick="window.open('https://www.buymeacoffee.com/0xboobface','_blank')">
</a><br/> </p>
<input type="button" value="Buy a coffee" </div>
onclick="window.open('https://www.buymeacoffee.com/0xboobface','_blank')"> <div class="col">
</p> <p class="lead">
</div> <a href="https://www.paypal.me/0xb00bface" target="_blank">
<div class="col"> <img src="img/paypal-round.png" alt="PayPal" style="height: 160px; margin: 20px" />
<p class="lead"> </a>
<a href="https://www.paypal.me/0xb00bface" target="_blank"> <br />
<img src="img/paypal-round.png" alt="PayPal" style="height: 160px; margin: 20px"/> <input type="button" value="PayPal" onclick="window.open('https://www.paypal.me/0xb00bface','_blank')">
</a><br/> </p>
<input type="button" value="PayPal" </div>
onclick="window.open('https://www.paypal.me/0xb00bface','_blank')"> <div class="col">
</p> <p class="lead">
</div> <a href="https://www.patreon.com/0xb00bface" target="_blank">
<div class="col"> <img src="img/patreon-round.png" alt="Patreon" style="height: 160px; margin: 20px" />
<p class="lead"> </a>
<a href="https://www.patreon.com/0xb00bface" target="_blank"> <br />
<img src="img/patreon-round.png" alt="Patreon" style="height: 160px; margin: 20px"/> <input type="button" value="Patreon" onclick="window.open('https://www.patreon.com/0xb00bface','_blank')">
</a><br/> </p>
<input type="button" value="Patreon" </div>
onclick="window.open('https://www.patreon.com/0xb00bface','_blank')"> </div>
</p> <br />
</div> <br />
</div> <div class="row text-center">
<br/><br/> <div class="col">
<div class="row text-center"> <p class="lead">
<div class="col"> <a href="https://chaturbate.com/in/?track=default&amp;tour=LQps&amp;campaign=55vTi&amp;room=0xb00bface" target="_blank" title="If you buy tokens by using this button, Chaturbate will award me 20% of the tokens' value for sending you over. You get the full tokens and it doesn't cost you any more!">
<p class="lead"> <img src="img/token.png" alt="Buy Chaturbate tokens" />
<a href="https://chaturbate.com/in/?track=default&amp;tour=LQps&amp;campaign=55vTi&amp;room=0xb00bface" target="_blank" title="If you buy tokens by using this button, Chaturbate will award me 20% of the tokens' value for sending you over. You get the full tokens and it doesn't cost you any more!"> </a>
<img src="img/token.png" alt="Buy Chaturbate tokens"/> <br />
</a><br/> <input type="button" value="Buy tokens" onclick="window.open('https://chaturbate.com/in/?track=default&amp;tour=LQps&amp;campaign=55vTi&amp;room=0xb00bface','_blank')" title="If you buy tokens by using this button, Chaturbate will award me 20% of the tokens' value for sending you over. You get the full tokens and it doesn't cost you any more!">
<input type="button" value="Buy tokens" </p>
onclick="window.open('https://chaturbate.com/in/?track=default&amp;tour=LQps&amp;campaign=55vTi&amp;room=0xb00bface','_blank')" </div>
title="If you buy tokens by using this button, Chaturbate will award me 20% of the tokens' value for sending you over. You get the full tokens and it doesn't cost you any more!"> </div>
</p> </div>
</div>
</div>
</div>
</section> </section>
<!-- Screenshots Grid Section --> <!-- Screenshots Grid Section -->
<section class="portfolio" id="portfolio"> <section class="portfolio" id="portfolio">
<div class="container"> <div class="container">
@ -253,7 +232,6 @@
<img class="img-fluid" src="img/settings.png" alt=""> <img class="img-fluid" src="img/settings.png" alt="">
</a> </a>
</div> </div>
<div class="col-md-6 col-lg-4"> <div class="col-md-6 col-lg-4">
<a class="portfolio-item d-block mx-auto" href="#portfolio-modal-6"> <a class="portfolio-item d-block mx-auto" href="#portfolio-modal-6">
<div class="portfolio-item-caption d-flex position-absolute h-100 w-100"> <div class="portfolio-item-caption d-flex position-absolute h-100 w-100">
@ -264,213 +242,128 @@
<img class="img-fluid" src="img/server.png" alt=""> <img class="img-fluid" src="img/server.png" alt="">
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
<!-- FAQ Section -->
<!-- FAQ Section --> <section id="faq" class="bg-primary text-light">
<section id="faq" class="bg-primary text-light"> <div class="container">
<div class="container"> <h2 class="text-center text-uppercase mb-0">FAQ</h2>
<h2 class="text-center text-uppercase mb-0">FAQ</h2> <hr class="star-light mb-5">
<hr class="star-light mb-5"> <div class="row">
<div class="row"> <div class="col-lg-12">
<div class="col-lg-12"> <div class="accordion text-dark" id="accordionExample">
<div class="accordion text-dark" id="accordionExample"> <!-- What are .ts files -->
<!-- What are .ts files --> <div class="card">
<div class="card"> <div class="card-header" id="headingTwo">
<div class="card-header" id="headingTwo"> <h5 class="mb-0">
<h5 class="mb-0"> <button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"> What is a .ts file? </button>
<button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"> </h5>
What is a .ts file? </div>
</button> <div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordionExample">
</h5> <div class="card-body"> A .ts file is a MPEG transport stream, which contains the video and audio of the stream. If you want to convert a .ts file into mp4 or mkv you can use a program like <a href="https://handbrake.fr/">Handbrake</a> or <a href="http://avidemux.sourceforge.net/">Avidemux</a>. </div>
</div> </div>
<div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordionExample"> </div>
<div class="card-body"> <!-- How do I run the server -->
A .ts file is a MPEG transport stream, which contains the video and <div class="card">
audio of the stream. If you want to convert a .ts file into mp4 <div class="card-header" id="headingThree">
or mkv you can use a program like <a <h5 class="mb-0">
href="https://handbrake.fr/">Handbrake</a> or <a href="http://avidemux.sourceforge.net/">Avidemux</a>. <button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree"> How do I run the server? </button>
</div> </h5>
</div> </div>
</div> <div id="collapseThree" class="collapse" aria-labelledby="headingThree" data-parent="#accordionExample">
<div class="card-body"> The archive you downloaded contains a server.bat or server.sh, which can be used to start the server. On the first start, the server uses a default configuration. Once you terminate the server by pressing <kbd>
<!-- How do I run the server --> <kbd>ctrl</kbd> + <kbd>c</kbd>
<div class="card"> </kbd>, the config is stored in your user home. <br /> On Windows that is <code>C:\Users\{your user name}\AppData\Roaming\ctbrec\server.json</code>
<div class="card-header" id="headingThree"> <br /> On Linux it is <code>~/.config/ctbrec/server.json</code>
<h5 class="mb-0"> <br /> On macOS it is <code>/Users/{your user name}/Library/Preferences/ctbrec</code>
<button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree"> <br /> You can open this file in a text editor and change it to your likings. You probably only want to change <code>httpPort</code> and <code>recordingsDir</code>. Most of the other stuff is irrelevant since the server and CTB Recorder use the same config file format. When the server is running, you can connect to it with CTB Recorder by changing the setting "Record location" to "Remote".
How do I run the server? </div>
</button> </div>
</h5> </div>
</div> <!-- Difference Win JRE -->
<div id="collapseThree" class="collapse" aria-labelledby="headingThree" data-parent="#accordionExample"> <div class="card">
<div class="card-body"> <div class="card-header" id="headingFour">
The archive you downloaded contains a server.bat or server.sh, which can be used to start the server. On the first start, the server uses a default <h5 class="mb-0">
configuration. Once you terminate the server by pressing <kbd><kbd>ctrl</kbd> + <kbd>c</kbd></kbd>, the config is stored in your user home.<br/> <button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseFour" aria-expanded="false" aria-controls="collapseFour"> What is the difference between the Windows download and Windows (no JRE)? </button>
On Windows that is <code>C:\Users\{your user name}\AppData\Roaming\ctbrec\server.json</code><br/> </h5>
On Linux it is <code>~/.config/ctbrec/server.json</code><br/> </div>
On macOS it is <code>/Users/{your user name}/Library/Preferences/ctbrec</code><br/> <div id="collapseFour" class="collapse" aria-labelledby="headingFour" data-parent="#accordionExample">
You can open this file in a text editor and change it to your likings. You probably only want to change <code>httpPort</code> and <code>recordingsDir</code>. <div class="card-body"> If you know what Java is and if you know, that you have Java installed, you can use the (no JRE) version. Otherwise you are better off using the standard Windows download, because it comes with all necessary dependencies. </div>
Most of the other stuff is irrelevant since the server and CTB Recorder use the same config file format. </div>
When the server is running, you can connect to it with CTB Recorder by changing the setting "Record location" to "Remote". </div>
</div> <!-- Help -->
</div> <div class="card">
</div> <div class="card-header" id="headingFive">
<h5 class="mb-0">
<!-- Difference Win JRE --> <button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseFive" aria-expanded="false" aria-controls="collapseFive"> I need help! </button>
<div class="card"> </h5>
<div class="card-header" id="headingFour"> </div>
<h5 class="mb-0"> <div id="collapseFive" class="collapse" aria-labelledby="headingFive" data-parent="#accordionExample">
<button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseFour" aria-expanded="false" aria-controls="collapseFour"> <div class="card-body"> Go to the project website and <a href="https://github.com/0xboobface/ctbrec/issues">create a new Issue</a>. </div>
What is the difference between the Windows download and Windows (no JRE)? </div>
</button> </div>
</h5> <!-- Feature request -->
</div> <div class="card">
<div id="collapseFour" class="collapse" aria-labelledby="headingFour" data-parent="#accordionExample"> <div class="card-header" id="headingSix">
<div class="card-body"> <h5 class="mb-0">
If you know what Java is and if you know, that you have Java installed, you can use the (no JRE) version. Otherwise you are better off using the <button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseSix" aria-expanded="false" aria-controls="collapseSix"> I have a suggestion for a new feature! </button>
standard Windows download, because it comes with all necessary dependencies. </h5>
</div> </div>
</div> <div id="collapseSix" class="collapse" aria-labelledby="headingSix" data-parent="#accordionExample">
</div> <div class="card-body"> Go to the project website and <a href="https://github.com/0xboobface/ctbrec/issues">create a new Issue</a>. </div>
</div>
<!-- Help --> </div>
<div class="card"> <!-- Bug -->
<div class="card-header" id="headingFive"> <div class="card">
<h5 class="mb-0"> <div class="card-header" id="headingSeven">
<button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseFive" aria-expanded="false" aria-controls="collapseFive"> <h5 class="mb-0">
I need help! <button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseSeven" aria-expanded="false" aria-controls="collapseSeven"> I found a bug! Where can I report it? </button>
</button> </h5>
</h5> </div>
</div> <div id="collapseSeven" class="collapse" aria-labelledby="headingSeven" data-parent="#accordionExample">
<div id="collapseFive" class="collapse" aria-labelledby="headingFive" data-parent="#accordionExample"> <div class="card-body"> Go to the project website and <a href="https://github.com/0xboobface/ctbrec/issues">create a new Issue</a>. </div>
<div class="card-body"> </div>
Go to the project website and <a href="https://github.com/0xboobface/ctbrec/issues">create a new Issue</a>. </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- Feature request --> </section>
<div class="card"> <!-- Source Code Section -->
<div class="card-header" id="headingSix">
<h5 class="mb-0">
<button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseSix" aria-expanded="false" aria-controls="collapseSix">
I have a suggestion for a new feature!
</button>
</h5>
</div>
<div id="collapseSix" class="collapse" aria-labelledby="headingSix" data-parent="#accordionExample">
<div class="card-body">
Go to the project website and <a href="https://github.com/0xboobface/ctbrec/issues">create a new Issue</a>.
</div>
</div>
</div>
<!-- Bug -->
<div class="card">
<div class="card-header" id="headingSeven">
<h5 class="mb-0">
<button class="btn btn-link text-dark collapsed" type="button" data-toggle="collapse" data-target="#collapseSeven" aria-expanded="false" aria-controls="collapseSeven">
I found a bug! Where can I report it?
</button>
</h5>
</div>
<div id="collapseSeven" class="collapse" aria-labelledby="headingSeven" data-parent="#accordionExample">
<div class="card-body">
Go to the project website and <a href="https://github.com/0xboobface/ctbrec/issues">create a new Issue</a>.
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Source Code Section -->
<section id="code"> <section id="code">
<div class="container"> <div class="container">
<h2 class="text-center text-uppercase text-secondary mb-0">Source Code</h2> <h2 class="text-center text-uppercase text-secondary mb-0">Source Code</h2>
<hr class="star-dark mb-5"> <hr class="star-dark mb-5">
<div class="row"> <div class="row">
<div class="col-lg-8 mx-auto text-center"> <div class="col-lg-8 mx-auto text-center">
<p class="lead"> <p class="lead"> CTB Recorder is free and open source. The source code is available on <a href="https://github.com/0xboobface/ctbrec">Github</a>. </p>
CTB Recorder is free and open source. The source code is available on <a href="https://github.com/0xboobface/ctbrec">Github</a>.
</p>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
<!-- Footer --> <!-- Footer -->
<footer class="footer text-center"> <footer class="footer text-center">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<!-- <!--
<div class="col-md-4 mb-5 mb-lg-0"> <div class="col-md-4 mb-5 mb-lg-0"><h4 class="text-uppercase mb-4">Location</h4><p class="lead mb-0">2215 John Daniel Drive
<h4 class="text-uppercase mb-4">Location</h4> <br>Clark, MO 65243</p></div><div class="col-md-4 mb-5 mb-lg-0"><h4 class="text-uppercase mb-4">Around the Web</h4><ul class="list-inline mb-0"><li class="list-inline-item"><a class="btn btn-outline-light btn-social text-center rounded-circle" href="#"><i class="fa fa-fw fa-facebook"></i></a></li><li class="list-inline-item"><a class="btn btn-outline-light btn-social text-center rounded-circle" href="#"><i class="fa fa-fw fa-google-plus"></i></a></li><li class="list-inline-item"><a class="btn btn-outline-light btn-social text-center rounded-circle" href="#"><i class="fa fa-fw fa-twitter"></i></a></li><li class="list-inline-item"><a class="btn btn-outline-light btn-social text-center rounded-circle" href="#"><i class="fa fa-fw fa-linkedin"></i></a></li><li class="list-inline-item"><a class="btn btn-outline-light btn-social text-center rounded-circle" href="#"><i class="fa fa-fw fa-dribbble"></i></a></li></ul></div><div class="col-md-4"><h4 class="text-uppercase mb-4">About Freelancer</h4><p class="lead mb-0">Freelance is a free to use, open source Bootstrap theme created by
<p class="lead mb-0">2215 John Daniel Drive <a href="http://startbootstrap.com">Start Bootstrap</a>.</p></div>
<br>Clark, MO 65243</p>
</div>
<div class="col-md-4 mb-5 mb-lg-0">
<h4 class="text-uppercase mb-4">Around the Web</h4>
<ul class="list-inline mb-0">
<li class="list-inline-item">
<a class="btn btn-outline-light btn-social text-center rounded-circle" href="#">
<i class="fa fa-fw fa-facebook"></i>
</a>
</li>
<li class="list-inline-item">
<a class="btn btn-outline-light btn-social text-center rounded-circle" href="#">
<i class="fa fa-fw fa-google-plus"></i>
</a>
</li>
<li class="list-inline-item">
<a class="btn btn-outline-light btn-social text-center rounded-circle" href="#">
<i class="fa fa-fw fa-twitter"></i>
</a>
</li>
<li class="list-inline-item">
<a class="btn btn-outline-light btn-social text-center rounded-circle" href="#">
<i class="fa fa-fw fa-linkedin"></i>
</a>
</li>
<li class="list-inline-item">
<a class="btn btn-outline-light btn-social text-center rounded-circle" href="#">
<i class="fa fa-fw fa-dribbble"></i>
</a>
</li>
</ul>
</div>
<div class="col-md-4">
<h4 class="text-uppercase mb-4">About Freelancer</h4>
<p class="lead mb-0">Freelance is a free to use, open source Bootstrap theme created by
<a href="http://startbootstrap.com">Start Bootstrap</a>.</p>
</div>
--> -->
</div> </div>
</div> </div>
</footer> </footer>
<!-- <!--
<div class="copyright py-4 text-center text-white"> <div class="copyright py-4 text-center text-white"><div class="container"><small>Copyright &copy; Your Website 2018</small></div></div>
<div class="container">
<small>Copyright &copy; Your Website 2018</small>
</div>
</div>
--> -->
<!-- Scroll to Top Button (Only visible on small and extra-small screen sizes) --> <!-- Scroll to Top Button (Only visible on small and extra-small screen sizes) -->
<div class="scroll-to-top d-lg-none position-fixed "> <div class="scroll-to-top d-lg-none position-fixed ">
<a class="js-scroll-trigger d-block text-center text-white rounded" href="#page-top"> <a class="js-scroll-trigger d-block text-center text-white rounded" href="#page-top">
<i class="fa fa-chevron-up"></i> <i class="fa fa-chevron-up"></i>
</a> </a>
</div> </div>
<!-- Portfolio Modals --> <!-- Portfolio Modals -->
<!-- Portfolio Modal 1 --> <!-- Portfolio Modal 1 -->
<div class="portfolio-modal mfp-hide" id="portfolio-modal-1"> <div class="portfolio-modal mfp-hide" id="portfolio-modal-1">
<div class="portfolio-modal-dialog bg-white"> <div class="portfolio-modal-dialog bg-white">
@ -485,14 +378,12 @@
<img class="img-fluid mb-5" src="img/featured.jpg" alt=""> <img class="img-fluid mb-5" src="img/featured.jpg" alt="">
<p class="mb-5">You can browse all the different categories like in the browser. The filter input on top helps, to find models quickly.</p> <p class="mb-5">You can browse all the different categories like in the browser. The filter input on top helps, to find models quickly.</p>
<a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#"> <a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#">
<i class="fa fa-close"></i> <i class="fa fa-close"></i> Close </a>
Close</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Portfolio Modal 2 --> <!-- Portfolio Modal 2 -->
<div class="portfolio-modal mfp-hide" id="portfolio-modal-2"> <div class="portfolio-modal mfp-hide" id="portfolio-modal-2">
<div class="portfolio-modal-dialog bg-white"> <div class="portfolio-modal-dialog bg-white">
@ -507,14 +398,12 @@
<img class="img-fluid mb-5" src="img/recording.png" alt=""> <img class="img-fluid mb-5" src="img/recording.png" alt="">
<p class="mb-5">The Recording overview shows you, which models get recorded. You can also see, which models are currently online.</p> <p class="mb-5">The Recording overview shows you, which models get recorded. You can also see, which models are currently online.</p>
<a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#"> <a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#">
<i class="fa fa-close"></i> <i class="fa fa-close"></i> Close </a>
Close</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Portfolio Modal 3 --> <!-- Portfolio Modal 3 -->
<div class="portfolio-modal mfp-hide" id="portfolio-modal-3"> <div class="portfolio-modal mfp-hide" id="portfolio-modal-3">
<div class="portfolio-modal-dialog bg-white"> <div class="portfolio-modal-dialog bg-white">
@ -529,14 +418,12 @@
<img class="img-fluid mb-5" src="img/followed.jpg" alt=""> <img class="img-fluid mb-5" src="img/followed.jpg" alt="">
<p class="mb-5">Recordings can be started with a simple right-click, as well as models followed or unfollowed.</p> <p class="mb-5">Recordings can be started with a simple right-click, as well as models followed or unfollowed.</p>
<a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#"> <a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#">
<i class="fa fa-close"></i> <i class="fa fa-close"></i> Close </a>
Close</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Portfolio Modal 4 --> <!-- Portfolio Modal 4 -->
<div class="portfolio-modal mfp-hide" id="portfolio-modal-4"> <div class="portfolio-modal mfp-hide" id="portfolio-modal-4">
<div class="portfolio-modal-dialog bg-white"> <div class="portfolio-modal-dialog bg-white">
@ -551,14 +438,12 @@
<img class="img-fluid mb-5" src="img/recordings.png" alt=""> <img class="img-fluid mb-5" src="img/recordings.png" alt="">
<p class="mb-5">Finished recordings can be played and managed from within CTB Recorder</p> <p class="mb-5">Finished recordings can be played and managed from within CTB Recorder</p>
<a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#"> <a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#">
<i class="fa fa-close"></i> <i class="fa fa-close"></i> Close </a>
Close</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Portfolio Modal 5 --> <!-- Portfolio Modal 5 -->
<div class="portfolio-modal mfp-hide" id="portfolio-modal-5"> <div class="portfolio-modal mfp-hide" id="portfolio-modal-5">
<div class="portfolio-modal-dialog bg-white"> <div class="portfolio-modal-dialog bg-white">
@ -571,16 +456,14 @@
<h2 class="text-secondary text-uppercase mb-0">Settings</h2> <h2 class="text-secondary text-uppercase mb-0">Settings</h2>
<hr class="star-dark mb-5"> <hr class="star-dark mb-5">
<img class="img-fluid mb-5" src="img/settings.png" alt=""> <img class="img-fluid mb-5" src="img/settings.png" alt="">
<p class="mb-5">You can define where the recordings are saved and which media player to use. I recommend <a href="https://mpv.io/" target="_blank">mpv</a>.</p> <p class="mb-5">You can define where the recordings are saved and which media player to use. I recommend <a href="https://mpv.io/" target="_blank">mpv</a>. </p>
<a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#"> <a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#">
<i class="fa fa-close"></i> <i class="fa fa-close"></i> Close </a>
Close</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Portfolio Modal 6 --> <!-- Portfolio Modal 6 -->
<div class="portfolio-modal mfp-hide" id="portfolio-modal-6"> <div class="portfolio-modal mfp-hide" id="portfolio-modal-6">
<div class="portfolio-modal-dialog bg-white"> <div class="portfolio-modal-dialog bg-white">
@ -595,44 +478,35 @@
<img class="img-fluid mb-5" src="img/server.png" alt=""> <img class="img-fluid mb-5" src="img/server.png" alt="">
<p class="mb-5">Log output of the server</p> <p class="mb-5">Log output of the server</p>
<a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#"> <a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#">
<i class="fa fa-close"></i> <i class="fa fa-close"></i> Close </a>
Close</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Bootstrap core JavaScript --> <!-- Bootstrap core JavaScript -->
<script src="vendor/jquery/jquery.min.js"></script> <script src="vendor/jquery/jquery.min.js"></script>
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Plugin JavaScript --> <!-- Plugin JavaScript -->
<script src="vendor/jquery-easing/jquery.easing.min.js"></script> <script src="vendor/jquery-easing/jquery.easing.min.js"></script>
<script src="vendor/magnific-popup/jquery.magnific-popup.min.js"></script> <script src="vendor/magnific-popup/jquery.magnific-popup.min.js"></script>
<!-- Contact Form JavaScript --> <!-- Contact Form JavaScript -->
<!-- <!--
<script src="js/jqBootstrapValidation.js"></script> <script src="js/jqBootstrapValidation.js"></script><script src="js/contact_me.js"></script>
<script src="js/contact_me.js"></script>
--> -->
<!-- Custom scripts for this template --> <!-- Custom scripts for this template -->
<script src="js/freelancer.min.js"></script> <script src="js/freelancer.min.js"></script>
<script> <script>
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: 'https://api.github.com/repos/0xboobface/ctbrec/releases' url: 'https://api.github.com/repos/0xboobface/ctbrec/releases'
}).done(function( releases ) { }).done(function(releases) {
let latest = releases[0]; let latest = releases[0];
let version = latest.tag_name; let version = latest.tag_name;
$('#download_windows').on('click', () => downloadFile('https://github.com/0xboobface/ctbrec/releases/download/'+version+'/ctbrec-'+version+'-win64-jre.zip')); $('#download_windows').on('click', () => downloadFile('https://github.com/0xboobface/ctbrec/releases/download/' + version + '/ctbrec-' + version + '-win64-jre.zip'));
$('#download_macos').on('click', () => downloadFile('https://github.com/0xboobface/ctbrec/releases/download/'+version+'/ctbrec-'+version+'-macos-jre.zip')); $('#download_macos').on('click', () => downloadFile('https://github.com/0xboobface/ctbrec/releases/download/' + version + '/ctbrec-' + version + '-macos-jre.zip'));
$('#download_linux').on('click', () => downloadFile('https://github.com/0xboobface/ctbrec/releases/download/'+version+'/ctbrec-'+version+'-linux-jre.zip')); $('#download_linux').on('click', () => downloadFile('https://github.com/0xboobface/ctbrec/releases/download/' + version + '/ctbrec-' + version + '-linux-jre.zip'));
}); });
</script> </script>
</body> </body>
</html>
</html>