[49] Wiki Update

pull/1221/head
meisnate12 2 years ago
parent 0bd379ff5d
commit 5a7877cd37

@ -16,6 +16,8 @@ Plex Meta Manager is an open source Python 3 project that has been designed to e
## Getting Started ## Getting Started
These are the high-level steps you must take to get Plex Meta Manager up and running:
1. Install Plex Meta Manager; this process is described [here](https://metamanager.wiki/en/latest/home/installation.html). 1. Install Plex Meta Manager; this process is described [here](https://metamanager.wiki/en/latest/home/installation.html).
2. Once installed, you have to create a [Configuration File](https://metamanager.wiki/en/latest/config/configuration.html), which contains URLs and credentials and the like which are used to connect to services like Plex and TMDb. 2. Once installed, you have to create a [Configuration File](https://metamanager.wiki/en/latest/config/configuration.html), which contains URLs and credentials and the like which are used to connect to services like Plex and TMDb.
@ -34,6 +36,10 @@ If you find steps 1-3 above daunting, there are some walkthroughs available that
## Development & Nightly Builds ## Development & Nightly Builds
Development and Nightly builds are deemed as "beta" builds which are updated far more frequently than the master branch. Bug fixes, new features and and any other code added to Plex Meta Manager first goes to the nightly branch, followed by the develop branch, before finally being released to the master branch.
The development builds (particularly the nightly branch) is only recommended for those who have a technical knowledge of Plex Meta Manager, and are happy with having to frequently update to receive the latest changes.
### Development ### Development
[![Develop GitHub commits since latest stable release (by SemVer)](https://img.shields.io/github/commits-since/meisnate12/plex-meta-manager/latest/develop?label=Commits%20in%20Develop&style=plastic)](https://github.com/meisnate12/Plex-Meta-Manager/tree/develop) [![Develop GitHub commits since latest stable release (by SemVer)](https://img.shields.io/github/commits-since/meisnate12/plex-meta-manager/latest/develop?label=Commits%20in%20Develop&style=plastic)](https://github.com/meisnate12/Plex-Meta-Manager/tree/develop)

@ -1 +1 @@
1.18.0-develop48 1.18.0-develop49

@ -1,3 +1,248 @@
body {
font-size: 18px;
color: #dfe1f2;
background-color: #252525;
}
div.body {
max-width: 1000px;
}
pre {
background-color: #0d0d0d;
color: #a9abba;
box-shadow: none;
display: block;
border-color: transparent;
}
ul, ol {
font-size: 17x;
}
ol.arabic {
list-style: decimal;
font-size: 17px;
}
ul .simple {
font-size: 17px;
}
.highlight .nt {
color: #a9abba;
font-weight: bold;
}
.highlight .nl {
color: #f57900;
}
.highlight .c1 {
color: #157059;
}
.highlight .l {
color: #0ce3ac;
}
.highlight .s {
color: #0ce3ac;
}
.highlight .no {
color: #a9abba;
}
.highlight .k {
color: #a9abba;
font-weight: bold;
}
.highlight .mi {
color: #a9abba;
font-weight: bold;
}
.highlight .ow {
color: #a9abba;
font-weight: bold;
}
.highlight .s1 {
color: #0ce3ac;
}
.highlight .kn {
color: #a9abba;
font-weight: bold;
}
.highlight .nn {
color: #a9abba;
}
.highlight .nl {
color: #0ce3ac;
font-weight: bold;
}
.highlight .p {
color: #a9abba;
font-weight: bold;
}
.highlight .n {
color: #a9abba;
}
.highlight .nv {
color: #a9abba;
}
.highlight .nb {
color: #a9abba;
}
.highlight .kt {
color: #0ce3ac;
font-weight: bold;
}
.highlight .mf {
color: #a9abba;
}
.highlight .o {
color: #a9abba;
font-weight: bold;
}
.highlight .s2 {
color: #0ce3ac;
}
.tab-set > label {
font-size: 0.75em;
}
.container {
padding-right: 0px;
padding-left: 0px;
}
label {
margin-bottom: 0px;
}
button.copybtn {
position: absolute;
display: flex;
top: .3em;
right: .3em;
width: 1.7em;
height: 1.7em;
opacity: 100;
transition: opacity 0.3s, border .3s, background-color .3s;
user-select: none;
padding: 0;
border: none;
outline: none;
border-radius: 0.4em;
/* The colors that GitHub uses */
border: transparent 1px solid;
background-color: transparent;
color: #57606a;
}
.highlight button.copybtn:hover {
background-color: transparent;
}
.highlight button.copybtn:active {
background-color: transparent;
}
button.copybtn.success {
border-color: transparent;
color: #22863a;
}
button.copybtn svg {
stroke: #a9abba;
width: 1.5em;
height: 1.5em;
padding: 0em;
}
.tab-set {
width: auto !important;
border-style: solid;
border-width: 1px;
border-color: #00bfa5;
box-shadow: 0px 3px #282829
background-color: #293e49;
border-radius: 5px;
background-color: #293e49;
}
.tab-content {
box-shadow: 0 -0.1rem #0ce3ac;
background-color: #252525;
padding-top: 0px;
padding-right: 15px;
padding-left: 15px;
font-size: 15px;
}
details {
border-style: solid;
border-width: 1px;
border-color: #00b8d4;
box-shadow: 0px 3px #282829;
border-radius: 5px;
}
details.details-tabs > div {
margin: 0;
}
details.details-tabs[open] > summary {
margin: 0;
}
details[open] > summary {
margin: 0 0 10px 0;
}
details > :not(summary) {
padding: 0 10px 0 10px;
}
details > ul, details > ol {
margin-left: 20px;
margin-right: 20px;
}
.table {
width: auto;
max-width: 100%;
margin-bottom: 21px;
background: #transparent;
border-collapse: collapse;
font-size: 17px
}
table thead tr {
background-color: #151515;
}
:root {
--tabs--label-text: #FFFFFF;
--tabs--label-text--hover: #0ce3ac;
--tabs--label-text--active: #0ea5e9;
--tabs--label-text--active--hover: #0ea5e9;
--tabs--label-background: transparent;
--tabs--label-background--hover: transparent;
--tabs--label-background--active: transparent;
--tabs--label-background--active--hover: transparent;
--tabs--label-border: transparent;
--tabs--label-border--hover: #d1d5db;
--tabs--label-border--active: #0ea5e9;
--tabs--label-border--active--hover: #0ea5e9;
--tabs--padding-x: 1.25em;
--tabs--margin-x: 0;
--tabs--border: #e6e6e6;
}
.text-left { .text-left {
text-align: left !important; text-align: left !important;
padding-left: 15px !important; padding-left: 15px !important;
@ -12,13 +257,15 @@
margin: 15px 0 5px 10px; margin: 15px 0 5px 10px;
} }
code { code {
color: #0ce3ac; color: #a9abba;
background-color: #030303 !important; background-color: #0d0d0d !important;
} }
td hr, th hr { td hr, th hr {
visibility: hidden; visibility: hidden;
margin: 0; margin: 0;
border: 0; }
table.align-default {
margin-left: inherit;
} }
hr { hr {
border-top: 3px solid #bcbcbc; border-top: 3px solid #bcbcbc;
@ -32,18 +279,40 @@ a code {
color: #0cafe3; color: #0cafe3;
} }
a { a {
color: #0cafe3; color: #09a77e;
} }
h1, h2, h3, .h1, .h2, .h3 { a:hover {
margin-top: 50px; color: #0ce3ac; !important;
}
a code {
color: #09a77e;
}
h1, .h1, {
margin: 0 0 1.25em;
}
h2, .h2, {
margin: 1.6em 0 .64em;
} }
h4, h5, h6, .h4, .h5, .h6 { h3, .h3, {
margin-top: 30px; margin: 1.6em 0 .8em;
} }
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { h4, .h4, {
margin: 1em 0;
}
h5., h6, .h5, .h6 {
margin: 1.25em 0
}
h1, .h1 {
color: #4aedc4;
}
h2, h3, h4, h5, h6, .h2, .h3, .h4, .h5, .h6 {
color: #0ce3ac; color: #0ce3ac;
margin-bottom: 20px;
} }
th { th {
color: #0ce3ac; color: #0ce3ac;
} }
@ -93,17 +362,11 @@ th {
-moz-border-radius: 6px 0 6px 6px; -moz-border-radius: 6px 0 6px 6px;
border-radius: 6px 0 6px 6px; border-radius: 6px 0 6px 6px;
} }
table {
border-collapse: collapse;
}
table thead tr {
background: #111111;
}
table tbody tr:nth-child(even) { table tbody tr:nth-child(even) {
background: #181818; background-color: #181818;
} }
table tbody tr:nth-child(odd) { table tbody tr:nth-child(odd) {
background: #1D1D1D; background-color: #1D1D1D;
} }
table.clearTable { table.clearTable {
margin-top: 5px; margin-top: 5px;
@ -123,10 +386,11 @@ table.dualTable td, table.dualTable th {
} }
details { details {
margin-bottom: 5px; margin-bottom: 5px;
border-color: #7c4dff;
} }
summary { summary {
padding: 6px 12px 6px 22px; padding: 6px 12px 6px 22px;
background: #111111; background: #363352;
position: relative; position: relative;
cursor: pointer; cursor: pointer;
} }
@ -148,9 +412,7 @@ details[open] > summary:before {
details summary::-webkit-details-marker { details summary::-webkit-details-marker {
display:none; display:none;
} }
strong {
color: #0ce3ac;
}
td br { td br {
margin-bottom: 15px; margin-bottom: 15px;
} }
@ -190,6 +452,8 @@ a:hover .logo-hover {
} }
.tab-content { .tab-content {
box-shadow: 0 -0.1rem #0ce3ac; box-shadow: 0 -0.1rem #0ce3ac;
padding-top: 10px;
padding-bottom: 10px;
} }
.tab-set > label { .tab-set > label {
} }

@ -31,7 +31,6 @@ This example outlines what a "standard" config.yml file might look like when in
<details> <details>
<summary>Example config.yml file</summary> <summary>Example config.yml file</summary>
<br />
```yaml ```yaml
libraries: # This is called out once within the config.yml file libraries: # This is called out once within the config.yml file

@ -12,7 +12,6 @@ This example is an advanced version of the library mappings which highlights som
<details> <details>
<summary>Click to Expand</summary> <summary>Click to Expand</summary>
<br />
In this example, the `"TV Shows On Second Plex"` library has a library-level `plex` configuration, which takes priority over the `plex` configuration set at the global level. <br> In this example, the `"TV Shows On Second Plex"` library has a library-level `plex` configuration, which takes priority over the `plex` configuration set at the global level. <br>
@ -97,8 +96,7 @@ The available attributes for each library are as follows:
Each library that the user wants Plex Meta Manager to interact with must be documented with a library attribute. A library attribute is represented by the mapping name (i.e. `Movies` or `TV Shows`), this must have a unique name that correlates with a library of the same name within the Plex Media Server. In the situation that two servers are being connected to which both have libraries of the same name, the `library_name` attribute can be utilized to specify the real Library Name, whilst the library attribute's mapping name can be made into a placeholder. This is showcased below: Each library that the user wants Plex Meta Manager to interact with must be documented with a library attribute. A library attribute is represented by the mapping name (i.e. `Movies` or `TV Shows`), this must have a unique name that correlates with a library of the same name within the Plex Media Server. In the situation that two servers are being connected to which both have libraries of the same name, the `library_name` attribute can be utilized to specify the real Library Name, whilst the library attribute's mapping name can be made into a placeholder. This is showcased below:
<details> <details>
<summary>Click to Expand</summary> <summary>Example</summary>
<br />
```yaml ```yaml
libraries: libraries:
@ -152,7 +150,10 @@ libraries:
- file: config/Overlays.yml - file: config/Overlays.yml
``` ```
#### Remove Overlays #### Special Overlay Path Calls
<details>
<summary>Remove Overlays</summary>
You can remove overlays from a library by adding `remove_overlays: true` to `overlay_path`. This will remove all overlays when run and not generate new ones. You can remove overlays from a library by adding `remove_overlays: true` to `overlay_path`. This will remove all overlays when run and not generate new ones.
@ -165,8 +166,10 @@ libraries:
- remove_overlays: true - remove_overlays: true
- file: config/Overlays.yml - file: config/Overlays.yml
``` ```
</details>
#### Reapply Overlays <details>
<summary>Reapply Overlays</summary>
You can reapply overlays from a library by adding `reapply_overlays: true` to `overlay_path`. This will reapply overlays to every item in your library. You can reapply overlays from a library by adding `reapply_overlays: true` to `overlay_path`. This will reapply overlays to every item in your library.
@ -179,8 +182,10 @@ libraries:
- reapply_overlays: true - reapply_overlays: true
- file: config/Overlays.yml - file: config/Overlays.yml
``` ```
</details>
#### Reset Overlays <details>
<summary>Reset Overlays</summary>
You can reset overlays from a library by adding `reset_overlays` to `overlay_path` and setting it to either `tmdb` or `plex` depending on where you want to source the images from. This will use the reset image when overlaying items in your library. You can reset overlays from a library by adding `reset_overlays` to `overlay_path` and setting it to either `tmdb` or `plex` depending on where you want to source the images from. This will use the reset image when overlaying items in your library.
@ -193,8 +198,10 @@ libraries:
- reset_overlays: plex - reset_overlays: plex
- file: config/Overlays.yml - file: config/Overlays.yml
``` ```
</details>
#### Schedule Overlays <details>
<summary>Schedule Overlays</summary>
You can schedule all overlays from a library by adding `schedule` to `overlay_path` and setting it to [Any Schedule Option](../metadata/details/schedule). You can schedule all overlays from a library by adding `schedule` to `overlay_path` and setting it to [Any Schedule Option](../metadata/details/schedule).
@ -209,6 +216,7 @@ libraries:
- schedule: weekly(sunday) - schedule: weekly(sunday)
- file: config/Overlays.yml - file: config/Overlays.yml
``` ```
</details>
### Report Path ### Report Path

@ -89,11 +89,8 @@ playlist_files:
The [`metadata_path`](libraries.md#metadata-path) attribute is defined under the [`libraries`](libraries) attribute in your [Configuration File](configuration). The [`metadata_path`](libraries.md#metadata-path) attribute is defined under the [`libraries`](libraries) attribute in your [Configuration File](configuration).
### Example
<details> <details>
<summary>Click to Expand</summary> <summary>Example</summary>
<br />
In this example, multiple metadata file path types are defined for the `"TV Shows"` library: In this example, multiple metadata file path types are defined for the `"TV Shows"` library:
@ -122,11 +119,8 @@ Within the above example, PMM will:
The [`overlay_path`](libraries.md#overlay-path) attribute is defined under the [`libraries`](libraries) attribute in your [Configuration File](configuration). The [`overlay_path`](libraries.md#overlay-path) attribute is defined under the [`libraries`](libraries) attribute in your [Configuration File](configuration).
### Example
<details> <details>
<summary>Click to Expand</summary> <summary>Example</summary>
<br />
In this example, multiple overlay file path types are defined for the `"TV Shows"` library: In this example, multiple overlay file path types are defined for the `"TV Shows"` library:
@ -155,11 +149,8 @@ Within the above example, PMM will:
The [`playlist_files`](playlists) at the top level in your [Configuration File](configuration). The [`playlist_files`](playlists) at the top level in your [Configuration File](configuration).
### Example
<details> <details>
<summary>Click to Expand</summary> <summary>Example</summary>
<br />
In this example, multiple `playlist_files` attribute path types are defined: In this example, multiple `playlist_files` attribute path types are defined:
@ -186,11 +177,8 @@ Within the above example, PMM will:
The [`external_templates`](../metadata/templates.md#external-templates) attribute is defined at the top level in your [Metadata File](../metadata/metadata). The [`external_templates`](../metadata/templates.md#external-templates) attribute is defined at the top level in your [Metadata File](../metadata/metadata).
### Example
<details> <details>
<summary>Click to Expand</summary> <summary>Example</summary>
<br />
In this example, multiple external template file path types are defined: In this example, multiple external template file path types are defined:

@ -18,7 +18,6 @@ This example is an advanced version of the playlist mappings with accompanying l
<details> <details>
<summary>Click to Expand</summary> <summary>Click to Expand</summary>
<br />
```yaml ```yaml
libraries: libraries:

@ -48,7 +48,7 @@ Specify the location of the configuration YAML file.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -72,22 +72,16 @@ Specify the location of the configuration YAML file.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --config <path_to_config> python plex_meta_manager.py --config <path_to_config>
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config <path_to_config> docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --config <path_to_config>
``` ```
````
</details>
### Time to Run ### Time to Run
@ -95,7 +89,7 @@ Specify the time of day that Plex Meta Manager will run.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -119,22 +113,16 @@ Specify the time of day that Plex Meta Manager will run.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --time 22:00,03:00 python plex_meta_manager.py --time 22:00,03:00
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --time 22:00,03:00 docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --time 22:00,03:00
``` ```
````
</details>
### Run ### Run
@ -142,7 +130,7 @@ Perform a run immediately, bypassing the time to run flag.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -158,22 +146,17 @@ Perform a run immediately, bypassing the time to run flag.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary>
```shell ```
python plex_meta_manager.py --run python plex_meta_manager.py --run
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run
``` ```
````
</details>
### Run Tests ### Run Tests
@ -181,7 +164,7 @@ Perform a debug test run immediately, bypassing the time to run flag. This will
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -199,22 +182,16 @@ Perform a debug test run immediately, bypassing the time to run flag. This will
* Only collections with `test: true` enabled will be run * Only collections with `test: true` enabled will be run
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --run-tests python plex_meta_manager.py --run-tests
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run-tests docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run-tests
``` ```
````
</details>
### Debug ### Debug
@ -222,7 +199,7 @@ Run with Debug Logs Reporting to the Command Window.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -238,22 +215,16 @@ Run with Debug Logs Reporting to the Command Window.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --debug python plex_meta_manager.py --debug
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --debug docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --debug
``` ```
````
</details>
### Trace ### Trace
@ -261,7 +232,7 @@ Run with extra Trace Debug Logs.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -277,22 +248,16 @@ Run with extra Trace Debug Logs.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --trace python plex_meta_manager.py --trace
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --trace0 docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --trace0
``` ```
````
</details>
### Timeout ### Timeout
@ -300,7 +265,7 @@ Change the main Plex Meta Manager timeout. This timeout is overwritten byt those
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -316,22 +281,16 @@ Change the main Plex Meta Manager timeout. This timeout is overwritten byt those
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --timeout 360 python plex_meta_manager.py --timeout 360
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --timeout 360 docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --timeout 360
``` ```
````
</details>
### Collections Only ### Collections Only
@ -339,7 +298,7 @@ Only run collection metadata/YAML files, skip library operations, overlays, and
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -356,22 +315,16 @@ Only run collection metadata/YAML files, skip library operations, overlays, and
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --collections-only python plex_meta_manager.py --collections-only
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --collections-only docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --collections-only
``` ```
````
</details>
### Playlists Only ### Playlists Only
@ -379,7 +332,7 @@ Only run playlist metadata/YAML files, skip library operations, overlays, and co
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -395,22 +348,16 @@ Only run playlist metadata/YAML files, skip library operations, overlays, and co
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --playlists-only python plex_meta_manager.py --playlists-only
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --playlists-only docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --playlists-only
``` ```
````
</details>
### Operations ### Operations
@ -418,7 +365,7 @@ Only run library operations skipping collections/metadata, playlists, and overla
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -434,22 +381,16 @@ Only run library operations skipping collections/metadata, playlists, and overla
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --operations python plex_meta_manager.py --operations
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --operations docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --operations
``` ```
````
</details>
### Overlays ### Overlays
@ -457,7 +398,7 @@ Only run library overlays skipping collections/metadata, playlists, and operatio
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -473,22 +414,16 @@ Only run library overlays skipping collections/metadata, playlists, and operatio
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --overlays python plex_meta_manager.py --overlays
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --overlays docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --overlays
``` ```
````
</details>
### Run Collections ### Run Collections
@ -496,7 +431,7 @@ Perform a collections run immediately to run only the pre-defined collections, b
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -516,22 +451,16 @@ Perform a collections run immediately to run only the pre-defined collections, b
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --run-collections "Harry Potter, Star Wars" python plex_meta_manager.py --run-collections "Harry Potter, Star Wars"
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run-collections "Harry Potter, Star Wars" docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run-collections "Harry Potter, Star Wars"
``` ```
````
</details>
### Run Libraries ### Run Libraries
@ -539,7 +468,7 @@ Perform a libraries run immediately to run only the pre-defined libraries, bypas
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -559,22 +488,16 @@ Perform a libraries run immediately to run only the pre-defined libraries, bypas
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --run-libraries "TV Shows" python plex_meta_manager.py --run-libraries "TV Shows"
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run-libraries "TV Shows" docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run-libraries "TV Shows"
``` ```
````
</details>
### Run Metadata Files ### Run Metadata Files
@ -582,7 +505,7 @@ Perform a metadata files run immediately to run only the pre-defined metadata fi
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -603,22 +526,16 @@ Perform a metadata files run immediately to run only the pre-defined metadata fi
</table> </table>
* This works for all different metadata paths i.e. `git`, `url`, `file`, or `repo`. * This works for all different metadata paths i.e. `git`, `url`, `file`, or `repo`.
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --run-metadata-files "Movies" python plex_meta_manager.py --run-metadata-files "Movies"
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run-metadata-files "Movies" docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --run-metadata-files "Movies"
``` ```
````
</details>
### Libraries First ### Libraries First
@ -626,7 +543,7 @@ Run library operations prior to running collections.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -642,22 +559,16 @@ Run library operations prior to running collections.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --libraries-first python plex_meta_manager.py --libraries-first
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --libraries-first docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --libraries-first
``` ```
````
</details>
### Ignore Schedules ### Ignore Schedules
@ -665,7 +576,7 @@ Ignore all schedules for the run.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -682,22 +593,16 @@ Ignore all schedules for the run.
</table> </table>
* Range Scheduled collections (such as Christmas movies) will still be ignored. * Range Scheduled collections (such as Christmas movies) will still be ignored.
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --ignore-schedules python plex_meta_manager.py --ignore-schedules
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --ignore-schedules docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --ignore-schedules
``` ```
````
</details>
### Ignore Ghost ### Ignore Ghost
@ -705,7 +610,7 @@ Ignore all ghost logging for the run. A ghost log is what's printed to the conso
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -721,22 +626,16 @@ Ignore all ghost logging for the run. A ghost log is what's printed to the conso
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --ignore-ghost python plex_meta_manager.py --ignore-ghost
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --ignore-ghost docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --ignore-ghost
``` ```
````
</details>
### Cache Libraries ### Cache Libraries
@ -744,7 +643,7 @@ Cache the library Load for 1 day.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -760,22 +659,16 @@ Cache the library Load for 1 day.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --cache-libraries python plex_meta_manager.py --cache-libraries
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --cache-libraries docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --cache-libraries
``` ```
````
</details>
### Delete Collections ### Delete Collections
@ -783,7 +676,7 @@ Delete all collections in a Library prior to running collections/operations.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -799,22 +692,16 @@ Delete all collections in a Library prior to running collections/operations.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --delete-collections python plex_meta_manager.py --delete-collections
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --delete-collections docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --delete-collections
``` ```
````
</details>
### Delete Labels ### Delete Labels
@ -822,7 +709,7 @@ Delete all labels on every item in a Library prior to running collections/operat
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -838,22 +725,16 @@ Delete all labels on every item in a Library prior to running collections/operat
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --delete-labels python plex_meta_manager.py --delete-labels
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --delete-labels docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --delete-labels
``` ```
````
</details>
### Resume Run ### Resume Run
@ -861,7 +742,7 @@ Perform a resume run immediately resuming from the first instance of the specifi
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -881,22 +762,16 @@ Perform a resume run immediately resuming from the first instance of the specifi
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --resume "Star Wars" python plex_meta_manager.py --resume "Star Wars"
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --resume "Star Wars" docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --resume "Star Wars"
``` ```
````
</details>
### No Countdown ### No Countdown
@ -904,7 +779,7 @@ Run without displaying a countdown to the next scheduled run.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -920,22 +795,16 @@ Run without displaying a countdown to the next scheduled run.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --no-countdown python plex_meta_manager.py --no-countdown
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --no-countdown docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --no-countdown
``` ```
````
</details>
### No Missing ### No Missing
@ -943,7 +812,7 @@ Run without utilizing the missing movie/show functions.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -959,22 +828,16 @@ Run without utilizing the missing movie/show functions.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --no-missing python plex_meta_manager.py --no-missing
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --no-missing docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --no-missing
``` ```
````
</details>
### No Report ### No Report
@ -982,7 +845,7 @@ Run without saving the report.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -998,22 +861,16 @@ Run without saving the report.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --no-report python plex_meta_manager.py --no-report
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --no-report docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --no-report
``` ```
````
</details>
### Read Only Config ### Read Only Config
@ -1021,7 +878,7 @@ Run without writing to the configuration file.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -1037,22 +894,16 @@ Run without writing to the configuration file.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --read-only-config python plex_meta_manager.py --read-only-config
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --read-only-config docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --read-only-config
``` ```
````
</details>
### Divider Character & Screen Width ### Divider Character & Screen Width
@ -1062,7 +913,7 @@ Change the terminal output divider character or width.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -1090,7 +941,7 @@ Change the terminal output divider character or width.
<table class="dualTable colwidths-auto align-default table"> <table class="dualTable colwidths-auto align-default table">
<tr> <tr>
<th style="background-color: #222;"></th> <th style="background-color: #1d1d1d;"></th>
<th>Shell</th> <th>Shell</th>
<th>Environment</th> <th>Environment</th>
</tr> </tr>
@ -1114,19 +965,13 @@ Change the terminal output divider character or width.
</tr> </tr>
</table> </table>
<details> ````{tab} Local Environment
<summary>Local Environment</summary> ```
```shell
python plex_meta_manager.py --divider * --width 200 python plex_meta_manager.py --divider * --width 200
``` ```
````
</details> ````{tab} Docker Environment
<details> ```
<summary>Docker Environment</summary>
```shell
docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --divider * --width 200 docker run -it -v "X:\Media\Plex Meta Manager\config:/config:rw" meisnate12/plex-meta-manager --divider * --width 200
``` ```
````
</details>

@ -36,16 +36,17 @@ something like this
Thats a command youre going to type or paste into your terminal (OSX or Linux) or Powershell (Windows). Thats a command youre going to type or paste into your terminal (OSX or Linux) or Powershell (Windows).
IMPORTANT NOTE: **IMPORTANT NOTES:**
This walkthrough is going to be pretty pedantic. Im assuming youre reading it because you have no idea how to get a Docker container going, so Im proceeding from the assumption that you want to be walked through every little detail. Youre going to deliberately cause errors and then fix them as you go through it. This is to help you understand what exactly is going on behind the scenes so that when you see these sorts of problems in the wild you will have some background to understand whats happening. If I only give you the happy path walkthrough, then when you make a typo later on youll have no idea where that typo might be or why its breaking things.
I am assuming you do not have any of these tools already installed. When writing this up I started with a brand new Windows 10 install. 1. This walkthrough is going to be pretty pedantic. Im assuming youre reading it because you have no idea how to get a Docker container going, so Im proceeding from the assumption that you want to be walked through every little detail. Youre going to deliberately cause errors and then fix them as you go through it. This is to help you understand what exactly is going on behind the scenes so that when you see these sorts of problems in the wild you will have some background to understand whats happening. If I only give you the happy path walkthrough, then when you make a typo later on youll have no idea where that typo might be or why its breaking things.
I'm also assuming you are doing this on a computer, not through a NAS interface or the like. You can do all this through something like the Synology NAS UI or Portainer or the like, but those aren't documented here. This uses the docker command line because it works the same on all platforms. 2. I am assuming you do not have any of these tools already installed. When writing this up I started with a brand new Windows 10 install.
You may want to take an hour to get familiar with Docker fundamentals with the [official tutorial](https://www.docker.com/101-tutorial/). 3. I'm also assuming you are doing this on a computer, not through a NAS interface or the like. You can do all this through something like the Synology NAS UI or Portainer or the like, but those aren't documented here. This uses the docker command line because it works the same on all platforms.
DO NOT MAKE ANY CHANGES BELOW if you want this to just work. Don't change the docker image [`linuxserver.io` will not work for this, for example]; don't change the paths, etc. 4. You may want to take an hour to get familiar with Docker fundamentals with the [official tutorial](https://www.docker.com/101-tutorial/).
5. DO NOT MAKE ANY CHANGES BELOW if you want this to just work. Don't change the docker image [`linuxserver.io` will not work for this, for example]; don't change the paths, etc.
### Installing Docker. ### Installing Docker.
@ -56,17 +57,13 @@ The Docker install is discussed here: [Installing Docker](https://docs.docker.co
Once you have Docker installed, test it at the command line with: Once you have Docker installed, test it at the command line with:
[type this into your terminal] [type this into your terminal]
``` ```
docker run --rm hello-world docker run --rm hello-world
``` ```
You should see something that starts with: You should see something that starts with:
``` ```
Hello from Docker! Hello from Docker!
This message shows that your installation appears to be working correctly. This message shows that your installation appears to be working correctly.
... ...
``` ```
@ -143,82 +140,55 @@ pwd
This will display a full path: This will display a full path:
````{tab} Linux ````{tab} Linux
<br/>
``` ```
/home/YOURUSERNAME/plex-meta-manager /home/YOURUSERNAME/plex-meta-manager
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
``` ```
/Users/YOURUSERNAME/plex-meta-manager /Users/YOURUSERNAME/plex-meta-manager
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
``` ```
C:\Users\YOURUSERNAME\plex-meta-manager C:\Users\YOURUSERNAME\plex-meta-manager
``` ```
<br/>
```` ````
Add "config" onto the end of that to get the host path to your config directory, for example: Add "config" onto the end of that to get the host path to your config directory, for example:
````{tab} Linux ````{tab} Linux
<br/>
``` ```
/home/YOURUSERNAME/plex-meta-manager/config /home/YOURUSERNAME/plex-meta-manager/config
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
``` ```
/Users/YOURUSERNAME/plex-meta-manager/config /Users/YOURUSERNAME/plex-meta-manager/config
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
``` ```
C:\Users\YOURUSERNAME\plex-meta-manager\config C:\Users\YOURUSERNAME\plex-meta-manager\config
``` ```
<br/>
```` ````
You'll need to add this to the docker command every time you run it, like this: You'll need to add this to the docker command every time you run it, like this:
````{tab} Linux ````{tab} Linux
<br/>
``` ```
docker run --rm -it -v "/home/YOURUSERNAME/plex-meta-manager/config:/config:rw" meisnate12/plex-meta-manager docker run --rm -it -v "/home/YOURUSERNAME/plex-meta-manager/config:/config:rw" meisnate12/plex-meta-manager
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
``` ```
docker run --rm -it -v "/Users/YOURUSERNAME/plex-meta-manager/config:/config:rw" meisnate12/plex-meta-manager docker run --rm -it -v "/Users/YOURUSERNAME/plex-meta-manager/config:/config:rw" meisnate12/plex-meta-manager
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
``` ```
docker run --rm -it -v "C:\Users\YOURUSERNAME\plex-meta-manager\config:/config:rw" meisnate12/plex-meta-manager docker run --rm -it -v "C:\Users\YOURUSERNAME\plex-meta-manager\config:/config:rw" meisnate12/plex-meta-manager
``` ```
<br/>
```` ````
If you run that command now it will display a similar error to before, but without all the image loading: If you run that command now it will display a similar error to before, but without all the image loading:
@ -232,7 +202,6 @@ Note that I show the example path there.
<details> <details>
<summary>Why did we create that `config' directory?</summary> <summary>Why did we create that `config' directory?</summary>
<br />
This was done so that from here on in the instructions match between this walkthrough and the [Local walkthrough](local) are the same. This was done so that from here on in the instructions match between this walkthrough and the [Local walkthrough](local) are the same.
@ -246,31 +215,22 @@ The default config file contains a reference to a directory that will show an er
We'll create it here so the error doesn't show up later. We'll create it here so the error doesn't show up later.
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
mkdir config/assets mkdir config/assets
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
mkdir config/assets mkdir config/assets
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
mkdir config\assets mkdir config\assets
``` ```
<br/>
```` ````
### Setting up the initial config file ### Setting up the initial config file
@ -283,30 +243,22 @@ mkdir config\assets
First, make a copy of the template: First, make a copy of the template:
````{tab} Linux ````{tab} Linux
<br/>
Get a copy of the template to edit [type this into your terminal]: Get a copy of the template to edit [type this into your terminal]:
``` ```
curl -fLvo config/config.yml https://raw.githubusercontent.com/meisnate12/Plex-Meta-Manager/master/config/config.yml.template curl -fLvo config/config.yml https://raw.githubusercontent.com/meisnate12/Plex-Meta-Manager/master/config/config.yml.template
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
Get a copy of the template to edit [type this into your terminal]: Get a copy of the template to edit [type this into your terminal]:
``` ```
curl -fLvo config/config.yml https://raw.githubusercontent.com/meisnate12/Plex-Meta-Manager/master/config/config.yml.template curl -fLvo config/config.yml https://raw.githubusercontent.com/meisnate12/Plex-Meta-Manager/master/config/config.yml.template
``` ```
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
Go to [this URL](https://raw.githubusercontent.com/meisnate12/Plex-Meta-Manager/master/config/config.yml.template) using a web browser; choose the "Save" command, then save the file at: Go to [this URL](https://raw.githubusercontent.com/meisnate12/Plex-Meta-Manager/master/config/config.yml.template) using a web browser; choose the "Save" command, then save the file at:
``` ```
C:\Users\YOURUSERNAME\plex-meta-manager\config\config.yml C:\Users\YOURUSERNAME\plex-meta-manager\config\config.yml
``` ```
<br/>
```` ````
Now open the copy in an editor: Now open the copy in an editor:

@ -51,21 +51,17 @@ Since most of this is typing commands into a terminal, you'll need to have a ter
````{tab} Linux ````{tab} Linux
<br/>
If your Linux system is remote to your computer, connect to it via SSH. That SSH session is the terminal you will be using, so leave it open. If your Linux system is remote to your computer, connect to it via SSH. That SSH session is the terminal you will be using, so leave it open.
If you are running this on a desktop Linux machine, start up the Terminal application. That window will be the terminal you will type commands into throughout this walkthrough, so leave it open. If you are running this on a desktop Linux machine, start up the Terminal application. That window will be the terminal you will type commands into throughout this walkthrough, so leave it open.
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
Open the Terminal app; this window will be the place you type commands throughout this walkthrough, so leave it open. The Terminal app is in Applications -> Utilities. Open the Terminal app; this window will be the place you type commands throughout this walkthrough, so leave it open. The Terminal app is in Applications -> Utilities.
You can also use iTerm or some other terminal app if you wish. If you don't know what that means, use Terminal. You can also use iTerm or some other terminal app if you wish. If you don't know what that means, use Terminal.
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
Use the Start menu to open PowerShell. This will be the window into which you type commands throughout this walkthrough, so leave it open. Use the Start menu to open PowerShell. This will be the window into which you type commands throughout this walkthrough, so leave it open.
<br/>
```` ````
### Installing Python. ### Installing Python.
@ -82,21 +78,17 @@ python --version
If one of these doesn't return `3.7.0` or higher, you'll need to get Python 3 installed. If one of these doesn't return `3.7.0` or higher, you'll need to get Python 3 installed.
````{tab} Linux ````{tab} Linux
<br/>
Describing a python install for any arbitrary linux is out of scope here, but if you're using Ubuntu, [this](https://techviewleo.com/how-to-install-python-on-ubuntu-linux/) might be useful. Describing a python install for any arbitrary linux is out of scope here, but if you're using Ubuntu, [this](https://techviewleo.com/how-to-install-python-on-ubuntu-linux/) might be useful.
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
Follow the instructions here: [Installing Python 3 on Mac OS X](https://docs.python-guide.org/starting/install3/osx/) Follow the instructions here: [Installing Python 3 on Mac OS X](https://docs.python-guide.org/starting/install3/osx/)
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
Go to http://www.python.org/download and download one less than the latest version of Python for Windows in 32 or 64-bit as appropriate for your system [probably 64-bit]. As this is written, that's 3.10. The latest version of Python is 3.11, and there is one piece of PMM that is not ready for 3.11. It will be some time soon, but that isn't under PMM control, so to be safe, grab one back from the latest. Go to http://www.python.org/download and download one less than the latest version of Python for Windows in 32 or 64-bit as appropriate for your system [probably 64-bit]. As this is written, that's 3.10. The latest version of Python is 3.11, and there is one piece of PMM that is not ready for 3.11. It will be some time soon, but that isn't under PMM control, so to be safe, grab one back from the latest.
Once downloaded, run the installer. Tick “Add to path” checkbox at the bottom and click “Install Now”. Once downloaded, run the installer. Tick “Add to path” checkbox at the bottom and click “Install Now”.
For Windows 10, you will need to enable scripts in PowerShell. Follow the instructions [here](https://windowsloop.com/enable-powershell-scripts-execution-windows-10) to do so. If you skip this step you're going to hit a hard stop in a little bit. For Windows 10, you will need to enable scripts in PowerShell. Follow the instructions [here](https://windowsloop.com/enable-powershell-scripts-execution-windows-10) to do so. If you skip this step you're going to hit a hard stop in a little bit.
<br/>
```` ````
Once you've completed the install, verify that will will work on the command line. Close the terminal or Powershell window and open a new one, then type this into your terminal: Once you've completed the install, verify that will will work on the command line. Close the terminal or Powershell window and open a new one, then type this into your terminal:
@ -123,17 +115,12 @@ git --version
If this doesn't return a version number, you'll need to get git installed. If this doesn't return a version number, you'll need to get git installed.
````{tab} Linux ````{tab} Linux
<br/>
The git install is discussed here: [Download for Linux and Unix](https://git-scm.com/download/linux) The git install is discussed here: [Download for Linux and Unix](https://git-scm.com/download/linux)
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
The git install is discussed here: [Git - Downloading Package](https://git-scm.com/download/mac) The git install is discussed here: [Git - Downloading Package](https://git-scm.com/download/mac)
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
Download the installer from [here](https://git-scm.com/download/windows) Download the installer from [here](https://git-scm.com/download/windows)
Run the install; you can probably just accept the defaults and click through except for the step that asks you to choose an editor; you probably want to choose something other than the default there: Run the install; you can probably just accept the defaults and click through except for the step that asks you to choose an editor; you probably want to choose something other than the default there:
@ -141,7 +128,6 @@ Run the install; you can probably just accept the defaults and click through exc
![Git Install](git-install.png) ![Git Install](git-install.png)
This install comes with its own command line interface. **Do not use this interface in this walkthrough**. Continue to do everything here in Powershell. This install comes with its own command line interface. **Do not use this interface in this walkthrough**. Continue to do everything here in Powershell.
<br/>
```` ````
Once you've completed the install, verify that will will work on the command line. Close the terminal or Powershell window and open a new one, then type this into your terminal: Once you've completed the install, verify that will will work on the command line. Close the terminal or Powershell window and open a new one, then type this into your terminal:
@ -181,53 +167,38 @@ There are parts of the code that are assuming and expecting that you will be in
<details> <details>
<summary>What did that do?</summary> <summary>What did that do?</summary>
<br />
``` ```
cd ~ cd ~
``` ```
This changes to your home directory, which will be something like `/home/yourname` or `/Users/yourname` or `C:\Users\YourName` depending on the platform. This changes to your home directory, which will be something like `/home/yourname` or `/Users/yourname` or `C:\Users\YourName` depending on the platform.
``` ```
git clone https://github.com/meisnate12/Plex-Meta-Manager git clone https://github.com/meisnate12/Plex-Meta-Manager
``` ```
This uses `git` to make a copy of (`clone`) the PMM code from where it is stored on `github`. This uses `git` to make a copy of (`clone`) the PMM code from where it is stored on `github`.
``` ```
cd Plex-Meta-Manager cd Plex-Meta-Manager
``` ```
This moves into the directory that was created by the `clone` command. This moves into the directory that was created by the `clone` command.
</details> </details>
Later on you can move it elsewhere if you want, but for now put it there. This will ensure that everything to follow works just like it says here. Presumably youre reading this because the other docs are unclear to you. Dont make unilateral changes to my assumptions while doing this. Later on you can move it elsewhere if you want, but for now put it there. This will ensure that everything to follow works just like it says here. Presumably youre reading this because the other docs are unclear to you. Dont make unilateral changes to my assumptions while doing this.
<details> <details>
<summary>Why use git instead of downloading the release ZIP?</summary> <summary>Why use git instead of downloading the release ZIP?</summary>
<br />
Retrieving the code with `git` makes updating simpler. When you want to update to the newest version, you can go into this directory and type: Retrieving the code with `git` makes updating simpler. When you want to update to the newest version, you can go into this directory and type:
``` ```
git pull git pull
``` ```
No need to download a new ZIP, uncompress it, etc. No need to download a new ZIP, uncompress it, etc.
Also, if you are asked to [or want to] switch to the latest develop or nightly code, you can do so with: Also, if you are asked to [or want to] switch to the latest develop or nightly code, you can do so with:
``` ```
git checkout develop git checkout develop
``` ```
``` ```
git checkout nightly git checkout nightly
``` ```
</details> </details>
--- ---
@ -237,67 +208,46 @@ Later on you can move it elsewhere if you want, but for now put it there. This
This walkthrough is going to use a "virtual environment", since that provides a simple way to keep the requirements for a given thing self-contained; think of it as a "sandbox" for this script. It also provides a clean way to recover from mistakes, and keeps the host system clean. This walkthrough is going to use a "virtual environment", since that provides a simple way to keep the requirements for a given thing self-contained; think of it as a "sandbox" for this script. It also provides a clean way to recover from mistakes, and keeps the host system clean.
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
python3 -m venv pmm-venv python3 -m venv pmm-venv
``` ```
If you see an error like: If you see an error like:
``` ```
Error: Command '['/home/mroche/Plex-Meta-Manager/pmm-venv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1. Error: Command '['/home/mroche/Plex-Meta-Manager/pmm-venv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.
``` ```
You probably need to make sure the Python 3.9-specific virtualenv support library is installed: You probably need to make sure the Python 3.9-specific virtualenv support library is installed:
[type this into your terminal] [type this into your terminal]
``` ```
sudo apt-get install python3.9-venv sudo apt-get install python3.9-venv
``` ```
Then try the original venv command above again. Then try the original venv command above again.
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
python3 -m venv pmm-venv python3 -m venv pmm-venv
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
python -m venv pmm-venv python -m venv pmm-venv
``` ```
If you see: If you see:
``` ```
Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases. Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases.
``` ```
You apparently didn't check the “Add to path” checkbox above under [installing Python](#installing-python). "Repair" your Python install and check "add python to environment variables". You apparently didn't check the “Add to path” checkbox above under [installing Python](#installing-python). "Repair" your Python install and check "add python to environment variables".
<br/>
```` ````
<details> <details>
<summary>What did that do?</summary> <summary>What did that do?</summary>
<br />
``` ```
python3 -m venv pmm-venv python3 -m venv pmm-venv
``` ```
This tells Python3 to use the `venv` module to create a virtual environment called `pmm-venv`. The only visible effect will be the creation of a `pmm-venv` directory. This tells Python3 to use the `venv` module to create a virtual environment called `pmm-venv`. The only visible effect will be the creation of a `pmm-venv` directory.
</details> </details>
That command will not produce any output if it works; it will display an error if a problem occurs. If everything is fine, you will be looking at something like this: That command will not produce any output if it works; it will display an error if a problem occurs. If everything is fine, you will be looking at something like this:
@ -312,32 +262,23 @@ If you aren't looking at an error, you're ready to move on.
That will create the virtual environment, and then you need to activate it: That will create the virtual environment, and then you need to activate it:
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
source pmm-venv/bin/activate source pmm-venv/bin/activate
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
source pmm-venv/bin/activate source pmm-venv/bin/activate
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
.\pmm-venv\Scripts\activate .\pmm-venv\Scripts\activate
``` ```
If you see something like this: If you see something like this:
```powershell ```powershell
.\pmm-venv\Scripts\activate : File C:\Users\mroche\Plex-Meta-Manager\pmm-venv\Scripts\Activate.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink LinkID=135170. .\pmm-venv\Scripts\activate : File C:\Users\mroche\Plex-Meta-Manager\pmm-venv\Scripts\Activate.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink LinkID=135170.
At line:1 char:1 At line:1 char:1
@ -346,13 +287,11 @@ At line:1 char:1
+ CategoryInfo : SecurityError: (:) [], PSSecurityException + CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess + FullyQualifiedErrorId : UnauthorizedAccess
``` ```
You apparently skipped the "enable scripts in Powershell" step above under [installing Python](#installing-python) for Windows. You apparently skipped the "enable scripts in Powershell" step above under [installing Python](#installing-python) for Windows.
You will need to take care of that before moving on. Follow the instructions [here](https://windowsloop.com/enable-powershell-scripts-execution-windows-10). You will need to take care of that before moving on. Follow the instructions [here](https://windowsloop.com/enable-powershell-scripts-execution-windows-10).
Once you have done that, try the activation step again. Once you have done that, try the activation step again.
<br/>
```` ````
That command will not produce any output if it works; it will display an error if a problem occurs. That command will not produce any output if it works; it will display an error if a problem occurs.
@ -368,10 +307,8 @@ Note that the prompt now shows the name of the virtual environment. You may not
<details> <details>
<summary>What did that do?</summary> <summary>What did that do?</summary>
<br />
This tells Python to make the virtual environment "active", which means to use the copy of python that is available there, install all support libraries there, etc. This keeps the PMM code and its runtime environment totally separate from your host machine's environment. This tells Python to make the virtual environment "active", which means to use the copy of python that is available there, install all support libraries there, etc. This keeps the PMM code and its runtime environment totally separate from your host machine's environment.
</details> </details>
An advantage of doing this in a virtual environment is that in the event something goes wrong with this part of the setup, you can delete that pmm-venv directory and do the setup again. An advantage of doing this in a virtual environment is that in the event something goes wrong with this part of the setup, you can delete that pmm-venv directory and do the setup again.
@ -379,31 +316,22 @@ An advantage of doing this in a virtual environment is that in the event somethi
**IMPORTANT: In the future, when you want to run the script, you will need to do this "activation" step every time. Not the venv creation, just the activation**: **IMPORTANT: In the future, when you want to run the script, you will need to do this "activation" step every time. Not the venv creation, just the activation**:
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
source pmm-venv/bin/activate source pmm-venv/bin/activate
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
source pmm-venv/bin/activate source pmm-venv/bin/activate
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
.\pmm-venv\Scripts\activate .\pmm-venv\Scripts\activate
``` ```
<br/>
```` ````
### Installing requirements ### Installing requirements
@ -437,10 +365,8 @@ Don't worry about the WARNING about `pip version thus-and-such` if it comes up.
<details> <details>
<summary>What did that do?</summary> <summary>What did that do?</summary>
<br />
This told Python to use the `pip` module to install some libraries that PMM needs. This told Python to use the `pip` module to install some libraries that PMM needs.
</details> </details>
Lets make sure its working so far. Lets make sure its working so far.
@ -465,31 +391,22 @@ The default config file contains a reference to a directory that will show an er
We'll create it here so the error doesn't show up later. We'll create it here so the error doesn't show up later.
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
mkdir config/assets mkdir config/assets
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
mkdir config/assets mkdir config/assets
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
mkdir config\assets mkdir config\assets
``` ```
<br/>
```` ````
### Setting up the initial config file ### Setting up the initial config file
@ -502,31 +419,22 @@ mkdir config\assets
First, make a copy of the template. This is going to create a copy of the base template that you can then edit. You only need to do this once. First, make a copy of the template. This is going to create a copy of the base template that you can then edit. You only need to do this once.
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cp config/config.yml.template config/config.yml cp config/config.yml.template config/config.yml
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cp config/config.yml.template config/config.yml cp config/config.yml.template config/config.yml
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
copy .\config\config.yml.template .\config\config.yml copy .\config\config.yml.template .\config\config.yml
``` ```
<br/>
```` ````
Now open the copy in an editor: Now open the copy in an editor:
@ -596,48 +504,37 @@ deactivate
### I want to update to the latest version of PMM ### I want to update to the latest version of PMM
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd ~/Plex-Meta-Manager cd ~/Plex-Meta-Manager
git pull git pull
source pmm-venv/bin/activate source pmm-venv/bin/activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd ~/Plex-Meta-Manager cd ~/Plex-Meta-Manager
git pull git pull
source pmm-venv/bin/activate source pmm-venv/bin/activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd ~\Plex-Meta-Manager cd ~\Plex-Meta-Manager
git pull git pull
.\pmm-venv\Scripts\activate .\pmm-venv\Scripts\activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
<br/>
```` ````
### I want to use the develop branch ### I want to use the develop branch
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd ~/Plex-Meta-Manager cd ~/Plex-Meta-Manager
git checkout develop git checkout develop
@ -645,12 +542,9 @@ git pull
source pmm-venv/bin/activate source pmm-venv/bin/activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd ~/Plex-Meta-Manager cd ~/Plex-Meta-Manager
git checkout develop git checkout develop
@ -658,12 +552,9 @@ git pull
source pmm-venv/bin/activate source pmm-venv/bin/activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd ~/Plex-Meta-Manager cd ~/Plex-Meta-Manager
git checkout develop git checkout develop
@ -671,7 +562,6 @@ git pull
.\pmm-venv\Scripts\activate .\pmm-venv\Scripts\activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
<br/>
```` ````
### I want to use the nightly branch ### I want to use the nightly branch

@ -8,12 +8,8 @@ Instead, it is recommended to set an automated scheduling service so that Plex M
**To control how individual parts of PMM are scheduled see the [Schedule detail](../../metadata/details/schedule)** **To control how individual parts of PMM are scheduled see the [Schedule detail](../../metadata/details/schedule)**
## Docker Run
<details>
<summary>Click to Expand</summary>
<br />
````{tab} Docker
Using docker is the simplest and most robust solution to automating Plex Meta Manager scheduling. Using docker is the simplest and most robust solution to automating Plex Meta Manager scheduling.
When running Plex Meta Manager within docker, the session will resume after a system reboot (assuming Docker is set to start at system startup, which is the default) and Plex Meta Manager will run in the background at all times. When running Plex Meta Manager within docker, the session will resume after a system reboot (assuming Docker is set to start at system startup, which is the default) and Plex Meta Manager will run in the background at all times.
@ -30,16 +26,8 @@ docker run -d \
This will run Plex Meta Manager in the background persistently until it is stopped by the user. While the docker container will be persistently running, Plex Meta Manager will not begin the run until the scheduled time. This will run Plex Meta Manager in the background persistently until it is stopped by the user. While the docker container will be persistently running, Plex Meta Manager will not begin the run until the scheduled time.
Further customizations of the docker run command can be used to specify set times to run Plex Meta Manager, further information on this and other Run Commands can be found [here](../environmental.md#time-to-run) Further customizations of the docker run command can be used to specify set times to run Plex Meta Manager, further information on this and other Run Commands can be found [here](../environmental.md#time-to-run)
</details> ````
````{tab} Windows Task Scheduler
## Windows
<details>
<summary>Click to Expand</summary>
<br />
### Task Scheduler
Windows Task Scheduler is advised for those who followed the Windows instructions in the [Local Walkthrough Guides](local) and/or do not want to run Plex Meta Manager within docker. Windows Task Scheduler is advised for those who followed the Windows instructions in the [Local Walkthrough Guides](local) and/or do not want to run Plex Meta Manager within docker.
Windows Task Scheduler allows the user to run commands and services at scheduled times and intervals. Windows Task Scheduler allows the user to run commands and services at scheduled times and intervals.
@ -60,7 +48,6 @@ This is the recommended approach as it allows the user additional control over h
<details> <details>
<summary>Background Run Scheduled Task</summary> <summary>Background Run Scheduled Task</summary>
<br />
1. Create a `waiter.cmd` file by opening the text editor (i.e. Notepad, TextEdit) and pasting the following code: 1. Create a `waiter.cmd` file by opening the text editor (i.e. Notepad, TextEdit) and pasting the following code:
@ -114,7 +101,6 @@ This method will start Plex Meta Manager at the desired time, immediately begin
<details> <details>
<summary>Single Run Scheduled Task</summary> <summary>Single Run Scheduled Task</summary>
<br />
1. Create a `runner.cmd` file by opening the text editor (i.e. Notepad, TextEdit) and pasting the following code: 1. Create a `runner.cmd` file by opening the text editor (i.e. Notepad, TextEdit) and pasting the following code:
@ -171,20 +157,9 @@ This method will start Plex Meta Manager at the desired time, immediately begin
Plex Meta Manager will now run at the set date/time you selected in Step 6, and will run each subsequent day at the same time. Plex Meta Manager will now run at the set date/time you selected in Step 6, and will run each subsequent day at the same time.
</details><br />
</details> </details>
````
## MacOS ````{tab} MacOS Launchd Service
<details>
<summary>Click to Expand</summary>
<br />
<br />
<details>
<summary>Launchd Service</summary>
<br />
1. Create launchd service: 1. Create launchd service:
A couple examples; you'll want to edit the THINGS IN ALL CAPS to reflect your system. A couple examples; you'll want to edit the THINGS IN ALL CAPS to reflect your system.
@ -278,59 +253,8 @@ Plex Meta Manager will now run at the set date/time you selected in Step 6, and
Note that this command uses the *label*, not the plist filename. The -k options means that the service will first be killed, if running. Note that this command uses the *label*, not the plist filename. The -k options means that the service will first be killed, if running.
The agent should now be active and starting the program according to the schedule you set. The agent should now be active and starting the program according to the schedule you set.
</details><br /> ````
````{tab} Linux Systemctl Service
<details>
<summary>cron Schedule</summary>
<br />
See the cron section below.
</details><br />
</details>
## Linux
<details>
<summary>Click to Expand</summary>
<br />
<br />
<details>
<summary>cron Schedule</summary>
<br />
1. Decide when you want to run Plex Meta Manager
`cron` needs a specific syntax to express schedules. A cron schedule is something like "Every Tuesday at 4" or "5 minutes past every other hour".
You can generate the required line by checking boxes using something like [crontab-generator](https://crontab-generator.org/).
The command you use in crontab will probably be the command you use to run it on the command line.
A command you could use for this:
```
cd /path/to/plex-meta-manager && pmm-venv/bin/python plex_meta_manager.py --config config/config.yml --run
```
NOTE: This is assuming you created the `pmm-venv` virtual environment as described in the [Local Walkthrough](local)
2. Open the system crontab for editing:
```bash
sudo crontab -e
```
3. Paste in the crontab line you got from `crontab-generator`, or type in one of your own.
4. Save and close the file.
</details><br />
<details>
<summary>Systemctl Service</summary>
<br />
1. Create the service file: 1. Create the service file:
@ -381,5 +305,33 @@ See the cron section below.
```shell ```shell
sudo systemctl status plex-meta-manager.service sudo systemctl status plex-meta-manager.service
``` ```
</details><br /> ````
</details> ````{tab} cron
The cron utility is used for running scripts and commands at regular intervals, and at specific times and dates. Its built into most Operating Systems (namely Linux and Mac), and provides a very useful way to schedule tasks on your server. It also works for running Docker commands on a schedule.
1. Decide when you want to run Plex Meta Manager
`cron` needs a specific syntax to express schedules. A cron schedule is something like "Every Tuesday at 4" or "5 minutes past every other hour".
You can generate the required line by checking boxes using something like [crontab-generator](https://crontab-generator.org/).
The command you use in crontab will probably be the command you use to run it on the command line.
A command you could use for this:
```
cd /path/to/plex-meta-manager && pmm-venv/bin/python plex_meta_manager.py --config config/config.yml --run
```
NOTE: This is assuming you created the `pmm-venv` virtual environment as described in the [Local Walkthrough](local)
2. Open the system crontab for editing:
```bash
sudo crontab -e
```
3. Paste in the crontab line you got from `crontab-generator`, or type in one of your own.
4. Save and close the file.
````

@ -11,12 +11,12 @@ To install a container from docker hub, you will need community applications - a
3. Create your [Docker values](../../home/environmental) using `Add another Path, Port, Variable, Label or Device`. Example config: 3. Create your [Docker values](../../home/environmental) using `Add another Path, Port, Variable, Label or Device`. Example config:
| Config Type | Name | Key | Value | Container Path | Host Path | Access Mode | Description | | Config Type | Name | Key | Description | Value | Container Path | Host Path | Access Mode |
|:------------|:--------------------|:--------------|:-------|:---------------|:--------------------------------------|:------------|:----------------------------------------------------| |:------------|:--------------------|:--------------|:----------------------------------------------------|:-------|:---------------|:--------------------------------------|:------------|
| Variable | Time to Run | `PMM_TIME` | `6:00` | N/A | N/A | N/A | Time to update each day. Format: HH:MM | | Variable | Time to Run | `PMM_TIME` | Time to update each day. Format: HH:MM | `6:00` | N/A | N/A | N/A |
| Variable | Divider Character | `PMM_DIVIDER` | `=` | N/A | N/A | N/A | The character that divides the sections | | Variable | Divider Character | `PMM_DIVIDER` | The character that divides the sections | `=` | N/A | N/A | N/A |
| Variable | Screen Width | `PMM_WIDTH` | `100` | N/A | N/A | N/A | An integer between 90 and 300 | | Variable | Screen Width | `PMM_WIDTH` | An integer between 90 and 300 | `100` | N/A | N/A | N/A |
| Path | Config Storage Path | N/A | N/A | `/config` | `/mnt/user/appdata/plex-meta-manager` | Read/Write | Translation from docker container path to host path | | Path | Config Storage Path | N/A | Translation from docker container path to host path | N/A | `/config` | `/mnt/user/appdata/plex-meta-manager` | Read/Write |
* Full list of docker values can be found on the [Run Commands & Environmental Variables Page](../../home/environmental). * Full list of docker values can be found on the [Run Commands & Environmental Variables Page](../../home/environmental).
* If you wish to enable one-time [Run]([Run Commands & Environmental Variables Page](../environmental.md#run)), add `-r` to `Post Arguments` by enabling Advanced View in the top right of unRAID. * If you wish to enable one-time [Run]([Run Commands & Environmental Variables Page](../environmental.md#run)), add `-r` to `Post Arguments` by enabling Advanced View in the top right of unRAID.

@ -7,31 +7,22 @@ For now were going to create a few collections so you can watch the process w
First, open the metadata file [this will create the file if it doesn't already exist]: First, open the metadata file [this will create the file if it doesn't already exist]:
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
nano "config/Movies.yml" nano "config/Movies.yml"
``` ```
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
nano "config/Movies.yml" nano "config/Movies.yml"
``` ```
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
notepad "config\Movies.yml" notepad "config\Movies.yml"
``` ```
<br/>
```` ````
In this file, add the following, exactly as it is shown here: In this file, add the following, exactly as it is shown here:

@ -1,5 +1,4 @@
````{tab} Linux ````{tab} Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
@ -23,10 +22,8 @@ sudo apt install nano
``` ```
You can use any other text editor you wish, provided it saves files as PLAIN TEXT. `vi`, `emacs`, etc. You can use any other text editor you wish, provided it saves files as PLAIN TEXT. `vi`, `emacs`, etc.
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
@ -36,18 +33,14 @@ nano config/config.yml
Im using `nano` here simply because its built into OSX. You can use any other text editor you wish, provided it saves files as PLAIN TEXT. BBedit, TextMate, VSCode, etc. Im using `nano` here simply because its built into OSX. You can use any other text editor you wish, provided it saves files as PLAIN TEXT. BBedit, TextMate, VSCode, etc.
A common mistake is using TextEdit.app, which saves files as RTF by default. A common mistake is using TextEdit.app, which saves files as RTF by default.
<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
notepad .\config\config.yml notepad .\config\config.yml
``` ```
Im using `notepad` here simply because its built into Windows. You can use any other text editor you wish, provided it saves files as PLAIN TEXT. Im using `notepad` here simply because its built into Windows. You can use any other text editor you wish, provided it saves files as PLAIN TEXT.
<br/>
```` ````
From here on in, when this walkthrough says "open the config file", I mean this `nano` or `notepad` command. **Don't copy the template again**. From here on in, when this walkthrough says "open the config file", I mean this `nano` or `notepad` command. **Don't copy the template again**.
x

@ -1,14 +1,9 @@
````{tab} Linux ````{tab} Linux
<br/>
If you're using `nano`, type control-`x`, then `y`, then the enter key. If you're using `nano`, type control-`x`, then `y`, then the enter key.
<br/>
```` ````
````{tab} OS X: ````{tab} OS X
<br/>
If you're using `nano`, type control-`x`, then `y`, then the enter key.<br/> If you're using `nano`, type control-`x`, then `y`, then the enter key.<br/>
```` ````
````{tab} Windows: ````{tab} Windows
<br/>
If you're using `notepad`, type alt-`s` or choose `Save` from the `File` menu. If you're using `notepad`, type alt-`s` or choose `Save` from the `File` menu.
<br/>
```` ````

@ -173,7 +173,7 @@ The string literals do not require to be quoted. It is only important to quote t
Here is an example where the string has to be quoted as `&` and `:` are special characters. Here is an example where the string has to be quoted as `&` and `:` are special characters.
YAML Special Characters: `{`, `}`, `[`, `]`, `,`, `&`, `:`, `*`, `#`, `?`, `|`. `-`, `<`. `>`, `=`, `!`, `%`, `@`, `\` YAML Special Characters: `{`, `}`, `[`, `]`, `,`, `&`, `:`, `*`, `#`, `?`, `|`, `-`, `<`. `>`, `=`, `!`, `%`, `@`, `\`
There are many occurrences of these special characters where quotes are not needed but if the YAML fails to load it could easily be because one of these are unquoted. There are many occurrences of these special characters where quotes are not needed but if the YAML fails to load it could easily be because one of these are unquoted.

@ -6,56 +6,40 @@ This page aims to provide knowledge based on combined user experience, and to an
This sections aims to answer the most commonly asked questions that users have. This sections aims to answer the most commonly asked questions that users have.
### "How do I update to the latest version of Plex Meta Manager?" <details class="details-tabs">
<summary>How do I update to the latest version of Plex Meta Manager?</summary>
````{tab} OS X/Linux ````{tab} OS X/Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd /Users/mroche/Plex-Meta-Manager cd /Users/mroche/Plex-Meta-Manager
git pull git pull
source pmm-venv/bin/activate source pmm-venv/bin/activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
```` ````
````{tab} Windows ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd C:\Users\mroche\Plex-Meta-Manager cd C:\Users\mroche\Plex-Meta-Manager
git pull git pull
.\pmm-venv\Scripts\activate .\pmm-venv\Scripts\activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
```` ````
````{tab} Docker ````{tab} Docker
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
docker pull meisnate12/plex-meta-manager docker pull meisnate12/plex-meta-manager
``` ```
```` ````
</details>
### "How do I switch to the develop branch?" <details class="details-tabs">
<summary>How do I switch to the develop branch?</summary>
````{tab} OS X/Linux ````{tab} OS X/Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd /Users/mroche/Plex-Meta-Manager cd /Users/mroche/Plex-Meta-Manager
git checkout develop git checkout develop
@ -63,14 +47,9 @@ git pull
source pmm-venv/bin/activate source pmm-venv/bin/activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
```` ````
````{tab} Windows ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd C:\Users\mroche\Plex-Meta-Manager cd C:\Users\mroche\Plex-Meta-Manager
git checkout develop git checkout develop
@ -78,17 +57,14 @@ git pull
.\pmm-venv\Scripts\activate .\pmm-venv\Scripts\activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
```` ````
</details>
### "How do I switch to the nightly branch" <details class="details-tabs">
<summary>How do I switch to the nightly branch</summary>
````{tab} OS X/Linux ````{tab} OS X/Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd /Users/mroche/Plex-Meta-Manager cd /Users/mroche/Plex-Meta-Manager
git checkout nightly git checkout nightly
@ -96,14 +72,9 @@ git pull
source pmm-venv/bin/activate source pmm-venv/bin/activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
```` ````
````{tab} Windows ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd C:\Users\mroche\Plex-Meta-Manager cd C:\Users\mroche\Plex-Meta-Manager
git checkout nightly git checkout nightly
@ -111,17 +82,14 @@ git pull
.\pmm-venv\Scripts\activate .\pmm-venv\Scripts\activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
```` ````
</details>
### "How do I switch back to the master branch?" <details class="details-tabs">
<summary>How do I switch back to the master branch?</summary>
````{tab} OS X/Linux ````{tab} OS X/Linux
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd /Users/mroche/Plex-Meta-Manager cd /Users/mroche/Plex-Meta-Manager
git checkout master git checkout master
@ -129,14 +97,9 @@ git pull
source pmm-venv/bin/activate source pmm-venv/bin/activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
```` ````
````{tab} Windows ````{tab} Windows
<br/>
[type this into your terminal] [type this into your terminal]
``` ```
cd C:\Users\mroche\Plex-Meta-Manager cd C:\Users\mroche\Plex-Meta-Manager
git checkout master git checkout master
@ -144,8 +107,8 @@ git pull
.\pmm-venv\Scripts\activate .\pmm-venv\Scripts\activate
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
``` ```
```` ````
</details>
## Knowledgebase ## Knowledgebase
@ -246,11 +209,3 @@ This table details examples of the most commonly-seen `[INFO]` events and what t
| Type | Short Info | Description | Recommendation | | Type | Short Info | Description | Recommendation |
|:---------:|:----------------------------------------------|:--------------------------------------|:------------------------------------------------------------------------------------------------------------------------------| |:---------:|:----------------------------------------------|:--------------------------------------|:------------------------------------------------------------------------------------------------------------------------------|
| `[INFO]` | `Detail: TMDb_person updated poster to [URL]` | Person image was downloaded from TMDb | May require you to update the people poster image to your style or request it in the style of the PMM defaults people posters | | `[INFO]` | `Detail: TMDb_person updated poster to [URL]` | Person image was downloaded from TMDb | May require you to update the people poster image to your style or request it in the style of the PMM defaults people posters |
#### DEBUG
This table details examples of the most commonly-seen `[DEBUG]` events and what they mean for the user.
| Type | Short Info | Description | Recommendation |
|:----------:|:-----------|:------------|:---------------|
| `[DEBUG]` | | | |

@ -16,6 +16,8 @@ Plex Meta Manager is an open source Python 3 project that has been designed to e
## Getting Started ## Getting Started
These are the high-level steps you must take to get Plex Meta Manager up and running:
1. Install Plex Meta Manager; this process is described [here](home/installation). 1. Install Plex Meta Manager; this process is described [here](home/installation).
2. Once installed, you have to create a [Configuration File](config/configuration), which contains URLs and credentials and the like which are used to connect to services like Plex and TMDb. 2. Once installed, you have to create a [Configuration File](config/configuration), which contains URLs and credentials and the like which are used to connect to services like Plex and TMDb.
@ -34,6 +36,10 @@ If you find steps 1-3 above daunting, there are some walkthroughs available that
## Development & Nightly Builds ## Development & Nightly Builds
Development and Nightly builds are deemed as "beta" builds which are updated far more frequently than the master branch. Bug fixes, new features and and any other code added to Plex Meta Manager first goes to the nightly branch, followed by the develop branch, before finally being released to the master branch.
The development builds (particularly the nightly branch) is only recommended for those who have a technical knowledge of Plex Meta Manager, and are happy with having to frequently update to receive the latest changes.
### Development ### Development
[![Develop GitHub commits since latest stable release (by SemVer)](https://img.shields.io/github/commits-since/meisnate12/plex-meta-manager/latest/develop?label=Commits%20in%20Develop&style=plastic)](https://github.com/meisnate12/Plex-Meta-Manager/tree/develop) [![Develop GitHub commits since latest stable release (by SemVer)](https://img.shields.io/github/commits-since/meisnate12/plex-meta-manager/latest/develop?label=Commits%20in%20Develop&style=plastic)](https://github.com/meisnate12/Plex-Meta-Manager/tree/develop)
@ -42,29 +48,21 @@ The [develop](https://github.com/meisnate12/Plex-Meta-Manager/tree/develop) bran
Switching to `develop`: Switching to `develop`:
````{tab} if running in Docker ````{tab} Running in Docker
<br/>
Add ":develop" to the image name in your run command or configuration: Add ":develop" to the image name in your run command or configuration:
``` ```
meisnate12/plex-meta-manager:develop meisnate12/plex-meta-manager:develop
``` ```
<br/>
```` ````
````{tab} if running on the host: ````{tab} Running on the Host
In the directory where you cloned PMM: In the directory where you cloned PMM:
```bash ```bash
git checkout develop git checkout develop
``` ```
To switch back: To switch back:
```bash ```bash
git checkout master git checkout master
``` ```
<br/>
```` ````
If switching to the develop build, it is recommended to also use the [develop branch of the wiki](https://metamanager.wiki/en/develop/), which documents any changes made from the Master build. If switching to the develop build, it is recommended to also use the [develop branch of the wiki](https://metamanager.wiki/en/develop/), which documents any changes made from the Master build.
@ -75,33 +73,25 @@ If switching to the develop build, it is recommended to also use the [develop br
**This branch will have squashed commits which can cause `git pull`/`git fetch` to error you can use `git reset origin/nightly --hard` to fix the branch.** **This branch will have squashed commits which can cause `git pull`/`git fetch` to error you can use `git reset origin/nightly --hard` to fix the branch.**
There is also a [nightly](https://github.com/meisnate12/Plex-Meta-Manager/tree/nightly) build which will have the absolute latest version of the script, but it could easily break, there is no guarantee that it even works, and any new features will not be documented. There is also a [nightly](https://github.com/meisnate12/Plex-Meta-Manager/tree/nightly) build which will have the absolute latest version of the script, but it could easily break, there is no guarantee that it even works, and any new features will not be documented until they have progressed enough to reach the develop branch.
Switching to `nightly`: Switching to `nightly`:
````{tab} if running in Docker ````{tab} Running in Docker
<br/>
Add ":nightly" to the image name in your run command or configuration: Add ":nightly" to the image name in your run command or configuration:
``` ```
meisnate12/plex-meta-manager:nightly meisnate12/plex-meta-manager:nightly
``` ```
<br/>
```` ````
````{tab} if running on the host: ````{tab} Running on the Host
In the directory where you cloned PMM: In the directory where you cloned PMM:
```bash ```bash
git checkout nightly git checkout nightly
``` ```
To switch back: To switch back:
```bash ```bash
git checkout master git checkout master
``` ```
<br/>
```` ````

@ -123,7 +123,7 @@ metadata:
Godzilla3: Godzilla3:
title: Godzilla title: Godzilla
year: 1954 year: 1954
edition: Extended edition_filter: Extended
content_rating: R content_rating: R
``` ```

Loading…
Cancel
Save