From b9106310749a00735aec641abcb360cd8ed4d7ed Mon Sep 17 00:00:00 2001
From: pazport <46929183+pazport@users.noreply.github.com>
Date: Wed, 20 Jul 2022 01:07:02 +0100
Subject: [PATCH] tautulli multi
---
.gitignore | 76 +
API.md | 2739 +++++++
CHANGELOG.md | 1724 +++++
CONTRIBUTING.md | 41 +
ISSUE_TEMPLATE.md | 41 +
LICENSE | 674 ++
PlexPy.py | 28 +
README.md | 31 +
Tautulli.py | 284 +
contrib/clean_pyc.sh | 9 +
contrib/downgrade.sh | 32 +
data/interfaces/default/app_import.html | 84 +
data/interfaces/default/base.html | 470 ++
.../default/configuration_table.html | 143 +
.../default/css/bootstrap-wizard.css | 188 +
.../default/css/bootstrap3/bootstrap.css | 6853 +++++++++++++++++
.../default/css/bootstrap3/bootstrap.css.map | 1 +
.../default/css/bootstrap3/bootstrap.min.css | 5 +
.../default/css/dataTables.bootstrap.css | 371 +
.../default/css/dataTables.colVis.css | 131 +
.../default/css/font-awesome.all.min.css | 5 +
.../default/css/font-awesome.v4-shims.min.css | 5 +
data/interfaces/default/css/jquery-ui.min.css | 7 +
.../default/css/jquery.dataTables.css | 455 ++
.../default/css/jquery.scrollbar.css | 904 +++
data/interfaces/default/css/opensans.min.css | 1 +
.../default/css/pnotify.custom.min.css | 1 +
.../default/css/selectize.bootstrap3.css | 401 +
data/interfaces/default/css/selectize.min.css | 1 +
.../default/css/tautulli-dataTables.css | 419 +
data/interfaces/default/css/tautulli.css | 4275 ++++++++++
.../default/current_activity_header.html | 38 +
.../default/current_activity_instance.html | 484 ++
data/interfaces/default/edit_library.html | 111 +
data/interfaces/default/edit_user.html | 139 +
.../default/fonts/Open-Sans-600/LICENSE.txt | 202 +
.../fonts/Open-Sans-600/Open-Sans-600.eot | Bin 0 -> 18805 bytes
.../fonts/Open-Sans-600/Open-Sans-600.svg | 1637 ++++
.../fonts/Open-Sans-600/Open-Sans-600.ttf | Bin 0 -> 35240 bytes
.../fonts/Open-Sans-600/Open-Sans-600.woff | Bin 0 -> 14344 bytes
.../fonts/Open-Sans-600/Open-Sans-600.woff2 | Bin 0 -> 10328 bytes
.../fonts/Open-Sans-regular/LICENSE.txt | 202 +
.../Open-Sans-regular/Open-Sans-regular.eot | Bin 0 -> 18233 bytes
.../Open-Sans-regular/Open-Sans-regular.svg | 1637 ++++
.../Open-Sans-regular/Open-Sans-regular.ttf | Bin 0 -> 34156 bytes
.../Open-Sans-regular/Open-Sans-regular.woff | Bin 0 -> 14260 bytes
.../Open-Sans-regular/Open-Sans-regular.woff2 | Bin 0 -> 10352 bytes
.../glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes
.../glyphicons-halflings-regular.svg | 288 +
.../glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes
.../glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes
.../glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes
.../fonts/font-awesome/fa-brands-400.eot | Bin 0 -> 115052 bytes
.../fonts/font-awesome/fa-brands-400.svg | 1127 +++
.../fonts/font-awesome/fa-brands-400.ttf | Bin 0 -> 114816 bytes
.../fonts/font-awesome/fa-brands-400.woff | Bin 0 -> 73920 bytes
.../fonts/font-awesome/fa-brands-400.woff2 | Bin 0 -> 63376 bytes
.../fonts/font-awesome/fa-regular-400.eot | Bin 0 -> 40744 bytes
.../fonts/font-awesome/fa-regular-400.svg | 467 ++
.../fonts/font-awesome/fa-regular-400.ttf | Bin 0 -> 40516 bytes
.../fonts/font-awesome/fa-regular-400.woff | Bin 0 -> 18212 bytes
.../fonts/font-awesome/fa-regular-400.woff2 | Bin 0 -> 14952 bytes
.../fonts/font-awesome/fa-solid-900.eot | Bin 0 -> 160768 bytes
.../fonts/font-awesome/fa-solid-900.svg | 2231 ++++++
.../fonts/font-awesome/fa-solid-900.ttf | Bin 0 -> 160548 bytes
.../fonts/font-awesome/fa-solid-900.woff | Bin 0 -> 76632 bytes
.../fonts/font-awesome/fa-solid-900.woff2 | Bin 0 -> 59572 bytes
data/interfaces/default/graphs.html | 780 ++
data/interfaces/default/history.html | 258 +
.../default/history_table_modal.html | 90 +
data/interfaces/default/home_stats.html | 248 +
data/interfaces/default/images/13AD46AC.png | Bin 0 -> 10152 bytes
data/interfaces/default/images/13AD46AD.png | Bin 0 -> 10703 bytes
data/interfaces/default/images/93124B54.png | Bin 0 -> 10527 bytes
data/interfaces/default/images/93124B55.png | Bin 0 -> 11162 bytes
data/interfaces/default/images/art-live.png | Bin 0 -> 34387 bytes
data/interfaces/default/images/art.png | Bin 0 -> 3303 bytes
data/interfaces/default/images/background.png | Bin 0 -> 12626 bytes
.../default/images/become_a_patron_button.png | Bin 0 -> 3086 bytes
data/interfaces/default/images/chevron.png | Bin 0 -> 1606 bytes
data/interfaces/default/images/cover.png | Bin 0 -> 12303 bytes
.../default/images/discord-overlay.png | Bin 0 -> 265937 bytes
.../default/images/en-play-badge.png | Bin 0 -> 20598 bytes
.../images/favicon/android-chrome-192x192.png | Bin 0 -> 5129 bytes
.../images/favicon/android-chrome-256x256.png | Bin 0 -> 6926 bytes
.../favicon/apple-touch-icon-precomposed.png | Bin 0 -> 4410 bytes
.../images/favicon/apple-touch-icon.png | Bin 0 -> 3334 bytes
.../default/images/favicon/browserconfig.xml | 9 +
.../default/images/favicon/favicon-16x16.png | Bin 0 -> 553 bytes
.../default/images/favicon/favicon-32x32.png | Bin 0 -> 971 bytes
.../default/images/favicon/favicon.ico | Bin 0 -> 15086 bytes
.../default/images/favicon/manifest.json | 18 +
.../default/images/favicon/mstile-150x150.png | Bin 0 -> 3294 bytes
.../images/favicon/safari-pinned-tab.svg | 1 +
.../default/images/gold-rect-paypal-34px.png | Bin 0 -> 2751 bytes
.../default/images/gravatar-default-80x80.png | Bin 0 -> 1536 bytes
.../default/images/gravatar-default.png | Bin 0 -> 3274 bytes
.../default/images/libraries/artist.png | Bin 0 -> 4537 bytes
.../default/images/libraries/artist.svg | 5 +
.../default/images/libraries/movie.png | Bin 0 -> 1790 bytes
.../default/images/libraries/movie.svg | 5 +
.../default/images/libraries/photo.png | Bin 0 -> 5436 bytes
.../default/images/libraries/photo.svg | 6 +
.../default/images/libraries/playlist.png | Bin 0 -> 1115 bytes
.../default/images/libraries/playlist.svg | 12 +
.../default/images/libraries/show.png | Bin 0 -> 1177 bytes
.../default/images/libraries/show.svg | 6 +
.../default/images/libraries/video.png | Bin 0 -> 2356 bytes
.../default/images/libraries/video.svg | 5 +
.../interfaces/default/images/logo-circle.png | Bin 0 -> 29051 bytes
.../default/images/logo-tautulli-100.png | Bin 0 -> 6601 bytes
.../default/images/logo-tautulli-45.png | Bin 0 -> 2839 bytes
.../images/logo-tautulli-newsletter.png | Bin 0 -> 30989 bytes
.../default/images/logo-tautulli.png | Bin 0 -> 22439 bytes
.../default/images/logo-tautulli.svg | 73 +
data/interfaces/default/images/logo.png | Bin 0 -> 17097 bytes
data/interfaces/default/images/logo.svg | 32 +
.../default/images/logo_tray-update.ico | Bin 0 -> 114237 bytes
data/interfaces/default/images/logo_tray.ico | Bin 0 -> 109163 bytes
.../images/media_flags/aspect_ratio/1.33.png | Bin 0 -> 926 bytes
.../images/media_flags/aspect_ratio/1.66.png | Bin 0 -> 1374 bytes
.../images/media_flags/aspect_ratio/1.78.png | Bin 0 -> 1281 bytes
.../images/media_flags/aspect_ratio/1.85.png | Bin 0 -> 1311 bytes
.../images/media_flags/aspect_ratio/2.20.png | Bin 0 -> 1464 bytes
.../images/media_flags/aspect_ratio/2.25.png | Bin 0 -> 1475 bytes
.../images/media_flags/aspect_ratio/2.35.png | Bin 0 -> 1587 bytes
.../images/media_flags/audio_channels/1.png | Bin 0 -> 662 bytes
.../images/media_flags/audio_channels/2.png | Bin 0 -> 873 bytes
.../images/media_flags/audio_channels/5.png | Bin 0 -> 671 bytes
.../images/media_flags/audio_channels/6.png | Bin 0 -> 671 bytes
.../images/media_flags/audio_channels/7.png | Bin 0 -> 757 bytes
.../images/media_flags/audio_channels/8.png | Bin 0 -> 527 bytes
.../images/media_flags/audio_codec/aac.png | Bin 0 -> 2398 bytes
.../images/media_flags/audio_codec/aif.png | Bin 0 -> 1584 bytes
.../images/media_flags/audio_codec/aifc.png | Bin 0 -> 1720 bytes
.../images/media_flags/audio_codec/aiff.png | Bin 0 -> 1644 bytes
.../images/media_flags/audio_codec/alac.png | Bin 0 -> 1658 bytes
.../images/media_flags/audio_codec/ape.png | Bin 0 -> 523 bytes
.../images/media_flags/audio_codec/cdda.png | Bin 0 -> 4092 bytes
.../images/media_flags/audio_codec/dca-ma.png | Bin 0 -> 2460 bytes
.../media_flags/audio_codec/dolby_digital.png | Bin 0 -> 2608 bytes
.../media_flags/audio_codec/dolby_truehd.png | Bin 0 -> 2586 bytes
.../images/media_flags/audio_codec/dts.png | Bin 0 -> 2460 bytes
.../images/media_flags/audio_codec/eac3.png | Bin 0 -> 2662 bytes
.../images/media_flags/audio_codec/flac.png | Bin 0 -> 1998 bytes
.../images/media_flags/audio_codec/m4a.png | Bin 0 -> 1721 bytes
.../images/media_flags/audio_codec/mlp.png | Bin 0 -> 2236 bytes
.../images/media_flags/audio_codec/mp2.png | Bin 0 -> 1871 bytes
.../images/media_flags/audio_codec/mp3.png | Bin 0 -> 2582 bytes
.../images/media_flags/audio_codec/mpc.png | Bin 0 -> 2877 bytes
.../images/media_flags/audio_codec/ogg.png | Bin 0 -> 2000 bytes
.../images/media_flags/audio_codec/pcm.png | Bin 0 -> 827 bytes
.../images/media_flags/audio_codec/ra.png | Bin 0 -> 2714 bytes
.../images/media_flags/audio_codec/shn.png | Bin 0 -> 270 bytes
.../images/media_flags/audio_codec/wav.png | Bin 0 -> 1916 bytes
.../images/media_flags/audio_codec/wave.png | Bin 0 -> 1916 bytes
.../images/media_flags/audio_codec/wma.png | Bin 0 -> 3297 bytes
.../images/media_flags/audio_codec/wmahd.png | Bin 0 -> 1507 bytes
.../images/media_flags/audio_codec/wmapro.png | Bin 0 -> 778 bytes
.../images/media_flags/audio_codec/wmav2.png | Bin 0 -> 1301 bytes
.../images/media_flags/audio_codec/wv.png | Bin 0 -> 2305 bytes
.../images/media_flags/content_rating/G.png | Bin 0 -> 1054 bytes
.../media_flags/content_rating/NC-17.png | Bin 0 -> 2000 bytes
.../images/media_flags/content_rating/NR.png | Bin 0 -> 1431 bytes
.../media_flags/content_rating/Not Rated.png | Bin 0 -> 1823 bytes
.../media_flags/content_rating/PG-13.png | Bin 0 -> 2286 bytes
.../images/media_flags/content_rating/PG.png | Bin 0 -> 1541 bytes
.../images/media_flags/content_rating/R.png | Bin 0 -> 928 bytes
.../media_flags/content_rating/TV-14.png | Bin 0 -> 931 bytes
.../media_flags/content_rating/TV-G.png | Bin 0 -> 1017 bytes
.../media_flags/content_rating/TV-MA.png | Bin 0 -> 1368 bytes
.../media_flags/content_rating/TV-PG.png | Bin 0 -> 1270 bytes
.../media_flags/content_rating/TV-Y.png | Bin 0 -> 821 bytes
.../media_flags/content_rating/TV-Y7-FV.png | Bin 0 -> 1446 bytes
.../media_flags/content_rating/TV-Y7.png | Bin 0 -> 1074 bytes
.../media_flags/content_rating/Unrated.png | Bin 0 -> 1720 bytes
.../images/media_flags/content_rating/X.png | Bin 0 -> 990 bytes
.../media_flags/content_rating/au/E.png | Bin 0 -> 539 bytes
.../media_flags/content_rating/au/G.png | Bin 0 -> 1387 bytes
.../media_flags/content_rating/au/M.png | Bin 0 -> 1477 bytes
.../media_flags/content_rating/au/MA15+.png | Bin 0 -> 2274 bytes
.../media_flags/content_rating/au/MA15.png | Bin 0 -> 2274 bytes
.../media_flags/content_rating/au/PG.png | Bin 0 -> 1038 bytes
.../media_flags/content_rating/au/R18+.png | Bin 0 -> 2302 bytes
.../media_flags/content_rating/au/R18.png | Bin 0 -> 2302 bytes
.../media_flags/content_rating/au/X18+.png | Bin 0 -> 1782 bytes
.../media_flags/content_rating/au/X18.png | Bin 0 -> 1782 bytes
.../media_flags/content_rating/ca/14A.png | Bin 0 -> 1740 bytes
.../media_flags/content_rating/ca/18A.png | Bin 0 -> 1951 bytes
.../media_flags/content_rating/ca/E.png | Bin 0 -> 1949 bytes
.../media_flags/content_rating/ca/G.png | Bin 0 -> 1618 bytes
.../media_flags/content_rating/ca/PG.png | Bin 0 -> 1508 bytes
.../media_flags/content_rating/ca/R.png | Bin 0 -> 1452 bytes
.../media_flags/content_rating/de/0.png | Bin 0 -> 1376 bytes
.../media_flags/content_rating/de/12.png | Bin 0 -> 1441 bytes
.../media_flags/content_rating/de/16.png | Bin 0 -> 1490 bytes
.../media_flags/content_rating/de/18.png | Bin 0 -> 1303 bytes
.../media_flags/content_rating/de/6.png | Bin 0 -> 1409 bytes
.../media_flags/content_rating/fr/-10.png | Bin 0 -> 1529 bytes
.../media_flags/content_rating/fr/-12.png | Bin 0 -> 1419 bytes
.../media_flags/content_rating/fr/-16.png | Bin 0 -> 1467 bytes
.../media_flags/content_rating/fr/-18.png | Bin 0 -> 1559 bytes
.../content_rating/fr/Tout Public.png | Bin 0 -> 1140 bytes
.../media_flags/content_rating/fr/U.png | Bin 0 -> 1140 bytes
.../media_flags/content_rating/gb/12.png | Bin 0 -> 1725 bytes
.../media_flags/content_rating/gb/12A.png | Bin 0 -> 1553 bytes
.../media_flags/content_rating/gb/15.png | Bin 0 -> 1706 bytes
.../media_flags/content_rating/gb/18.png | Bin 0 -> 1366 bytes
.../media_flags/content_rating/gb/PG.png | Bin 0 -> 1154 bytes
.../media_flags/content_rating/gb/R18.png | Bin 0 -> 1433 bytes
.../media_flags/content_rating/gb/U.png | Bin 0 -> 842 bytes
.../media_flags/content_rating/nl/12.png | Bin 0 -> 1213 bytes
.../media_flags/content_rating/nl/16.png | Bin 0 -> 1164 bytes
.../media_flags/content_rating/nl/6.png | Bin 0 -> 1104 bytes
.../media_flags/content_rating/nl/9.png | Bin 0 -> 1104 bytes
.../media_flags/content_rating/nl/AL.png | Bin 0 -> 1051 bytes
.../content_rating/nl/Alle Leeftijden.png | Bin 0 -> 1051 bytes
.../media_flags/studio/1492_pictures.png | Bin 0 -> 10981 bytes
.../media_flags/studio/20th_century_fox.png | Bin 0 -> 8726 bytes
.../studio/20th_century_fox_animation.png | Bin 0 -> 10560 bytes
.../images/media_flags/studio/2929.png | Bin 0 -> 7901 bytes
.../media_flags/studio/360_pictures.png | Bin 0 -> 7660 bytes
.../images/media_flags/studio/40_acres.png | Bin 0 -> 13559 bytes
.../images/media_flags/studio/57_irving.png | Bin 0 -> 1211 bytes
.../media_flags/studio/777_film_corp.png | Bin 0 -> 12750 bytes
.../default/images/media_flags/studio/a24.png | Bin 0 -> 3920 bytes
.../media_flags/studio/a_1_pictures.png | Bin 0 -> 14263 bytes
.../images/media_flags/studio/a_and_e.png | Bin 0 -> 2349 bytes
.../images/media_flags/studio/aardman.png | Bin 0 -> 3860 bytes
.../images/media_flags/studio/abandon.png | Bin 0 -> 2877 bytes
.../default/images/media_flags/studio/abc.png | Bin 0 -> 5234 bytes
.../media_flags/studio/abc_australia.png | Bin 0 -> 3476 bytes
.../images/media_flags/studio/abc_family.png | Bin 0 -> 3079 bytes
.../images/media_flags/studio/actf.png | Bin 0 -> 4441 bytes
.../images/media_flags/studio/adult_swim.png | Bin 0 -> 2349 bytes
.../default/images/media_flags/studio/afi.png | Bin 0 -> 4519 bytes
.../images/media_flags/studio/after_dark.png | Bin 0 -> 18963 bytes
.../default/images/media_flags/studio/aic.png | Bin 0 -> 1465 bytes
.../studio/alcon_entertainment.png | Bin 0 -> 15735 bytes
.../studio/alfred_hitchcock_productions.png | Bin 0 -> 7137 bytes
.../images/media_flags/studio/alliance.png | Bin 0 -> 9080 bytes
.../images/media_flags/studio/alloy.png | Bin 0 -> 3736 bytes
.../images/media_flags/studio/alphaville.png | Bin 0 -> 1939 bytes
.../media_flags/studio/amazon_studios.png | Bin 0 -> 3151 bytes
.../images/media_flags/studio/ambience.png | Bin 0 -> 3303 bytes
.../studio/amblin_entertainment.png | Bin 0 -> 6373 bytes
.../default/images/media_flags/studio/amc.png | Bin 0 -> 3133 bytes
.../media_flags/studio/american_masters.png | Bin 0 -> 8019 bytes
.../media_flags/studio/american_zoetrope.png | Bin 0 -> 19693 bytes
.../studio/anchor_bay_entertainment.png | Bin 0 -> 17672 bytes
.../media_flags/studio/animal_planet.png | Bin 0 -> 5064 bytes
.../images/media_flags/studio/animax.png | Bin 0 -> 1216 bytes
.../media_flags/studio/anonymous_content.png | Bin 0 -> 15076 bytes
.../images/media_flags/studio/antena_3.png | Bin 0 -> 4068 bytes
.../media_flags/studio/apatow_productions.png | Bin 0 -> 12401 bytes
.../images/media_flags/studio/apple.png | Bin 0 -> 2817 bytes
.../default/images/media_flags/studio/ard.png | Bin 0 -> 1532 bytes
.../default/images/media_flags/studio/ark.png | Bin 0 -> 2078 bytes
.../images/media_flags/studio/arte.png | Bin 0 -> 1745 bytes
.../studio/artisan_entertainment.png | Bin 0 -> 3755 bytes
.../media_flags/studio/aspen_film_society.png | Bin 0 -> 19372 bytes
.../images/media_flags/studio/atom_films.png | Bin 0 -> 3473 bytes
.../media_flags/studio/audience_network.png | Bin 0 -> 7854 bytes
.../studio/australian_film_commission.png | Bin 0 -> 6556 bytes
.../media_flags/studio/avalanche_studios.png | Bin 0 -> 15854 bytes
.../media_flags/studio/avnet_kerner.png | Bin 0 -> 1803 bytes
.../images/media_flags/studio/babylonian.png | Bin 0 -> 3051 bytes
.../studio/bad_boy_entertainment.png | Bin 0 -> 39118 bytes
.../images/media_flags/studio/bad_robot.png | Bin 0 -> 9037 bytes
.../media_flags/studio/baltimore_pictures.png | Bin 0 -> 17988 bytes
.../images/media_flags/studio/bandai.png | Bin 0 -> 1786 bytes
.../media_flags/studio/bandai_visual.png | Bin 0 -> 2221 bytes
.../images/media_flags/studio/bandapart.png | Bin 0 -> 2589 bytes
.../images/media_flags/studio/batjac.png | Bin 0 -> 2221 bytes
.../images/media_flags/studio/bazmark.png | Bin 0 -> 4840 bytes
.../default/images/media_flags/studio/bbc.png | Bin 0 -> 2174 bytes
.../images/media_flags/studio/bbc_america.png | Bin 0 -> 4751 bytes
.../images/media_flags/studio/bbc_films.png | Bin 0 -> 2625 bytes
.../images/media_flags/studio/bbc_four.png | Bin 0 -> 3764 bytes
.../images/media_flags/studio/bbc_one.png | Bin 0 -> 6703 bytes
.../images/media_flags/studio/bbc_prime.png | Bin 0 -> 2818 bytes
.../images/media_flags/studio/bbc_three.png | Bin 0 -> 3897 bytes
.../images/media_flags/studio/bbc_two.png | Bin 0 -> 3992 bytes
.../images/media_flags/studio/beacon.png | Bin 0 -> 299 bytes
.../studio/becker_entertainment.png | Bin 0 -> 10885 bytes
.../studio/belair_entertainment.png | Bin 0 -> 5218 bytes
.../default/images/media_flags/studio/bet.png | Bin 0 -> 2944 bytes
.../images/media_flags/studio/bigtalk.png | Bin 0 -> 927 bytes
.../media_flags/studio/biography_channel.png | Bin 0 -> 4129 bytes
.../studio/black_bear_pictures.png | Bin 0 -> 13416 bytes
.../images/media_flags/studio/blackdog.png | Bin 0 -> 1332 bytes
.../media_flags/studio/bleecker_street.png | Bin 0 -> 1328 bytes
.../studio/blind_ambition_entertainment.png | Bin 0 -> 6664 bytes
.../studio/blizzard_entertainment.png | Bin 0 -> 8619 bytes
.../images/media_flags/studio/blue_sky.png | Bin 0 -> 5303 bytes
.../media_flags/studio/blue_sky_studios.png | Bin 0 -> 4011 bytes
.../media_flags/studio/blue_underground.png | Bin 0 -> 8770 bytes
.../studio/blumhouse_productions.png | Bin 0 -> 3964 bytes
.../default/images/media_flags/studio/bnn.png | Bin 0 -> 7119 bytes
.../images/media_flags/studio/bold_films.png | Bin 0 -> 2904 bytes
.../images/media_flags/studio/boomerang.png | Bin 0 -> 6574 bytes
.../images/media_flags/studio/bravo.png | Bin 0 -> 2294 bytes
.../images/media_flags/studio/brightlight.png | Bin 0 -> 2329 bytes
.../images/media_flags/studio/bristol_bay.png | Bin 0 -> 5180 bytes
.../media_flags/studio/broken_lizard.png | Bin 0 -> 16880 bytes
.../media_flags/studio/brooklyn_films.png | Bin 0 -> 13414 bytes
.../images/media_flags/studio/buena_vista.png | Bin 0 -> 19950 bytes
.../images/media_flags/studio/bulletproof.png | Bin 0 -> 2880 bytes
.../images/media_flags/studio/c2_pictures.png | Bin 0 -> 15114 bytes
.../images/media_flags/studio/canalplus.png | Bin 0 -> 2329 bytes
.../media_flags/studio/cannon_pictures.png | Bin 0 -> 22993 bytes
.../images/media_flags/studio/capcom.png | Bin 0 -> 2546 bytes
.../media_flags/studio/capitol_films.png | Bin 0 -> 4818 bytes
.../media_flags/studio/caravan_pictures.png | Bin 0 -> 6126 bytes
.../images/media_flags/studio/carnaby.png | Bin 0 -> 17039 bytes
.../images/media_flags/studio/carolco.png | Bin 0 -> 13714 bytes
.../media_flags/studio/cartoonnetwork.png | Bin 0 -> 3301 bytes
.../media_flags/studio/casablanca_filmes.png | Bin 0 -> 3870 bytes
.../media_flags/studio/cascade_film.png | Bin 0 -> 18540 bytes
.../studio/casey_silver_productions.png | Bin 0 -> 7477 bytes
.../studio/castle_rock_entertainment.png | Bin 0 -> 10470 bytes
.../media_flags/studio/cat_in_the_hat.png | Bin 0 -> 37954 bytes
.../images/media_flags/studio/cbbc.png | Bin 0 -> 3162 bytes
.../default/images/media_flags/studio/cbc.png | Bin 0 -> 2444 bytes
.../default/images/media_flags/studio/cbs.png | Bin 0 -> 3649 bytes
.../images/media_flags/studio/celador.png | Bin 0 -> 1579 bytes
.../studio/centropolis_entertainment.png | Bin 0 -> 17054 bytes
.../media_flags/studio/ceska_televize.png | Bin 0 -> 1406 bytes
.../images/media_flags/studio/channel4.png | Bin 0 -> 1958 bytes
.../images/media_flags/studio/channel5.png | Bin 0 -> 3381 bytes
.../media_flags/studio/channel_nine.png | Bin 0 -> 3121 bytes
.../media_flags/studio/channel_seven.png | Bin 0 -> 1233 bytes
.../images/media_flags/studio/channel_ten.png | Bin 0 -> 2683 bytes
.../images/media_flags/studio/cheyenne.png | Bin 0 -> 913 bytes
.../images/media_flags/studio/chiller.png | Bin 0 -> 2720 bytes
.../images/media_flags/studio/cinemax.png | Bin 0 -> 3147 bytes
.../images/media_flags/studio/city.png | Bin 0 -> 6521 bytes
.../default/images/media_flags/studio/cmt.png | Bin 0 -> 18841 bytes
.../default/images/media_flags/studio/cnc.png | Bin 0 -> 1315 bytes
.../media_flags/studio/columbia_pictures.png | Bin 0 -> 11378 bytes
.../media_flags/studio/comedy_central.png | Bin 0 -> 3125 bytes
.../images/media_flags/studio/concorde.png | Bin 0 -> 523 bytes
.../images/media_flags/studio/condemned.png | Bin 0 -> 3093 bytes
.../media_flags/studio/constantin_film.png | Bin 0 -> 3265 bytes
.../media_flags/studio/constellation.png | Bin 0 -> 5928 bytes
.../images/media_flags/studio/cookie_jar.png | Bin 0 -> 14037 bytes
.../images/media_flags/studio/cpfilms.png | Bin 0 -> 2274 bytes
.../images/media_flags/studio/crackle.png | Bin 0 -> 3132 bytes
.../images/media_flags/studio/criterion.png | Bin 0 -> 1189 bytes
.../default/images/media_flags/studio/ctv.png | Bin 0 -> 2915 bytes
.../default/images/media_flags/studio/cw.png | Bin 0 -> 1088 bytes
.../images/media_flags/studio/cw_seed.png | Bin 0 -> 6375 bytes
.../images/media_flags/studio/czolowka.png | Bin 0 -> 2487 bytes
.../images/media_flags/studio/damselfly.png | Bin 0 -> 5150 bytes
.../images/media_flags/studio/danjaq.png | Bin 0 -> 261 bytes
.../studio/dark_castle_entertainment.png | Bin 0 -> 51102 bytes
.../images/media_flags/studio/dark_horse.png | Bin 0 -> 21364 bytes
.../images/media_flags/studio/dave.png | Bin 0 -> 3221 bytes
.../studio/davis_entertainment.png | Bin 0 -> 11443 bytes
.../default/images/media_flags/studio/dc.png | Bin 0 -> 5611 bytes
.../media_flags/studio/de_laurentiis.png | Bin 0 -> 9746 bytes
.../images/media_flags/studio/defa.png | Bin 0 -> 879 bytes
.../media_flags/studio/destination_films.png | Bin 0 -> 4192 bytes
.../default/images/media_flags/studio/dfi.png | Bin 0 -> 1406 bytes
.../studio/dickhouse_productions.png | Bin 0 -> 11219 bytes
.../media_flags/studio/digital_factory.png | Bin 0 -> 10252 bytes
.../media_flags/studio/digital_playground.png | Bin 0 -> 3901 bytes
.../media_flags/studio/dimension_films.png | Bin 0 -> 4210 bytes
.../media_flags/studio/discovery_channel.png | Bin 0 -> 4105 bytes
.../media_flags/studio/disney_channel.png | Bin 0 -> 5664 bytes
.../images/media_flags/studio/disney_xd.png | Bin 0 -> 2372 bytes
.../media_flags/studio/distant_horizon.png | Bin 0 -> 4566 bytes
.../images/media_flags/studio/dmax.png | Bin 0 -> 1635 bytes
.../default/images/media_flags/studio/dna.png | Bin 0 -> 2654 bytes
.../media_flags/studio/dolores_pictures.png | Bin 0 -> 13009 bytes
.../don_simpson_jerry_bruckheimer_films.png | Bin 0 -> 38510 bytes
.../images/media_flags/studio/donners.png | Bin 0 -> 10563 bytes
.../images/media_flags/studio/dreamworks.png | Bin 0 -> 4254 bytes
.../studio/dreamworks_animation.png | Bin 0 -> 3859 bytes
.../default/images/media_flags/studio/e4.png | Bin 0 -> 2804 bytes
.../images/media_flags/studio/ealing.png | Bin 0 -> 5742 bytes
.../images/media_flags/studio/eclectic.png | Bin 0 -> 2326 bytes
.../studio/edmonds_entertainment.png | Bin 0 -> 7931 bytes
.../media_flags/studio/el_rey_network.png | Bin 0 -> 4978 bytes
.../studio/electric_enterteinment.png | Bin 0 -> 17955 bytes
.../media_flags/studio/electric_pictures.png | Bin 0 -> 16471 bytes
.../media_flags/studio/eleven_eleven.png | Bin 0 -> 3661 bytes
.../default/images/media_flags/studio/emi.png | Bin 0 -> 1143 bytes
.../images/media_flags/studio/emmedia.png | Bin 0 -> 1389 bytes
.../images/media_flags/studio/encore.png | Bin 0 -> 3952 bytes
.../studio/endgame_entertainment.png | Bin 0 -> 11663 bytes
.../images/media_flags/studio/entara.png | Bin 0 -> 19236 bytes
.../media_flags/studio/entertainment_one.png | Bin 0 -> 7652 bytes
.../studio/entertainment_television.png | Bin 0 -> 5618 bytes
.../media_flags/studio/eon_productions.png | Bin 0 -> 22889 bytes
.../images/media_flags/studio/epix.png | Bin 0 -> 3213 bytes
.../media_flags/studio/escape_artists.png | Bin 0 -> 10160 bytes
.../images/media_flags/studio/espn.png | Bin 0 -> 1981 bytes
.../images/media_flags/studio/eurimages.png | Bin 0 -> 4721 bytes
.../images/media_flags/studio/europa_corp.png | Bin 0 -> 8212 bytes
.../images/media_flags/studio/eurosport.png | Bin 0 -> 4246 bytes
.../images/media_flags/studio/excel.png | Bin 0 -> 2664 bytes
.../media_flags/studio/eyekiss_films.png | Bin 0 -> 4944 bytes
.../images/media_flags/studio/fact.png | Bin 0 -> 2467 bytes
.../images/media_flags/studio/figaro.png | Bin 0 -> 708 bytes
.../images/media_flags/studio/film_colony.png | Bin 0 -> 3597 bytes
.../images/media_flags/studio/film_four.png | Bin 0 -> 279 bytes
.../media_flags/studio/film_institut.png | Bin 0 -> 2698 bytes
.../images/media_flags/studio/film_media.png | Bin 0 -> 6248 bytes
.../images/media_flags/studio/film_polski.png | Bin 0 -> 1471 bytes
.../images/media_flags/studio/film_tv.png | Bin 0 -> 5617 bytes
.../images/media_flags/studio/filmauro.png | Bin 0 -> 6922 bytes
.../media_flags/studio/filmax_animation.png | Bin 0 -> 7852 bytes
.../studio/filmforderung_hamburg.png | Bin 0 -> 3807 bytes
.../media_flags/studio/filmoteka narodowa.png | Bin 0 -> 2478 bytes
.../filmstiftung_nordrhein-westfalen.png | Bin 0 -> 4142 bytes
.../images/media_flags/studio/finos_film.png | Bin 0 -> 7648 bytes
.../studio/fireworks_entertainment.png | Bin 0 -> 34079 bytes
.../studio/first_look_pictures.png | Bin 0 -> 16116 bytes
.../images/media_flags/studio/five.png | Bin 0 -> 2724 bytes
.../media_flags/studio/flower_films.png | Bin 0 -> 17149 bytes
.../media_flags/studio/focus_features.png | Bin 0 -> 4449 bytes
.../media_flags/studio/food_network.png | Bin 0 -> 7655 bytes
.../media_flags/studio/forte_cinema.png | Bin 0 -> 15392 bytes
.../media_flags/studio/fourhands_film.png | Bin 0 -> 20351 bytes
.../default/images/media_flags/studio/fox.png | Bin 0 -> 2763 bytes
.../images/media_flags/studio/fox_atomic.png | Bin 0 -> 5291 bytes
.../images/media_flags/studio/fox_kids.png | Bin 0 -> 8185 bytes
.../studio/fox_searchlight_pictures.png | Bin 0 -> 8533 bytes
.../images/media_flags/studio/france_2.png | Bin 0 -> 1725 bytes
.../images/media_flags/studio/france_3.png | Bin 0 -> 1751 bytes
.../images/media_flags/studio/france_4.png | Bin 0 -> 1512 bytes
.../media_flags/studio/franchise_pictures.png | Bin 0 -> 7502 bytes
.../images/media_flags/studio/freeform.png | Bin 0 -> 2306 bytes
.../images/media_flags/studio/fuji_tv.png | Bin 0 -> 4536 bytes
.../images/media_flags/studio/future_flix.png | Bin 0 -> 28494 bytes
.../default/images/media_flags/studio/fx.png | Bin 0 -> 2597 bytes
.../default/images/media_flags/studio/fxx.png | Bin 0 -> 3581 bytes
.../default/images/media_flags/studio/g4.png | Bin 0 -> 4122 bytes
.../images/media_flags/studio/gaumont.png | Bin 0 -> 1559 bytes
.../images/media_flags/studio/geffen.png | Bin 0 -> 6249 bytes
.../images/media_flags/studio/ghost_house.png | Bin 0 -> 5101 bytes
.../images/media_flags/studio/gk_films.png | Bin 0 -> 3729 bytes
.../media_flags/studio/glass_eye_pix.png | Bin 0 -> 39481 bytes
.../images/media_flags/studio/global_tv.png | Bin 0 -> 2805 bytes
.../studio/glue_works_entertainment.png | Bin 0 -> 10588 bytes
.../images/media_flags/studio/gofilms.png | Bin 0 -> 604 bytes
.../media_flags/studio/gold_circle_films.png | Bin 0 -> 12787 bytes
.../images/media_flags/studio/goldwyn.png | Bin 0 -> 5376 bytes
.../media_flags/studio/gracie_films.png | Bin 0 -> 17998 bytes
.../media_flags/studio/gramercy_pictures.png | Bin 0 -> 5949 bytes
.../images/media_flags/studio/grandhustle.png | Bin 0 -> 3627 bytes
.../media_flags/studio/green_street.png | Bin 0 -> 2959 bytes
.../media_flags/studio/greentree_pictures.png | Bin 0 -> 10844 bytes
.../studio/grub_street_productions.png | Bin 0 -> 3484 bytes
.../media_flags/studio/guinea_pig_films.png | Bin 0 -> 5264 bytes
.../images/media_flags/studio/gutek.png | Bin 0 -> 1509 bytes
.../images/media_flags/studio/halestorm.png | Bin 0 -> 1108 bytes
.../media_flags/studio/hallmark_channel.png | Bin 0 -> 5371 bytes
.../studio/hallucination_on_film.png | Bin 0 -> 3439 bytes
.../media_flags/studio/hand_made_films.png | Bin 0 -> 17120 bytes
.../media_flags/studio/happy_madison.png | Bin 0 -> 8978 bytes
.../images/media_flags/studio/hasbro.png | Bin 0 -> 5631 bytes
.../default/images/media_flags/studio/hbo.png | Bin 0 -> 2575 bytes
.../images/media_flags/studio/hbo_films.png | Bin 0 -> 9944 bytes
.../media_flags/studio/head_gear_films.png | Bin 0 -> 16023 bytes
.../images/media_flags/studio/hemus_film.png | Bin 0 -> 4580 bytes
.../media_flags/studio/heyday_films.png | Bin 0 -> 9599 bytes
.../images/media_flags/studio/hgtv.png | Bin 0 -> 2959 bytes
.../media_flags/studio/history_channel.png | Bin 0 -> 3484 bytes
.../media_flags/studio/hollywood_pictures.png | Bin 0 -> 5382 bytes
.../media_flags/studio/hopscotch_films.png | Bin 0 -> 6705 bytes
.../images/media_flags/studio/hulu.png | Bin 0 -> 1366 bytes
.../media_flags/studio/hustler_video.png | Bin 0 -> 13265 bytes
.../studio/hyde_park_entertainment.png | Bin 0 -> 22897 bytes
.../media_flags/studio/icon_entertainment.png | Bin 0 -> 12947 bytes
.../default/images/media_flags/studio/ifc.png | Bin 0 -> 4237 bytes
.../studio/illumination_entertainment.png | Bin 0 -> 6981 bytes
.../images/media_flags/studio/image.png | Bin 0 -> 8383 bytes
.../media_flags/studio/image_movers.png | Bin 0 -> 21814 bytes
.../media_flags/studio/imagi_studios.png | Bin 0 -> 3694 bytes
.../media_flags/studio/imaginary_forces.png | Bin 0 -> 8760 bytes
.../images/media_flags/studio/imagine.png | Bin 0 -> 10412 bytes
.../images/media_flags/studio/imax.png | Bin 0 -> 1756 bytes
.../studio/imperial_entertainment.png | Bin 0 -> 24429 bytes
.../studio/independent_pictures.png | Bin 0 -> 5762 bytes
.../studio/industrial_light_and_magic.png | Bin 0 -> 13843 bytes
.../images/media_flags/studio/infilm.png | Bin 0 -> 453 bytes
.../studio/ingenious_film_partners.png | Bin 0 -> 2328 bytes
.../studio/ingenius_entertainment.png | Bin 0 -> 26990 bytes
.../media_flags/studio/inside_track.png | Bin 0 -> 5483 bytes
.../media_flags/studio/insurge_pictures.png | Bin 0 -> 6472 bytes
.../images/media_flags/studio/interactual.png | Bin 0 -> 4755 bytes
.../images/media_flags/studio/intermedia.png | Bin 0 -> 1976 bytes
.../studio/interscope_shady_aftermath.png | Bin 0 -> 8208 bytes
.../media_flags/studio/intrepid_pictures.png | Bin 0 -> 14472 bytes
.../media_flags/studio/island_world.png | Bin 0 -> 12170 bytes
.../default/images/media_flags/studio/itv.png | Bin 0 -> 3008 bytes
.../images/media_flags/studio/janus.png | Bin 0 -> 18303 bytes
.../images/media_flags/studio/jarowskij.png | Bin 0 -> 4015 bytes
.../images/media_flags/studio/jawa.png | Bin 0 -> 887 bytes
.../studio/jerry_bruckheimer_films.png | Bin 0 -> 7091 bytes
.../media_flags/studio/jersey_films.png | Bin 0 -> 6387 bytes
.../images/media_flags/studio/jim_henson.png | Bin 0 -> 16681 bytes
.../images/media_flags/studio/jj_splice.png | Bin 0 -> 27171 bytes
.../studio/kaboom_entertainment.png | Bin 0 -> 7947 bytes
.../media_flags/studio/kadokawa_pictures.png | Bin 0 -> 7121 bytes
.../images/media_flags/studio/kadr.png | Bin 0 -> 2103 bytes
.../images/media_flags/studio/kamera.png | Bin 0 -> 913 bytes
.../images/media_flags/studio/kanal_5.png | Bin 0 -> 2835 bytes
.../media_flags/studio/kennedymarshall.png | Bin 0 -> 2735 bytes
.../images/media_flags/studio/kid_rhino.png | Bin 0 -> 5705 bytes
.../media_flags/studio/killer_films.png | Bin 0 -> 9297 bytes
.../images/media_flags/studio/kinepolis.png | Bin 0 -> 5861 bytes
.../images/media_flags/studio/king_world.png | Bin 0 -> 3864 bytes
.../images/media_flags/studio/kinowelt.png | Bin 0 -> 2111 bytes
.../images/media_flags/studio/konami.png | Bin 0 -> 3017 bytes
.../images/media_flags/studio/kopelson.png | Bin 0 -> 14555 bytes
.../media_flags/studio/kyoto_animation.png | Bin 0 -> 9513 bytes
.../images/media_flags/studio/ladd.png | Bin 0 -> 6026 bytes
.../studio/lakeshore_entertainment.png | Bin 0 -> 6511 bytes
.../images/media_flags/studio/latham.png | Bin 0 -> 7637 bytes
.../studio/lawrence_bender_productions.png | Bin 0 -> 4555 bytes
.../studio/league of noble peers.png | Bin 0 -> 564 bytes
.../media_flags/studio/legendary_pictures.png | Bin 0 -> 13069 bytes
.../images/media_flags/studio/lego.png | Bin 0 -> 5927 bytes
.../media_flags/studio/liberty_films.png | Bin 0 -> 15339 bytes
.../images/media_flags/studio/lifetime.png | Bin 0 -> 8159 bytes
.../images/media_flags/studio/lift.png | Bin 0 -> 34201 bytes
.../studio/lightstorm_entertainment.png | Bin 0 -> 10971 bytes
.../images/media_flags/studio/lionsgate.png | Bin 0 -> 4240 bytes
.../media_flags/studio/little_chicken.png | Bin 0 -> 39918 bytes
.../media_flags/studio/london_films.png | Bin 0 -> 26416 bytes
.../images/media_flags/studio/lookout.png | Bin 0 -> 12603 bytes
.../images/media_flags/studio/lucasfilm.png | Bin 0 -> 3277 bytes
.../images/media_flags/studio/lucky_7.png | Bin 0 -> 39913 bytes
.../default/images/media_flags/studio/m6.png | Bin 0 -> 6615 bytes
.../images/media_flags/studio/madhouse.png | Bin 0 -> 5134 bytes
.../images/media_flags/studio/madman.png | Bin 0 -> 2777 bytes
.../media_flags/studio/magnolia_pictures.png | Bin 0 -> 10290 bytes
.../media_flags/studio/mandalay_pictures.png | Bin 0 -> 33346 bytes
.../media_flags/studio/mandate_pictures.png | Bin 0 -> 26095 bytes
.../images/media_flags/studio/manga.png | Bin 0 -> 4025 bytes
.../images/media_flags/studio/marc_dorcel.png | Bin 0 -> 14913 bytes
.../images/media_flags/studio/marvel.png | Bin 0 -> 3325 bytes
.../images/media_flags/studio/maverick.png | Bin 0 -> 10140 bytes
.../media_flags/studio/maya_entertainment.png | Bin 0 -> 4338 bytes
.../default/images/media_flags/studio/mbs.png | Bin 0 -> 1365 bytes
.../images/media_flags/studio/media8.png | Bin 0 -> 680 bytes
.../images/media_flags/studio/mediapro.png | Bin 0 -> 2241 bytes
.../media_flags/studio/meridian_films.png | Bin 0 -> 26797 bytes
.../default/images/media_flags/studio/mgm.png | Bin 0 -> 22181 bytes
.../images/media_flags/studio/mibac.png | Bin 0 -> 537 bytes
.../media_flags/studio/midway_pictures.png | Bin 0 -> 23928 bytes
.../studio/mike_zoss_productions.png | Bin 0 -> 11442 bytes
.../images/media_flags/studio/milkshake.png | Bin 0 -> 1919 bytes
.../media_flags/studio/millennium_films.png | Bin 0 -> 6580 bytes
.../studio/minds_eye_entertainment.png | Bin 0 -> 14372 bytes
.../images/media_flags/studio/mirage.png | Bin 0 -> 3233 bytes
.../images/media_flags/studio/miramax.png | Bin 0 -> 2620 bytes
.../media_flags/studio/momentum_pictures.png | Bin 0 -> 8039 bytes
.../media_flags/studio/monarch_pictures.png | Bin 0 -> 13235 bytes
.../images/media_flags/studio/monolith.png | Bin 0 -> 22033 bytes
.../studio/montecito_picture_company.png | Bin 0 -> 64587 bytes
.../media_flags/studio/morgan_creek.png | Bin 0 -> 9236 bytes
.../media_flags/studio/mosaic_media.png | Bin 0 -> 25797 bytes
.../images/media_flags/studio/mosfilm.png | Bin 0 -> 3163 bytes
.../images/media_flags/studio/mpca.png | Bin 0 -> 7901 bytes
.../images/media_flags/studio/msnbc.png | Bin 0 -> 3772 bytes
.../default/images/media_flags/studio/mtv.png | Bin 0 -> 3596 bytes
.../images/media_flags/studio/mtv3.png | Bin 0 -> 6351 bytes
.../media_flags/studio/musashi_films.png | Bin 0 -> 19903 bytes
.../studio/mutual_film_company.png | Bin 0 -> 3222 bytes
.../images/media_flags/studio/myriad.png | Bin 0 -> 1287 bytes
.../images/media_flags/studio/mytv.png | Bin 0 -> 276 bytes
.../images/media_flags/studio/nala.png | Bin 0 -> 1238 bytes
.../media_flags/studio/nat_geo_wild.png | Bin 0 -> 3257 bytes
.../studio/national_general_pictures.png | Bin 0 -> 6310 bytes
.../default/images/media_flags/studio/nbc.png | Bin 0 -> 3424 bytes
.../media_flags/studio/nbc_universal.png | Bin 0 -> 3592 bytes
.../images/media_flags/studio/nelvana.png | Bin 0 -> 8430 bytes
.../images/media_flags/studio/netflix.png | Bin 0 -> 4494 bytes
.../studio/new_deal_entertainment.png | Bin 0 -> 11039 bytes
.../media_flags/studio/new_line_cinema.png | Bin 0 -> 9673 bytes
.../studio/new_zealand_film_commission.png | Bin 0 -> 10907 bytes
.../images/media_flags/studio/newmarket.png | Bin 0 -> 6738 bytes
.../default/images/media_flags/studio/ngc.png | Bin 0 -> 5526 bytes
.../media_flags/studio/nick_at_nite.png | Bin 0 -> 2846 bytes
.../images/media_flags/studio/nick_jr.png | Bin 0 -> 2600 bytes
.../images/media_flags/studio/nickelodeon.png | Bin 0 -> 2805 bytes
.../images/media_flags/studio/nicktoons.png | Bin 0 -> 2579 bytes
.../media_flags/studio/nine network.png | Bin 0 -> 3121 bytes
.../images/media_flags/studio/nord_ouest.png | Bin 0 -> 13223 bytes
.../media_flags/studio/nordisk film.png | Bin 0 -> 4917 bytes
.../studio/northern_lights_entertainment.png | Bin 0 -> 15833 bytes
.../images/media_flags/studio/nothing.png | Bin 0 -> 1730 bytes
.../images/media_flags/studio/nrk1.png | Bin 0 -> 2531 bytes
.../images/media_flags/studio/nuimage.png | Bin 0 -> 1181 bytes
.../images/media_flags/studio/o2_filmes.png | Bin 0 -> 9582 bytes
.../images/media_flags/studio/oddlot.png | Bin 0 -> 6259 bytes
.../default/images/media_flags/studio/oko.png | Bin 0 -> 2873 bytes
.../images/media_flags/studio/only_vegas.png | Bin 0 -> 6694 bytes
.../studio/oprah_winfrey_network.png | Bin 0 -> 5593 bytes
.../default/images/media_flags/studio/orf.png | Bin 0 -> 1746 bytes
.../images/media_flags/studio/orion.png | Bin 0 -> 2922 bytes
.../media_flags/studio/overturefilms.png | Bin 0 -> 6070 bytes
.../images/media_flags/studio/pa_works.png | Bin 0 -> 34362 bytes
.../images/media_flags/studio/pan_vision.png | Bin 0 -> 2835 bytes
.../media_flags/studio/pandora_film.png | Bin 0 -> 2368 bytes
.../media_flags/studio/paramount_classics.png | Bin 0 -> 45427 bytes
.../media_flags/studio/paramount_pictures.png | Bin 0 -> 9772 bytes
.../media_flags/studio/paramount_vantage.png | Bin 0 -> 5322 bytes
.../images/media_flags/studio/participant.png | Bin 0 -> 2980 bytes
.../images/media_flags/studio/pathe.png | Bin 0 -> 2353 bytes
.../default/images/media_flags/studio/pbs.png | Bin 0 -> 3349 bytes
.../images/media_flags/studio/peacearch.png | Bin 0 -> 7996 bytes
.../images/media_flags/studio/pecf.png | Bin 0 -> 432 bytes
.../studio/peters_entertainment2.png | Bin 0 -> 11834 bytes
.../media_flags/studio/phase_4_films.png | Bin 0 -> 5621 bytes
.../images/media_flags/studio/pheonix.png | Bin 0 -> 9006 bytes
.../media_flags/studio/picturehouse.png | Bin 0 -> 6843 bytes
.../images/media_flags/studio/pisf.png | Bin 0 -> 1314 bytes
.../images/media_flags/studio/pixar.png | Bin 0 -> 1319 bytes
.../images/media_flags/studio/plan_b.png | Bin 0 -> 1981 bytes
.../images/media_flags/studio/platige.png | Bin 0 -> 285 bytes
.../media_flags/studio/platinum_dunes.png | Bin 0 -> 6030 bytes
.../images/media_flags/studio/play_uk.png | Bin 0 -> 2741 bytes
.../studio/playstation_network.png | Bin 0 -> 12527 bytes
.../images/media_flags/studio/playtone.png | Bin 0 -> 420 bytes
.../images/media_flags/studio/polsat.png | Bin 0 -> 4386 bytes
.../images/media_flags/studio/polygram.png | Bin 0 -> 5951 bytes
.../default/images/media_flags/studio/pop.png | Bin 0 -> 2939 bytes
.../images/media_flags/studio/porchlight.png | Bin 0 -> 15816 bytes
.../media_flags/studio/portman_film.png | Bin 0 -> 4697 bytes
.../media_flags/studio/premiere direkt.png | Bin 0 -> 1388 bytes
.../images/media_flags/studio/premiere.png | Bin 0 -> 341 bytes
.../media_flags/studio/private_pictures.png | Bin 0 -> 15616 bytes
.../images/media_flags/studio/pro7.png | Bin 0 -> 616 bytes
.../media_flags/studio/production_i_g.png | Bin 0 -> 13239 bytes
.../studio/profilm_productions.png | Bin 0 -> 9366 bytes
.../media_flags/studio/promotion_pictures.png | Bin 0 -> 3458 bytes
.../images/media_flags/studio/prosieben.png | Bin 0 -> 616 bytes
.../media_flags/studio/radical_media.png | Bin 0 -> 2379 bytes
.../images/media_flags/studio/rai_cinema.png | Bin 0 -> 6163 bytes
.../images/media_flags/studio/rankin.png | Bin 0 -> 530 bytes
.../studio/ratpac_dune_entertainment.png | Bin 0 -> 18127 bytes
.../studio/ratpac_entertainment.png | Bin 0 -> 8864 bytes
.../images/media_flags/studio/red_hour.png | Bin 0 -> 10435 bytes
.../studio/red_wagon_entertainment.png | Bin 0 -> 19947 bytes
.../images/media_flags/studio/redrum.png | Bin 0 -> 4832 bytes
.../studio/reel_dog_productions.png | Bin 0 -> 20123 bytes
.../images/media_flags/studio/regency.png | Bin 0 -> 1376 bytes
.../media_flags/studio/relativity_media.png | Bin 0 -> 9658 bytes
.../media_flags/studio/renaissance_films.png | Bin 0 -> 4384 bytes
.../media_flags/studio/republic_pictures.png | Bin 0 -> 28534 bytes
.../media_flags/studio/resident_evil.png | Bin 0 -> 3554 bytes
.../media_flags/studio/revere_pictures.png | Bin 0 -> 4884 bytes
.../images/media_flags/studio/revision3.png | Bin 0 -> 4189 bytes
.../media_flags/studio/revolution_studios.png | Bin 0 -> 16156 bytes
.../images/media_flags/studio/rhombus.png | Bin 0 -> 457 bytes
.../images/media_flags/studio/rick_mill.png | Bin 0 -> 11998 bytes
.../studio/rickety_shack_films.png | Bin 0 -> 12193 bytes
.../studio/river_road_entertainment.png | Bin 0 -> 14403 bytes
.../media_flags/studio/rko_radio_pictures.png | Bin 0 -> 27085 bytes
.../studio/roadside_attractions.png | Bin 0 -> 24468 bytes
.../media_flags/studio/rogue_pictures.png | Bin 0 -> 2963 bytes
.../images/media_flags/studio/romar.png | Bin 0 -> 4421 bytes
.../images/media_flags/studio/rte_one.png | Bin 0 -> 2732 bytes
.../default/images/media_flags/studio/rtl.png | Bin 0 -> 1103 bytes
.../images/media_flags/studio/rtl4.png | Bin 0 -> 3319 bytes
.../images/media_flags/studio/rtl5.png | Bin 0 -> 7631 bytes
.../images/media_flags/studio/rtl7.png | Bin 0 -> 2024 bytes
.../images/media_flags/studio/rtl8.png | Bin 0 -> 7891 bytes
.../images/media_flags/studio/rtl_ii.png | Bin 0 -> 1626 bytes
.../studio/rysher_entertainment.png | Bin 0 -> 10216 bytes
.../images/media_flags/studio/saban.png | Bin 0 -> 4231 bytes
.../studio/salter_street_films.png | Bin 0 -> 4438 bytes
.../images/media_flags/studio/sandrew.png | Bin 0 -> 3365 bytes
.../images/media_flags/studio/sat1.png | Bin 0 -> 4018 bytes
.../media_flags/studio/saturn_films.png | Bin 0 -> 4390 bytes
.../images/media_flags/studio/saul_zaentz.png | Bin 0 -> 1572 bytes
.../default/images/media_flags/studio/sbs.png | Bin 0 -> 4233 bytes
.../images/media_flags/studio/scholastic.png | Bin 0 -> 1773 bytes
.../images/media_flags/studio/scifi.png | Bin 0 -> 5874 bytes
.../images/media_flags/studio/scott_free.png | Bin 0 -> 5089 bytes
.../media_flags/studio/screen_australia.png | Bin 0 -> 3996 bytes
.../images/media_flags/studio/screen_gems.png | Bin 0 -> 8889 bytes
.../images/media_flags/studio/seeso.png | Bin 0 -> 4752 bytes
.../media_flags/studio/selznick_pictures.png | Bin 0 -> 14418 bytes
.../images/media_flags/studio/semafor.png | Bin 0 -> 1807 bytes
.../media_flags/studio/seven network.png | Bin 0 -> 1233 bytes
.../default/images/media_flags/studio/sfi.png | Bin 0 -> 2425 bytes
.../studio/shady_acres_entertainment.png | Bin 0 -> 21057 bytes
.../images/media_flags/studio/shaft.png | Bin 0 -> 13693 bytes
.../studio/shangri-la_entertainment.png | Bin 0 -> 20886 bytes
.../media_flags/studio/shout_factory.png | Bin 0 -> 6686 bytes
.../images/media_flags/studio/showcase.png | Bin 0 -> 6600 bytes
.../images/media_flags/studio/showcase_au.png | Bin 0 -> 3024 bytes
.../images/media_flags/studio/showtime.png | Bin 0 -> 4087 bytes
.../media_flags/studio/sidney_kimmel.png | Bin 0 -> 36298 bytes
.../media_flags/studio/silver_pictures.png | Bin 0 -> 8104 bytes
.../default/images/media_flags/studio/sky.png | Bin 0 -> 2767 bytes
.../images/media_flags/studio/sky_1.png | Bin 0 -> 2242 bytes
.../studio/skydance_productions.png | Bin 0 -> 5070 bytes
.../images/media_flags/studio/slim_films.png | Bin 0 -> 18795 bytes
.../default/images/media_flags/studio/smc.png | Bin 0 -> 1925 bytes
.../images/media_flags/studio/snl_studios.png | Bin 0 -> 6066 bytes
.../media_flags/studio/sobini_films.png | Bin 0 -> 10832 bytes
.../images/media_flags/studio/sony.png | Bin 0 -> 5193 bytes
.../media_flags/studio/sony_pictures.png | Bin 0 -> 5193 bytes
.../studio/sony_pictures_animation.png | Bin 0 -> 10659 bytes
.../images/media_flags/studio/space.png | Bin 0 -> 5344 bytes
.../media_flags/studio/spelling_films.png | Bin 0 -> 16056 bytes
.../images/media_flags/studio/spike.png | Bin 0 -> 3486 bytes
.../media_flags/studio/spitfire_pictures.png | Bin 0 -> 9130 bytes
.../images/media_flags/studio/splendid.png | Bin 0 -> 7474 bytes
.../studio/spyglass_entertainment.png | Bin 0 -> 14721 bytes
.../images/media_flags/studio/squareenix.png | Bin 0 -> 1880 bytes
.../images/media_flags/studio/stage6.png | Bin 0 -> 4291 bytes
.../images/media_flags/studio/stan.png | Bin 0 -> 5286 bytes
.../studio/starbucks_entertainment.png | Bin 0 -> 9836 bytes
.../images/media_flags/studio/starz.png | Bin 0 -> 2689 bytes
.../images/media_flags/studio/steele.png | Bin 0 -> 3992 bytes
.../images/media_flags/studio/storyline.png | Bin 0 -> 2528 bytes
.../media_flags/studio/studio_canal.png | Bin 0 -> 7199 bytes
.../media_flags/studio/studio_ghibli.png | Bin 0 -> 6449 bytes
.../images/media_flags/studio/summit.png | Bin 0 -> 4288 bytes
.../images/media_flags/studio/sundancetv.png | Bin 0 -> 6410 bytes
.../images/media_flags/studio/sunrise.png | Bin 0 -> 6895 bytes
.../media_flags/studio/super_channel.png | Bin 0 -> 4300 bytes
.../studio/svensk_filmindustri.png | Bin 0 -> 23211 bytes
.../default/images/media_flags/studio/svt.png | Bin 0 -> 14320 bytes
.../images/media_flags/studio/svt1.png | Bin 0 -> 1735 bytes
.../images/media_flags/studio/svt2.png | Bin 0 -> 2227 bytes
.../images/media_flags/studio/syfy.png | Bin 0 -> 2748 bytes
.../images/media_flags/studio/syncopy.png | Bin 0 -> 5345 bytes
.../images/media_flags/studio/syrena.png | Bin 0 -> 4998 bytes
.../images/media_flags/studio/tandem.png | Bin 0 -> 7108 bytes
.../images/media_flags/studio/taurus_film.png | Bin 0 -> 8252 bytes
.../default/images/media_flags/studio/tbs.png | Bin 0 -> 2461 bytes
.../images/media_flags/studio/telecinco.png | Bin 0 -> 2074 bytes
.../images/media_flags/studio/telemundo.png | Bin 0 -> 7579 bytes
.../images/media_flags/studio/teletoon.png | Bin 0 -> 4234 bytes
.../images/media_flags/studio/telos.png | Bin 0 -> 2872 bytes
.../default/images/media_flags/studio/tf1.png | Bin 0 -> 447 bytes
.../images/media_flags/studio/the_cw.png | Bin 0 -> 1088 bytes
.../studio/the_entertainment_group.png | Bin 0 -> 6463 bytes
.../media_flags/studio/the_film_foundry.png | Bin 0 -> 17854 bytes
.../images/media_flags/studio/the_hub.png | Bin 0 -> 6567 bytes
.../studio/the_independent_film_channel.png | Bin 0 -> 7832 bytes
.../images/media_flags/studio/the_wb.png | Bin 0 -> 2981 bytes
.../studio/the_wb_television_network.png | Bin 0 -> 13172 bytes
.../media_flags/studio/thierry_mugler.png | Bin 0 -> 4148 bytes
.../images/media_flags/studio/think_film.png | Bin 0 -> 3157 bytes
.../media_flags/studio/this_is_that.png | Bin 0 -> 10947 bytes
.../default/images/media_flags/studio/tlc.png | Bin 0 -> 1482 bytes
.../default/images/media_flags/studio/tnt.png | Bin 0 -> 2649 bytes
.../images/media_flags/studio/toho.png | Bin 0 -> 2020 bytes
.../default/images/media_flags/studio/tor.png | Bin 0 -> 2349 bytes
.../images/media_flags/studio/touchstone.png | Bin 0 -> 4936 bytes
.../media_flags/studio/tristar_pictures.png | Bin 0 -> 20735 bytes
.../images/media_flags/studio/trutv.png | Bin 0 -> 4059 bytes
.../images/media_flags/studio/turner.png | Bin 0 -> 972 bytes
.../default/images/media_flags/studio/tv2.png | Bin 0 -> 1126 bytes
.../default/images/media_flags/studio/tv3.png | Bin 0 -> 1318 bytes
.../default/images/media_flags/studio/tv4.png | Bin 0 -> 1617 bytes
.../images/media_flags/studio/tv_2.png | Bin 0 -> 1753 bytes
.../images/media_flags/studio/tv_land.png | Bin 0 -> 16190 bytes
.../images/media_flags/studio/tv_tokyo.png | Bin 0 -> 3284 bytes
.../default/images/media_flags/studio/tvn.png | Bin 0 -> 1676 bytes
.../images/media_flags/studio/tvnz.png | Bin 0 -> 1784 bytes
.../default/images/media_flags/studio/tvp.png | Bin 0 -> 949 bytes
.../media_flags/studio/twisted_pictures.png | Bin 0 -> 6355 bytes
.../images/media_flags/studio/twit.png | Bin 0 -> 6829 bytes
.../default/images/media_flags/studio/ugc.png | Bin 0 -> 2553 bytes
.../media_flags/studio/uk_film_council.png | Bin 0 -> 11718 bytes
.../media_flags/studio/united_artists.png | Bin 0 -> 3086 bytes
.../images/media_flags/studio/universal.png | Bin 0 -> 2063 bytes
.../images/media_flags/studio/univision.png | Bin 0 -> 2848 bytes
.../images/media_flags/studio/up_tv.png | Bin 0 -> 11383 bytes
.../default/images/media_flags/studio/upn.png | Bin 0 -> 4152 bytes
.../images/media_flags/studio/usa_network.png | Bin 0 -> 2457 bytes
.../images/media_flags/studio/vara.png | Bin 0 -> 3185 bytes
.../images/media_flags/studio/versus.png | Bin 0 -> 3277 bytes
.../images/media_flags/studio/vertigo.png | Bin 0 -> 7482 bytes
.../default/images/media_flags/studio/vh1.png | Bin 0 -> 2100 bytes
.../images/media_flags/studio/viacom.png | Bin 0 -> 2937 bytes
.../images/media_flags/studio/view_askew.png | Bin 0 -> 59117 bytes
.../studio/village_roadshow_pictures.png | Bin 0 -> 19011 bytes
.../images/media_flags/studio/vimeo.png | Bin 0 -> 3488 bytes
.../media_flags/studio/virtual_studios.png | Bin 0 -> 3380 bytes
.../media_flags/studio/vital_film_works.png | Bin 0 -> 9951 bytes
.../default/images/media_flags/studio/viz.png | Bin 0 -> 5290 bytes
.../studio/vortex_entertainment.png | Bin 0 -> 16919 bytes
.../default/images/media_flags/studio/vox.png | Bin 0 -> 2181 bytes
.../images/media_flags/studio/vpro.png | Bin 0 -> 4946 bytes
.../default/images/media_flags/studio/vtm.png | Bin 0 -> 1334 bytes
.../media_flags/studio/walden_media.png | Bin 0 -> 15603 bytes
.../studio/walt_disney_pictures.png | Bin 0 -> 9301 bytes
.../images/media_flags/studio/warner_bros.png | Bin 0 -> 14656 bytes
.../studio/warner_bros_animation.png | Bin 0 -> 11057 bytes
.../studio/warner_independent_pictures.png | Bin 0 -> 4267 bytes
.../studio/water_walk_productions.png | Bin 0 -> 25207 bytes
.../default/images/media_flags/studio/wdr.png | Bin 0 -> 1433 bytes
.../images/media_flags/studio/we_tv.png | Bin 0 -> 7944 bytes
.../media_flags/studio/weinstein_company.png | Bin 0 -> 10907 bytes
.../images/media_flags/studio/wfdif.png | Bin 0 -> 1563 bytes
.../default/images/media_flags/studio/wgn.png | Bin 0 -> 7606 bytes
.../images/media_flags/studio/wild_bunch.png | Bin 0 -> 4390 bytes
.../images/media_flags/studio/wild_side.png | Bin 0 -> 11173 bytes
.../studio/working_title_films.png | Bin 0 -> 2530 bytes
.../images/media_flags/studio/xfilme.png | Bin 0 -> 2626 bytes
.../media_flags/studio/xxx_productions.png | Bin 0 -> 3266 bytes
.../media_flags/studio/yahoo_screen.png | Bin 0 -> 7636 bytes
.../media_flags/studio/yari_film_group.png | Bin 0 -> 11399 bytes
.../images/media_flags/studio/youtube.png | Bin 0 -> 2959 bytes
.../default/images/media_flags/studio/ytv.png | Bin 0 -> 13285 bytes
.../media_flags/studio/zaloom_mayfield.png | Bin 0 -> 36271 bytes
.../default/images/media_flags/studio/zdf.png | Bin 0 -> 2667 bytes
.../images/media_flags/studio/zebra.png | Bin 0 -> 1847 bytes
.../images/media_flags/studio/zentropa.png | Bin 0 -> 1219 bytes
.../images/media_flags/studio/zomba.png | Bin 0 -> 5587 bytes
.../images/media_flags/video_codec/h264.png | Bin 0 -> 764 bytes
.../images/media_flags/video_codec/hevc.png | Bin 0 -> 850 bytes
.../media_flags/video_codec/mpeg1video.png | Bin 0 -> 586 bytes
.../media_flags/video_codec/mpeg2video.png | Bin 0 -> 645 bytes
.../images/media_flags/video_codec/mpeg4.png | Bin 0 -> 1030 bytes
.../images/media_flags/video_codec/vc1.png | Bin 0 -> 1042 bytes
.../images/media_flags/video_codec/wmv.png | Bin 0 -> 1139 bytes
.../images/media_flags/video_codec/wmvhd.png | Bin 0 -> 1696 bytes
.../media_flags/video_framerate/24p.png | Bin 0 -> 894 bytes
.../media_flags/video_framerate/25p.png | Bin 0 -> 1030 bytes
.../media_flags/video_framerate/50p.png | Bin 0 -> 1053 bytes
.../media_flags/video_framerate/60p.png | Bin 0 -> 1120 bytes
.../media_flags/video_framerate/NTSC.png | Bin 0 -> 1297 bytes
.../media_flags/video_framerate/PAL.png | Bin 0 -> 814 bytes
.../media_flags/video_resolution/1080.png | Bin 0 -> 1625 bytes
.../media_flags/video_resolution/1080i.png | Bin 0 -> 1537 bytes
.../media_flags/video_resolution/270.png | Bin 0 -> 1357 bytes
.../media_flags/video_resolution/360.png | Bin 0 -> 1567 bytes
.../media_flags/video_resolution/432.png | Bin 0 -> 1348 bytes
.../media_flags/video_resolution/468.png | Bin 0 -> 1639 bytes
.../media_flags/video_resolution/480.png | Bin 0 -> 1442 bytes
.../media_flags/video_resolution/480i.png | Bin 0 -> 1368 bytes
.../media_flags/video_resolution/4k.png | Bin 0 -> 456 bytes
.../media_flags/video_resolution/540.png | Bin 0 -> 1406 bytes
.../media_flags/video_resolution/544.png | Bin 0 -> 1087 bytes
.../media_flags/video_resolution/576.png | Bin 0 -> 1423 bytes
.../media_flags/video_resolution/576i.png | Bin 0 -> 1325 bytes
.../media_flags/video_resolution/720.png | Bin 0 -> 1331 bytes
.../media_flags/video_resolution/8k.png | Bin 0 -> 584 bytes
.../media_flags/video_resolution/hdtv.png | Bin 0 -> 1070 bytes
.../media_flags/video_resolution/sd.png | Bin 0 -> 901 bytes
.../images/newsletter/newsletter-header.png | Bin 0 -> 33998 bytes
.../images/newsletter/view-on-plex-cover.png | Bin 0 -> 4954 bytes
.../images/newsletter/view-on-plex-flat.png | Bin 0 -> 5535 bytes
.../images/newsletter/view-on-plex-poster.png | Bin 0 -> 5206 bytes
.../default/images/platforms/android.svg | 8 +
.../default/images/platforms/atv.svg | 8 +
.../default/images/platforms/chrome.svg | 8 +
.../default/images/platforms/chromecast.svg | 8 +
.../default/images/platforms/cloudsync.svg | 6 +
.../default/images/platforms/default.svg | 5 +
.../default/images/platforms/dlna.svg | 5 +
.../default/images/platforms/firefox.svg | 5 +
.../default/images/platforms/gtv.svg | 14 +
.../default/images/platforms/ie.svg | 5 +
.../default/images/platforms/ios.svg | 10 +
.../default/images/platforms/kodi.svg | 8 +
.../default/images/platforms/linux.svg | 8 +
.../default/images/platforms/macos.svg | 6 +
.../default/images/platforms/msedge.svg | 5 +
.../default/images/platforms/opera.svg | 6 +
.../default/images/platforms/playstation.svg | 7 +
.../default/images/platforms/plex.svg | 5 +
.../default/images/platforms/plexamp.svg | 5 +
.../default/images/platforms/roku.svg | 7 +
.../default/images/platforms/safari.svg | 66 +
.../default/images/platforms/samsung.svg | 5 +
.../default/images/platforms/synclounge.svg | 9 +
.../default/images/platforms/tivo.svg | 5 +
.../default/images/platforms/wiiu.svg | 6 +
.../default/images/platforms/windows.svg | 8 +
.../default/images/platforms/xbox.svg | 8 +
.../default/images/plex-logo-light-small.png | Bin 0 -> 1441 bytes
.../default/images/plex-logo-light.svg | 26 +
.../interfaces/default/images/poster-live.png | Bin 0 -> 37808 bytes
data/interfaces/default/images/poster.png | Bin 0 -> 62184 bytes
data/interfaces/default/images/tautulli.png | Bin 0 -> 9132 bytes
data/interfaces/default/images/tautulli.svg | 44 +
data/interfaces/default/index.html | 935 +++
data/interfaces/default/info.html | 789 ++
.../default/info_children_list.html | 156 +
.../default/info_collection_list.html | 92 +
.../default/info_search_results_list.html | 280 +
data/interfaces/default/ip_address_modal.html | 149 +
data/interfaces/default/js/Sortable.min.js | 2 +
.../default/js/ajaxNotifications.js | 42 +
.../js/bootstrap-hover-dropdown.min.js | 12 +
.../default/js/bootstrap-wizard.min.js | 1 +
data/interfaces/default/js/bootstrap.min.js | 7 +
.../default/js/dataTables.bootstrap.min.js | 8 +
.../js/dataTables.bootstrap.pagination.js | 117 +
.../default/js/dataTables.colVis.js | 1130 +++
data/interfaces/default/js/filterer.jquery.js | 9 +
.../default/js/graphs/plays_by_day.js | 72 +
.../default/js/graphs/plays_by_dayofweek.js | 74 +
.../default/js/graphs/plays_by_hourofday.js | 74 +
.../default/js/graphs/plays_by_month.js | 74 +
.../default/js/graphs/plays_by_platform.js | 74 +
.../plays_by_platform_by_stream_type.js | 74 +
.../js/graphs/plays_by_source_resolution.js | 74 +
.../js/graphs/plays_by_stream_resolution.js | 74 +
.../default/js/graphs/plays_by_stream_type.js | 72 +
.../default/js/graphs/plays_by_user.js | 74 +
.../js/graphs/plays_by_user_by_stream_type.js | 74 +
.../js/highcharts/api/css/font-awesome.css | 1338 ++++
.../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 208 bytes
.../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 262 bytes
.../js/highcharts/api/css/jquery-ui.css | 1177 +++
.../default/js/highcharts/api/css/ref.css | 594 ++
.../api/fonts/fontawesome-webfont.woff | Bin 0 -> 65452 bytes
.../default/js/highcharts/api/highcharts.html | 122 +
.../js/highcharts/api/images/Highcharts.svg | 54 +
.../api/images/apple-touch-icon-114x114.png | Bin 0 -> 6248 bytes
.../api/images/apple-touch-icon-120x120.png | Bin 0 -> 6680 bytes
.../api/images/apple-touch-icon-144x144.png | Bin 0 -> 8039 bytes
.../api/images/apple-touch-icon-152x152.png | Bin 0 -> 8646 bytes
.../api/images/apple-touch-icon-180x180.png | Bin 0 -> 10348 bytes
.../api/images/apple-touch-icon-57x57.png | Bin 0 -> 3013 bytes
.../api/images/apple-touch-icon-60x60.png | Bin 0 -> 3178 bytes
.../api/images/apple-touch-icon-72x72.png | Bin 0 -> 3826 bytes
.../api/images/apple-touch-icon-76x76.png | Bin 0 -> 4108 bytes
.../highcharts/api/images/favicon-160x160.png | Bin 0 -> 9087 bytes
.../highcharts/api/images/favicon-16x16.png | Bin 0 -> 1118 bytes
.../highcharts/api/images/favicon-192x192.png | Bin 0 -> 11142 bytes
.../highcharts/api/images/favicon-32x32.png | Bin 0 -> 1668 bytes
.../highcharts/api/images/favicon-96x96.png | Bin 0 -> 5248 bytes
.../js/highcharts/api/images/splash.svg | 43 +
.../js/highcharts/api/images/sprite.png | Bin 0 -> 445 bytes
.../js/highcharts/api/js/highcharts.json | 2 +
.../js/highcharts/api/js/jquery-ui.min.js | 12 +
.../js/highcharts/api/js/jquery.min.js | 5 +
.../default/js/highcharts/api/js/ref.js | 863 +++
.../js/highcharts/gfx/vml-radial-gradient.png | Bin 0 -> 24270 bytes
.../graphics/meteogram-symbols-30px.png | Bin 0 -> 40391 bytes
.../default/js/highcharts/graphics/skies.jpg | Bin 0 -> 43395 bytes
.../default/js/highcharts/graphics/snow.png | Bin 0 -> 4679 bytes
.../default/js/highcharts/graphics/sun.png | Bin 0 -> 3934 bytes
.../js/adapters/standalone-framework.js | 18 +
.../js/adapters/standalone-framework.src.js | 603 ++
.../default/js/highcharts/js/highcharts.js | 325 +
.../js/highcharts/js/modules/broken-axis.js | 6 +
.../highcharts/js/modules/broken-axis.src.js | 306 +
.../js/highcharts/js/modules/canvas-tools.js | 133 +
.../highcharts/js/modules/canvas-tools.src.js | 3113 ++++++++
.../default/js/highcharts/js/modules/data.js | 26 +
.../js/highcharts/js/modules/data.src.js | 953 +++
.../js/highcharts/js/modules/drilldown.js | 17 +
.../js/highcharts/js/modules/drilldown.src.js | 709 ++
.../js/highcharts/js/modules/exporting.js | 23 +
.../js/highcharts/js/modules/exporting.src.js | 748 ++
.../js/highcharts/js/modules/funnel.js | 13 +
.../js/highcharts/js/modules/funnel.src.js | 310 +
.../js/highcharts/js/modules/heatmap.js | 23 +
.../js/highcharts/js/modules/heatmap.src.js | 680 ++
.../js/modules/no-data-to-display.js | 12 +
.../js/modules/no-data-to-display.src.js | 125 +
.../js/highcharts/js/modules/solid-gauge.js | 14 +
.../highcharts/js/modules/solid-gauge.src.js | 267 +
.../js/highcharts/js/modules/treemap.js | 29 +
.../js/highcharts/js/modules/treemap.src.js | 854 ++
.../js/highcharts/js/themes/dark-blue.js | 254 +
.../js/highcharts/js/themes/dark-green.js | 255 +
.../js/highcharts/js/themes/dark-unica.js | 213 +
.../default/js/highcharts/js/themes/gray.js | 257 +
.../js/highcharts/js/themes/grid-light.js | 74 +
.../default/js/highcharts/js/themes/grid.js | 103 +
.../js/highcharts/js/themes/sand-signika.js | 104 +
.../default/js/highcharts/js/themes/skies.js | 89 +
data/interfaces/default/js/ipaddr.min.js | 1 +
.../interfaces/default/js/jquery-2.1.4.min.js | 4 +
data/interfaces/default/js/jquery-cron-min.js | 1 +
data/interfaces/default/js/jquery-ui.min.js | 13 +
.../default/js/jquery.dataTables.min.js | 166 +
.../default/js/jquery.mousewheel.min.js | 8 +
.../default/js/jquery.qrcode.min.js | 28 +
.../default/js/jquery.rateit.min.js | 2 +
.../default/js/jquery.scrollbar.min.js | 16 +
.../default/js/jquery.tripleclick.min.js | 1 +
.../default/js/moment-duration-format.js | 482 ++
.../default/js/moment-with-locale.js | 10 +
data/interfaces/default/js/parsley.min.js | 9 +
data/interfaces/default/js/platform.min.js | 7 +
.../default/js/pnotify.custom.min.js | 49 +
data/interfaces/default/js/script.js | 684 ++
data/interfaces/default/js/selectize.min.js | 3 +
.../default/js/tables/accounts_table.js | 93 +
.../default/js/tables/history_table.js | 591 ++
.../default/js/tables/history_table_modal.js | 173 +
.../interfaces/default/js/tables/libraries.js | 336 +
.../default/js/tables/login_logs.js | 129 +
data/interfaces/default/js/tables/logs.js | 46 +
.../default/js/tables/media_info_table.js | 503 ++
.../default/js/tables/newsletter_logs.js | 147 +
.../default/js/tables/notification_logs.js | 117 +
.../interfaces/default/js/tables/plex_logs.js | 46 +
.../default/js/tables/servers_table.js | 547 ++
.../default/js/tables/sync_table.js | 182 +
data/interfaces/default/js/tables/user_ips.js | 183 +
data/interfaces/default/js/tables/users.js | 381 +
data/interfaces/default/libraries.html | 209 +
data/interfaces/default/library.html | 655 ++
.../default/library_recently_added.html | 120 +
data/interfaces/default/library_stats.html | 104 +
.../default/library_user_stats.html | 49 +
data/interfaces/default/login.html | 185 +
data/interfaces/default/logs.html | 576 ++
.../default/mobile_device_config.html | 132 +
.../default/mobile_devices_table.html | 141 +
data/interfaces/default/newsletter_auth.html | 44 +
.../interfaces/default/newsletter_config.html | 833 ++
.../default/newsletter_preview.html | 48 +
.../interfaces/default/newsletters_table.html | 51 +
data/interfaces/default/notifier_config.html | 885 +++
.../default/notifier_text_preview.html | 27 +
data/interfaces/default/notifiers_table.html | 42 +
.../default/plextv_account_modal.html | 124 +
data/interfaces/default/queue_modal.html | 66 +
data/interfaces/default/recently_added.html | 209 +
data/interfaces/default/scheduler_table.html | 81 +
data/interfaces/default/search.html | 49 +
data/interfaces/default/server_config.html | 612 ++
data/interfaces/default/server_status.html | 104 +
data/interfaces/default/settings.html | 2484 ++++++
data/interfaces/default/shutdown.html | 87 +
data/interfaces/default/stream_data.html | 244 +
data/interfaces/default/support.html | 68 +
data/interfaces/default/sync.html | 227 +
data/interfaces/default/update_metadata.html | 235 +
data/interfaces/default/user.html | 730 ++
.../interfaces/default/user_player_stats.html | 43 +
.../default/user_recently_watched.html | 147 +
.../default/user_watch_time_stats.html | 48 +
data/interfaces/default/users.html | 213 +
data/interfaces/default/welcome.html | 343 +
.../newsletters/recently_added.html | 1089 +++
.../newsletters/recently_added.internal.html | 1089 +++
init-scripts/init-alt.freebsd | 88 +
init-scripts/init.fedora.centos.service | 76 +
init-scripts/init.freebsd | 81 +
init-scripts/init.freenas | 81 +
init-scripts/init.osx | 18 +
init-scripts/init.solaris11 | 47 +
init-scripts/init.systemd | 58 +
init-scripts/init.ubuntu | 209 +
init-scripts/init.upstart | 18 +
installation.md | 91 +
plexpy/__init__.py | 2410 ++++++
plexpy/activity_handler.py | 602 ++
plexpy/activity_pinger.py | 428 +
plexpy/activity_processor.py | 583 ++
plexpy/api2.py | 731 ++
plexpy/classes.py | 67 +
plexpy/common.py | 570 ++
plexpy/config.py | 1024 +++
plexpy/database.py | 214 +
plexpy/datafactory.py | 1857 +++++
plexpy/datatables.py | 282 +
plexpy/exceptions.py | 21 +
plexpy/graphs.py | 1502 ++++
plexpy/helpers.py | 1161 +++
plexpy/http_handler.py | 195 +
plexpy/libraries.py | 1185 +++
plexpy/lock.py | 87 +
plexpy/log_reader.py | 98 +
plexpy/logger.py | 379 +
plexpy/mobile_app.py | 140 +
plexpy/newsletter_handler.py | 216 +
plexpy/newsletters.py | 973 +++
plexpy/notification_handler.py | 1530 ++++
plexpy/notifiers.py | 3979 ++++++++++
plexpy/plexivity_import.py | 448 ++
plexpy/plextv.py | 1194 +++
plexpy/plexwatch_import.py | 441 ++
plexpy/request.py | 326 +
plexpy/servers.py | 3682 +++++++++
plexpy/session.py | 302 +
plexpy/tautulli_import.py | 483 ++
plexpy/users.py | 1005 +++
plexpy/version.py | 2 +
plexpy/versioncheck.py | 464 ++
plexpy/web_socket.py | 283 +
plexpy/webauth.py | 378 +
plexpy/webserve.py | 5970 ++++++++++++++
plexpy/webstart.py | 257 +
pylintrc | 284 +
requirements.in | 44 +
requirements.txt | 212 +
1099 files changed, 104358 insertions(+)
create mode 100644 .gitignore
create mode 100644 API.md
create mode 100644 CHANGELOG.md
create mode 100644 CONTRIBUTING.md
create mode 100644 ISSUE_TEMPLATE.md
create mode 100644 LICENSE
create mode 100644 PlexPy.py
create mode 100644 README.md
create mode 100644 Tautulli.py
create mode 100644 contrib/clean_pyc.sh
create mode 100644 contrib/downgrade.sh
create mode 100644 data/interfaces/default/app_import.html
create mode 100644 data/interfaces/default/base.html
create mode 100644 data/interfaces/default/configuration_table.html
create mode 100644 data/interfaces/default/css/bootstrap-wizard.css
create mode 100644 data/interfaces/default/css/bootstrap3/bootstrap.css
create mode 100644 data/interfaces/default/css/bootstrap3/bootstrap.css.map
create mode 100644 data/interfaces/default/css/bootstrap3/bootstrap.min.css
create mode 100644 data/interfaces/default/css/dataTables.bootstrap.css
create mode 100644 data/interfaces/default/css/dataTables.colVis.css
create mode 100644 data/interfaces/default/css/font-awesome.all.min.css
create mode 100644 data/interfaces/default/css/font-awesome.v4-shims.min.css
create mode 100644 data/interfaces/default/css/jquery-ui.min.css
create mode 100644 data/interfaces/default/css/jquery.dataTables.css
create mode 100644 data/interfaces/default/css/jquery.scrollbar.css
create mode 100644 data/interfaces/default/css/opensans.min.css
create mode 100644 data/interfaces/default/css/pnotify.custom.min.css
create mode 100644 data/interfaces/default/css/selectize.bootstrap3.css
create mode 100644 data/interfaces/default/css/selectize.min.css
create mode 100644 data/interfaces/default/css/tautulli-dataTables.css
create mode 100644 data/interfaces/default/css/tautulli.css
create mode 100644 data/interfaces/default/current_activity_header.html
create mode 100644 data/interfaces/default/current_activity_instance.html
create mode 100644 data/interfaces/default/edit_library.html
create mode 100644 data/interfaces/default/edit_user.html
create mode 100644 data/interfaces/default/fonts/Open-Sans-600/LICENSE.txt
create mode 100644 data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.eot
create mode 100644 data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.svg
create mode 100644 data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.ttf
create mode 100644 data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.woff
create mode 100644 data/interfaces/default/fonts/Open-Sans-600/Open-Sans-600.woff2
create mode 100644 data/interfaces/default/fonts/Open-Sans-regular/LICENSE.txt
create mode 100644 data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.eot
create mode 100644 data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.svg
create mode 100644 data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.ttf
create mode 100644 data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.woff
create mode 100644 data/interfaces/default/fonts/Open-Sans-regular/Open-Sans-regular.woff2
create mode 100644 data/interfaces/default/fonts/bootstrap3/glyphicons-halflings-regular.eot
create mode 100644 data/interfaces/default/fonts/bootstrap3/glyphicons-halflings-regular.svg
create mode 100644 data/interfaces/default/fonts/bootstrap3/glyphicons-halflings-regular.ttf
create mode 100644 data/interfaces/default/fonts/bootstrap3/glyphicons-halflings-regular.woff
create mode 100644 data/interfaces/default/fonts/bootstrap3/glyphicons-halflings-regular.woff2
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-brands-400.eot
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-brands-400.svg
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-brands-400.ttf
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-brands-400.woff
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-brands-400.woff2
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-regular-400.eot
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-regular-400.svg
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-regular-400.ttf
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-regular-400.woff
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-regular-400.woff2
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-solid-900.eot
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-solid-900.svg
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-solid-900.ttf
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-solid-900.woff
create mode 100644 data/interfaces/default/fonts/font-awesome/fa-solid-900.woff2
create mode 100644 data/interfaces/default/graphs.html
create mode 100644 data/interfaces/default/history.html
create mode 100644 data/interfaces/default/history_table_modal.html
create mode 100644 data/interfaces/default/home_stats.html
create mode 100644 data/interfaces/default/images/13AD46AC.png
create mode 100644 data/interfaces/default/images/13AD46AD.png
create mode 100644 data/interfaces/default/images/93124B54.png
create mode 100644 data/interfaces/default/images/93124B55.png
create mode 100644 data/interfaces/default/images/art-live.png
create mode 100644 data/interfaces/default/images/art.png
create mode 100644 data/interfaces/default/images/background.png
create mode 100644 data/interfaces/default/images/become_a_patron_button.png
create mode 100644 data/interfaces/default/images/chevron.png
create mode 100644 data/interfaces/default/images/cover.png
create mode 100644 data/interfaces/default/images/discord-overlay.png
create mode 100644 data/interfaces/default/images/en-play-badge.png
create mode 100644 data/interfaces/default/images/favicon/android-chrome-192x192.png
create mode 100644 data/interfaces/default/images/favicon/android-chrome-256x256.png
create mode 100644 data/interfaces/default/images/favicon/apple-touch-icon-precomposed.png
create mode 100644 data/interfaces/default/images/favicon/apple-touch-icon.png
create mode 100644 data/interfaces/default/images/favicon/browserconfig.xml
create mode 100644 data/interfaces/default/images/favicon/favicon-16x16.png
create mode 100644 data/interfaces/default/images/favicon/favicon-32x32.png
create mode 100644 data/interfaces/default/images/favicon/favicon.ico
create mode 100644 data/interfaces/default/images/favicon/manifest.json
create mode 100644 data/interfaces/default/images/favicon/mstile-150x150.png
create mode 100644 data/interfaces/default/images/favicon/safari-pinned-tab.svg
create mode 100644 data/interfaces/default/images/gold-rect-paypal-34px.png
create mode 100644 data/interfaces/default/images/gravatar-default-80x80.png
create mode 100644 data/interfaces/default/images/gravatar-default.png
create mode 100644 data/interfaces/default/images/libraries/artist.png
create mode 100644 data/interfaces/default/images/libraries/artist.svg
create mode 100644 data/interfaces/default/images/libraries/movie.png
create mode 100644 data/interfaces/default/images/libraries/movie.svg
create mode 100644 data/interfaces/default/images/libraries/photo.png
create mode 100644 data/interfaces/default/images/libraries/photo.svg
create mode 100644 data/interfaces/default/images/libraries/playlist.png
create mode 100644 data/interfaces/default/images/libraries/playlist.svg
create mode 100644 data/interfaces/default/images/libraries/show.png
create mode 100644 data/interfaces/default/images/libraries/show.svg
create mode 100644 data/interfaces/default/images/libraries/video.png
create mode 100644 data/interfaces/default/images/libraries/video.svg
create mode 100644 data/interfaces/default/images/logo-circle.png
create mode 100644 data/interfaces/default/images/logo-tautulli-100.png
create mode 100644 data/interfaces/default/images/logo-tautulli-45.png
create mode 100644 data/interfaces/default/images/logo-tautulli-newsletter.png
create mode 100644 data/interfaces/default/images/logo-tautulli.png
create mode 100644 data/interfaces/default/images/logo-tautulli.svg
create mode 100644 data/interfaces/default/images/logo.png
create mode 100644 data/interfaces/default/images/logo.svg
create mode 100644 data/interfaces/default/images/logo_tray-update.ico
create mode 100644 data/interfaces/default/images/logo_tray.ico
create mode 100644 data/interfaces/default/images/media_flags/aspect_ratio/1.33.png
create mode 100644 data/interfaces/default/images/media_flags/aspect_ratio/1.66.png
create mode 100644 data/interfaces/default/images/media_flags/aspect_ratio/1.78.png
create mode 100644 data/interfaces/default/images/media_flags/aspect_ratio/1.85.png
create mode 100644 data/interfaces/default/images/media_flags/aspect_ratio/2.20.png
create mode 100644 data/interfaces/default/images/media_flags/aspect_ratio/2.25.png
create mode 100644 data/interfaces/default/images/media_flags/aspect_ratio/2.35.png
create mode 100644 data/interfaces/default/images/media_flags/audio_channels/1.png
create mode 100644 data/interfaces/default/images/media_flags/audio_channels/2.png
create mode 100644 data/interfaces/default/images/media_flags/audio_channels/5.png
create mode 100644 data/interfaces/default/images/media_flags/audio_channels/6.png
create mode 100644 data/interfaces/default/images/media_flags/audio_channels/7.png
create mode 100644 data/interfaces/default/images/media_flags/audio_channels/8.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/aac.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/aif.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/aifc.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/aiff.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/alac.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/ape.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/cdda.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/dca-ma.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/dolby_digital.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/dolby_truehd.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/dts.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/eac3.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/flac.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/m4a.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/mlp.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/mp2.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/mp3.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/mpc.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/ogg.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/pcm.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/ra.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/shn.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/wav.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/wave.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/wma.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/wmahd.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/wmapro.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/wmav2.png
create mode 100644 data/interfaces/default/images/media_flags/audio_codec/wv.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/G.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/NC-17.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/NR.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/Not Rated.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/PG-13.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/PG.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/R.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/TV-14.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/TV-G.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/TV-MA.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/TV-PG.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/TV-Y.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/TV-Y7-FV.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/TV-Y7.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/Unrated.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/X.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/E.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/G.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/M.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/MA15+.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/MA15.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/PG.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/R18+.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/R18.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/X18+.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/au/X18.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/ca/14A.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/ca/18A.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/ca/E.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/ca/G.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/ca/PG.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/ca/R.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/de/0.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/de/12.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/de/16.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/de/18.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/de/6.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/fr/-10.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/fr/-12.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/fr/-16.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/fr/-18.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/fr/Tout Public.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/fr/U.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/gb/12.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/gb/12A.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/gb/15.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/gb/18.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/gb/PG.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/gb/R18.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/gb/U.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/nl/12.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/nl/16.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/nl/6.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/nl/9.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/nl/AL.png
create mode 100644 data/interfaces/default/images/media_flags/content_rating/nl/Alle Leeftijden.png
create mode 100644 data/interfaces/default/images/media_flags/studio/1492_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/20th_century_fox.png
create mode 100644 data/interfaces/default/images/media_flags/studio/20th_century_fox_animation.png
create mode 100644 data/interfaces/default/images/media_flags/studio/2929.png
create mode 100644 data/interfaces/default/images/media_flags/studio/360_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/40_acres.png
create mode 100644 data/interfaces/default/images/media_flags/studio/57_irving.png
create mode 100644 data/interfaces/default/images/media_flags/studio/777_film_corp.png
create mode 100644 data/interfaces/default/images/media_flags/studio/a24.png
create mode 100644 data/interfaces/default/images/media_flags/studio/a_1_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/a_and_e.png
create mode 100644 data/interfaces/default/images/media_flags/studio/aardman.png
create mode 100644 data/interfaces/default/images/media_flags/studio/abandon.png
create mode 100644 data/interfaces/default/images/media_flags/studio/abc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/abc_australia.png
create mode 100644 data/interfaces/default/images/media_flags/studio/abc_family.png
create mode 100644 data/interfaces/default/images/media_flags/studio/actf.png
create mode 100644 data/interfaces/default/images/media_flags/studio/adult_swim.png
create mode 100644 data/interfaces/default/images/media_flags/studio/afi.png
create mode 100644 data/interfaces/default/images/media_flags/studio/after_dark.png
create mode 100644 data/interfaces/default/images/media_flags/studio/aic.png
create mode 100644 data/interfaces/default/images/media_flags/studio/alcon_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/alfred_hitchcock_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/alliance.png
create mode 100644 data/interfaces/default/images/media_flags/studio/alloy.png
create mode 100644 data/interfaces/default/images/media_flags/studio/alphaville.png
create mode 100644 data/interfaces/default/images/media_flags/studio/amazon_studios.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ambience.png
create mode 100644 data/interfaces/default/images/media_flags/studio/amblin_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/amc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/american_masters.png
create mode 100644 data/interfaces/default/images/media_flags/studio/american_zoetrope.png
create mode 100644 data/interfaces/default/images/media_flags/studio/anchor_bay_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/animal_planet.png
create mode 100644 data/interfaces/default/images/media_flags/studio/animax.png
create mode 100644 data/interfaces/default/images/media_flags/studio/anonymous_content.png
create mode 100644 data/interfaces/default/images/media_flags/studio/antena_3.png
create mode 100644 data/interfaces/default/images/media_flags/studio/apatow_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/apple.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ard.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ark.png
create mode 100644 data/interfaces/default/images/media_flags/studio/arte.png
create mode 100644 data/interfaces/default/images/media_flags/studio/artisan_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/aspen_film_society.png
create mode 100644 data/interfaces/default/images/media_flags/studio/atom_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/audience_network.png
create mode 100644 data/interfaces/default/images/media_flags/studio/australian_film_commission.png
create mode 100644 data/interfaces/default/images/media_flags/studio/avalanche_studios.png
create mode 100644 data/interfaces/default/images/media_flags/studio/avnet_kerner.png
create mode 100644 data/interfaces/default/images/media_flags/studio/babylonian.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bad_boy_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bad_robot.png
create mode 100644 data/interfaces/default/images/media_flags/studio/baltimore_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bandai.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bandai_visual.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bandapart.png
create mode 100644 data/interfaces/default/images/media_flags/studio/batjac.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bazmark.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bbc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bbc_america.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bbc_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bbc_four.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bbc_one.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bbc_prime.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bbc_three.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bbc_two.png
create mode 100644 data/interfaces/default/images/media_flags/studio/beacon.png
create mode 100644 data/interfaces/default/images/media_flags/studio/becker_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/belair_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bet.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bigtalk.png
create mode 100644 data/interfaces/default/images/media_flags/studio/biography_channel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/black_bear_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/blackdog.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bleecker_street.png
create mode 100644 data/interfaces/default/images/media_flags/studio/blind_ambition_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/blizzard_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/blue_sky.png
create mode 100644 data/interfaces/default/images/media_flags/studio/blue_sky_studios.png
create mode 100644 data/interfaces/default/images/media_flags/studio/blue_underground.png
create mode 100644 data/interfaces/default/images/media_flags/studio/blumhouse_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bnn.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bold_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/boomerang.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bravo.png
create mode 100644 data/interfaces/default/images/media_flags/studio/brightlight.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bristol_bay.png
create mode 100644 data/interfaces/default/images/media_flags/studio/broken_lizard.png
create mode 100644 data/interfaces/default/images/media_flags/studio/brooklyn_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/buena_vista.png
create mode 100644 data/interfaces/default/images/media_flags/studio/bulletproof.png
create mode 100644 data/interfaces/default/images/media_flags/studio/c2_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/canalplus.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cannon_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/capcom.png
create mode 100644 data/interfaces/default/images/media_flags/studio/capitol_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/caravan_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/carnaby.png
create mode 100644 data/interfaces/default/images/media_flags/studio/carolco.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cartoonnetwork.png
create mode 100644 data/interfaces/default/images/media_flags/studio/casablanca_filmes.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cascade_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/casey_silver_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/castle_rock_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cat_in_the_hat.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cbbc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cbc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cbs.png
create mode 100644 data/interfaces/default/images/media_flags/studio/celador.png
create mode 100644 data/interfaces/default/images/media_flags/studio/centropolis_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ceska_televize.png
create mode 100644 data/interfaces/default/images/media_flags/studio/channel4.png
create mode 100644 data/interfaces/default/images/media_flags/studio/channel5.png
create mode 100644 data/interfaces/default/images/media_flags/studio/channel_nine.png
create mode 100644 data/interfaces/default/images/media_flags/studio/channel_seven.png
create mode 100644 data/interfaces/default/images/media_flags/studio/channel_ten.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cheyenne.png
create mode 100644 data/interfaces/default/images/media_flags/studio/chiller.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cinemax.png
create mode 100644 data/interfaces/default/images/media_flags/studio/city.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cmt.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cnc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/columbia_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/comedy_central.png
create mode 100644 data/interfaces/default/images/media_flags/studio/concorde.png
create mode 100644 data/interfaces/default/images/media_flags/studio/condemned.png
create mode 100644 data/interfaces/default/images/media_flags/studio/constantin_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/constellation.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cookie_jar.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cpfilms.png
create mode 100644 data/interfaces/default/images/media_flags/studio/crackle.png
create mode 100644 data/interfaces/default/images/media_flags/studio/criterion.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ctv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cw.png
create mode 100644 data/interfaces/default/images/media_flags/studio/cw_seed.png
create mode 100644 data/interfaces/default/images/media_flags/studio/czolowka.png
create mode 100644 data/interfaces/default/images/media_flags/studio/damselfly.png
create mode 100644 data/interfaces/default/images/media_flags/studio/danjaq.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dark_castle_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dark_horse.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dave.png
create mode 100644 data/interfaces/default/images/media_flags/studio/davis_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/de_laurentiis.png
create mode 100644 data/interfaces/default/images/media_flags/studio/defa.png
create mode 100644 data/interfaces/default/images/media_flags/studio/destination_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dfi.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dickhouse_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/digital_factory.png
create mode 100644 data/interfaces/default/images/media_flags/studio/digital_playground.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dimension_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/discovery_channel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/disney_channel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/disney_xd.png
create mode 100644 data/interfaces/default/images/media_flags/studio/distant_horizon.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dmax.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dna.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dolores_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/don_simpson_jerry_bruckheimer_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/donners.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dreamworks.png
create mode 100644 data/interfaces/default/images/media_flags/studio/dreamworks_animation.png
create mode 100644 data/interfaces/default/images/media_flags/studio/e4.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ealing.png
create mode 100644 data/interfaces/default/images/media_flags/studio/eclectic.png
create mode 100644 data/interfaces/default/images/media_flags/studio/edmonds_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/el_rey_network.png
create mode 100644 data/interfaces/default/images/media_flags/studio/electric_enterteinment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/electric_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/eleven_eleven.png
create mode 100644 data/interfaces/default/images/media_flags/studio/emi.png
create mode 100644 data/interfaces/default/images/media_flags/studio/emmedia.png
create mode 100644 data/interfaces/default/images/media_flags/studio/encore.png
create mode 100644 data/interfaces/default/images/media_flags/studio/endgame_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/entara.png
create mode 100644 data/interfaces/default/images/media_flags/studio/entertainment_one.png
create mode 100644 data/interfaces/default/images/media_flags/studio/entertainment_television.png
create mode 100644 data/interfaces/default/images/media_flags/studio/eon_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/epix.png
create mode 100644 data/interfaces/default/images/media_flags/studio/escape_artists.png
create mode 100644 data/interfaces/default/images/media_flags/studio/espn.png
create mode 100644 data/interfaces/default/images/media_flags/studio/eurimages.png
create mode 100644 data/interfaces/default/images/media_flags/studio/europa_corp.png
create mode 100644 data/interfaces/default/images/media_flags/studio/eurosport.png
create mode 100644 data/interfaces/default/images/media_flags/studio/excel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/eyekiss_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fact.png
create mode 100644 data/interfaces/default/images/media_flags/studio/figaro.png
create mode 100644 data/interfaces/default/images/media_flags/studio/film_colony.png
create mode 100644 data/interfaces/default/images/media_flags/studio/film_four.png
create mode 100644 data/interfaces/default/images/media_flags/studio/film_institut.png
create mode 100644 data/interfaces/default/images/media_flags/studio/film_media.png
create mode 100644 data/interfaces/default/images/media_flags/studio/film_polski.png
create mode 100644 data/interfaces/default/images/media_flags/studio/film_tv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/filmauro.png
create mode 100644 data/interfaces/default/images/media_flags/studio/filmax_animation.png
create mode 100644 data/interfaces/default/images/media_flags/studio/filmforderung_hamburg.png
create mode 100644 data/interfaces/default/images/media_flags/studio/filmoteka narodowa.png
create mode 100644 data/interfaces/default/images/media_flags/studio/filmstiftung_nordrhein-westfalen.png
create mode 100644 data/interfaces/default/images/media_flags/studio/finos_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fireworks_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/first_look_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/five.png
create mode 100644 data/interfaces/default/images/media_flags/studio/flower_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/focus_features.png
create mode 100644 data/interfaces/default/images/media_flags/studio/food_network.png
create mode 100644 data/interfaces/default/images/media_flags/studio/forte_cinema.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fourhands_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fox.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fox_atomic.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fox_kids.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fox_searchlight_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/france_2.png
create mode 100644 data/interfaces/default/images/media_flags/studio/france_3.png
create mode 100644 data/interfaces/default/images/media_flags/studio/france_4.png
create mode 100644 data/interfaces/default/images/media_flags/studio/franchise_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/freeform.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fuji_tv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/future_flix.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fx.png
create mode 100644 data/interfaces/default/images/media_flags/studio/fxx.png
create mode 100644 data/interfaces/default/images/media_flags/studio/g4.png
create mode 100644 data/interfaces/default/images/media_flags/studio/gaumont.png
create mode 100644 data/interfaces/default/images/media_flags/studio/geffen.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ghost_house.png
create mode 100644 data/interfaces/default/images/media_flags/studio/gk_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/glass_eye_pix.png
create mode 100644 data/interfaces/default/images/media_flags/studio/global_tv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/glue_works_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/gofilms.png
create mode 100644 data/interfaces/default/images/media_flags/studio/gold_circle_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/goldwyn.png
create mode 100644 data/interfaces/default/images/media_flags/studio/gracie_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/gramercy_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/grandhustle.png
create mode 100644 data/interfaces/default/images/media_flags/studio/green_street.png
create mode 100644 data/interfaces/default/images/media_flags/studio/greentree_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/grub_street_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/guinea_pig_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/gutek.png
create mode 100644 data/interfaces/default/images/media_flags/studio/halestorm.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hallmark_channel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hallucination_on_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hand_made_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/happy_madison.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hasbro.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hbo.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hbo_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/head_gear_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hemus_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/heyday_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hgtv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/history_channel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hollywood_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hopscotch_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hulu.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hustler_video.png
create mode 100644 data/interfaces/default/images/media_flags/studio/hyde_park_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/icon_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ifc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/illumination_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/image.png
create mode 100644 data/interfaces/default/images/media_flags/studio/image_movers.png
create mode 100644 data/interfaces/default/images/media_flags/studio/imagi_studios.png
create mode 100644 data/interfaces/default/images/media_flags/studio/imaginary_forces.png
create mode 100644 data/interfaces/default/images/media_flags/studio/imagine.png
create mode 100644 data/interfaces/default/images/media_flags/studio/imax.png
create mode 100644 data/interfaces/default/images/media_flags/studio/imperial_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/independent_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/industrial_light_and_magic.png
create mode 100644 data/interfaces/default/images/media_flags/studio/infilm.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ingenious_film_partners.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ingenius_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/inside_track.png
create mode 100644 data/interfaces/default/images/media_flags/studio/insurge_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/interactual.png
create mode 100644 data/interfaces/default/images/media_flags/studio/intermedia.png
create mode 100644 data/interfaces/default/images/media_flags/studio/interscope_shady_aftermath.png
create mode 100644 data/interfaces/default/images/media_flags/studio/intrepid_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/island_world.png
create mode 100644 data/interfaces/default/images/media_flags/studio/itv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/janus.png
create mode 100644 data/interfaces/default/images/media_flags/studio/jarowskij.png
create mode 100644 data/interfaces/default/images/media_flags/studio/jawa.png
create mode 100644 data/interfaces/default/images/media_flags/studio/jerry_bruckheimer_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/jersey_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/jim_henson.png
create mode 100644 data/interfaces/default/images/media_flags/studio/jj_splice.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kaboom_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kadokawa_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kadr.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kamera.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kanal_5.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kennedymarshall.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kid_rhino.png
create mode 100644 data/interfaces/default/images/media_flags/studio/killer_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kinepolis.png
create mode 100644 data/interfaces/default/images/media_flags/studio/king_world.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kinowelt.png
create mode 100644 data/interfaces/default/images/media_flags/studio/konami.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kopelson.png
create mode 100644 data/interfaces/default/images/media_flags/studio/kyoto_animation.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ladd.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lakeshore_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/latham.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lawrence_bender_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/league of noble peers.png
create mode 100644 data/interfaces/default/images/media_flags/studio/legendary_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lego.png
create mode 100644 data/interfaces/default/images/media_flags/studio/liberty_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lifetime.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lift.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lightstorm_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lionsgate.png
create mode 100644 data/interfaces/default/images/media_flags/studio/little_chicken.png
create mode 100644 data/interfaces/default/images/media_flags/studio/london_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lookout.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lucasfilm.png
create mode 100644 data/interfaces/default/images/media_flags/studio/lucky_7.png
create mode 100644 data/interfaces/default/images/media_flags/studio/m6.png
create mode 100644 data/interfaces/default/images/media_flags/studio/madhouse.png
create mode 100644 data/interfaces/default/images/media_flags/studio/madman.png
create mode 100644 data/interfaces/default/images/media_flags/studio/magnolia_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mandalay_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mandate_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/manga.png
create mode 100644 data/interfaces/default/images/media_flags/studio/marc_dorcel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/marvel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/maverick.png
create mode 100644 data/interfaces/default/images/media_flags/studio/maya_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mbs.png
create mode 100644 data/interfaces/default/images/media_flags/studio/media8.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mediapro.png
create mode 100644 data/interfaces/default/images/media_flags/studio/meridian_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mgm.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mibac.png
create mode 100644 data/interfaces/default/images/media_flags/studio/midway_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mike_zoss_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/milkshake.png
create mode 100644 data/interfaces/default/images/media_flags/studio/millennium_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/minds_eye_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mirage.png
create mode 100644 data/interfaces/default/images/media_flags/studio/miramax.png
create mode 100644 data/interfaces/default/images/media_flags/studio/momentum_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/monarch_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/monolith.png
create mode 100644 data/interfaces/default/images/media_flags/studio/montecito_picture_company.png
create mode 100644 data/interfaces/default/images/media_flags/studio/morgan_creek.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mosaic_media.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mosfilm.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mpca.png
create mode 100644 data/interfaces/default/images/media_flags/studio/msnbc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mtv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mtv3.png
create mode 100644 data/interfaces/default/images/media_flags/studio/musashi_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mutual_film_company.png
create mode 100644 data/interfaces/default/images/media_flags/studio/myriad.png
create mode 100644 data/interfaces/default/images/media_flags/studio/mytv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nala.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nat_geo_wild.png
create mode 100644 data/interfaces/default/images/media_flags/studio/national_general_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nbc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nbc_universal.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nelvana.png
create mode 100644 data/interfaces/default/images/media_flags/studio/netflix.png
create mode 100644 data/interfaces/default/images/media_flags/studio/new_deal_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/new_line_cinema.png
create mode 100644 data/interfaces/default/images/media_flags/studio/new_zealand_film_commission.png
create mode 100644 data/interfaces/default/images/media_flags/studio/newmarket.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ngc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nick_at_nite.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nick_jr.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nickelodeon.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nicktoons.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nine network.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nord_ouest.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nordisk film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/northern_lights_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nothing.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nrk1.png
create mode 100644 data/interfaces/default/images/media_flags/studio/nuimage.png
create mode 100644 data/interfaces/default/images/media_flags/studio/o2_filmes.png
create mode 100644 data/interfaces/default/images/media_flags/studio/oddlot.png
create mode 100644 data/interfaces/default/images/media_flags/studio/oko.png
create mode 100644 data/interfaces/default/images/media_flags/studio/only_vegas.png
create mode 100644 data/interfaces/default/images/media_flags/studio/oprah_winfrey_network.png
create mode 100644 data/interfaces/default/images/media_flags/studio/orf.png
create mode 100644 data/interfaces/default/images/media_flags/studio/orion.png
create mode 100644 data/interfaces/default/images/media_flags/studio/overturefilms.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pa_works.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pan_vision.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pandora_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/paramount_classics.png
create mode 100644 data/interfaces/default/images/media_flags/studio/paramount_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/paramount_vantage.png
create mode 100644 data/interfaces/default/images/media_flags/studio/participant.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pathe.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pbs.png
create mode 100644 data/interfaces/default/images/media_flags/studio/peacearch.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pecf.png
create mode 100644 data/interfaces/default/images/media_flags/studio/peters_entertainment2.png
create mode 100644 data/interfaces/default/images/media_flags/studio/phase_4_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pheonix.png
create mode 100644 data/interfaces/default/images/media_flags/studio/picturehouse.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pisf.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pixar.png
create mode 100644 data/interfaces/default/images/media_flags/studio/plan_b.png
create mode 100644 data/interfaces/default/images/media_flags/studio/platige.png
create mode 100644 data/interfaces/default/images/media_flags/studio/platinum_dunes.png
create mode 100644 data/interfaces/default/images/media_flags/studio/play_uk.png
create mode 100644 data/interfaces/default/images/media_flags/studio/playstation_network.png
create mode 100644 data/interfaces/default/images/media_flags/studio/playtone.png
create mode 100644 data/interfaces/default/images/media_flags/studio/polsat.png
create mode 100644 data/interfaces/default/images/media_flags/studio/polygram.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pop.png
create mode 100644 data/interfaces/default/images/media_flags/studio/porchlight.png
create mode 100644 data/interfaces/default/images/media_flags/studio/portman_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/premiere direkt.png
create mode 100644 data/interfaces/default/images/media_flags/studio/premiere.png
create mode 100644 data/interfaces/default/images/media_flags/studio/private_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/pro7.png
create mode 100644 data/interfaces/default/images/media_flags/studio/production_i_g.png
create mode 100644 data/interfaces/default/images/media_flags/studio/profilm_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/promotion_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/prosieben.png
create mode 100644 data/interfaces/default/images/media_flags/studio/radical_media.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rai_cinema.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rankin.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ratpac_dune_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ratpac_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/red_hour.png
create mode 100644 data/interfaces/default/images/media_flags/studio/red_wagon_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/redrum.png
create mode 100644 data/interfaces/default/images/media_flags/studio/reel_dog_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/regency.png
create mode 100644 data/interfaces/default/images/media_flags/studio/relativity_media.png
create mode 100644 data/interfaces/default/images/media_flags/studio/renaissance_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/republic_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/resident_evil.png
create mode 100644 data/interfaces/default/images/media_flags/studio/revere_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/revision3.png
create mode 100644 data/interfaces/default/images/media_flags/studio/revolution_studios.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rhombus.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rick_mill.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rickety_shack_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/river_road_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rko_radio_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/roadside_attractions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rogue_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/romar.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rte_one.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rtl.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rtl4.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rtl5.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rtl7.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rtl8.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rtl_ii.png
create mode 100644 data/interfaces/default/images/media_flags/studio/rysher_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/saban.png
create mode 100644 data/interfaces/default/images/media_flags/studio/salter_street_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sandrew.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sat1.png
create mode 100644 data/interfaces/default/images/media_flags/studio/saturn_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/saul_zaentz.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sbs.png
create mode 100644 data/interfaces/default/images/media_flags/studio/scholastic.png
create mode 100644 data/interfaces/default/images/media_flags/studio/scifi.png
create mode 100644 data/interfaces/default/images/media_flags/studio/scott_free.png
create mode 100644 data/interfaces/default/images/media_flags/studio/screen_australia.png
create mode 100644 data/interfaces/default/images/media_flags/studio/screen_gems.png
create mode 100644 data/interfaces/default/images/media_flags/studio/seeso.png
create mode 100644 data/interfaces/default/images/media_flags/studio/selznick_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/semafor.png
create mode 100644 data/interfaces/default/images/media_flags/studio/seven network.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sfi.png
create mode 100644 data/interfaces/default/images/media_flags/studio/shady_acres_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/shaft.png
create mode 100644 data/interfaces/default/images/media_flags/studio/shangri-la_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/shout_factory.png
create mode 100644 data/interfaces/default/images/media_flags/studio/showcase.png
create mode 100644 data/interfaces/default/images/media_flags/studio/showcase_au.png
create mode 100644 data/interfaces/default/images/media_flags/studio/showtime.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sidney_kimmel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/silver_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sky.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sky_1.png
create mode 100644 data/interfaces/default/images/media_flags/studio/skydance_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/slim_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/smc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/snl_studios.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sobini_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sony.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sony_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sony_pictures_animation.png
create mode 100644 data/interfaces/default/images/media_flags/studio/space.png
create mode 100644 data/interfaces/default/images/media_flags/studio/spelling_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/spike.png
create mode 100644 data/interfaces/default/images/media_flags/studio/spitfire_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/splendid.png
create mode 100644 data/interfaces/default/images/media_flags/studio/spyglass_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/squareenix.png
create mode 100644 data/interfaces/default/images/media_flags/studio/stage6.png
create mode 100644 data/interfaces/default/images/media_flags/studio/stan.png
create mode 100644 data/interfaces/default/images/media_flags/studio/starbucks_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/starz.png
create mode 100644 data/interfaces/default/images/media_flags/studio/steele.png
create mode 100644 data/interfaces/default/images/media_flags/studio/storyline.png
create mode 100644 data/interfaces/default/images/media_flags/studio/studio_canal.png
create mode 100644 data/interfaces/default/images/media_flags/studio/studio_ghibli.png
create mode 100644 data/interfaces/default/images/media_flags/studio/summit.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sundancetv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/sunrise.png
create mode 100644 data/interfaces/default/images/media_flags/studio/super_channel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/svensk_filmindustri.png
create mode 100644 data/interfaces/default/images/media_flags/studio/svt.png
create mode 100644 data/interfaces/default/images/media_flags/studio/svt1.png
create mode 100644 data/interfaces/default/images/media_flags/studio/svt2.png
create mode 100644 data/interfaces/default/images/media_flags/studio/syfy.png
create mode 100644 data/interfaces/default/images/media_flags/studio/syncopy.png
create mode 100644 data/interfaces/default/images/media_flags/studio/syrena.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tandem.png
create mode 100644 data/interfaces/default/images/media_flags/studio/taurus_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tbs.png
create mode 100644 data/interfaces/default/images/media_flags/studio/telecinco.png
create mode 100644 data/interfaces/default/images/media_flags/studio/telemundo.png
create mode 100644 data/interfaces/default/images/media_flags/studio/teletoon.png
create mode 100644 data/interfaces/default/images/media_flags/studio/telos.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tf1.png
create mode 100644 data/interfaces/default/images/media_flags/studio/the_cw.png
create mode 100644 data/interfaces/default/images/media_flags/studio/the_entertainment_group.png
create mode 100644 data/interfaces/default/images/media_flags/studio/the_film_foundry.png
create mode 100644 data/interfaces/default/images/media_flags/studio/the_hub.png
create mode 100644 data/interfaces/default/images/media_flags/studio/the_independent_film_channel.png
create mode 100644 data/interfaces/default/images/media_flags/studio/the_wb.png
create mode 100644 data/interfaces/default/images/media_flags/studio/the_wb_television_network.png
create mode 100644 data/interfaces/default/images/media_flags/studio/thierry_mugler.png
create mode 100644 data/interfaces/default/images/media_flags/studio/think_film.png
create mode 100644 data/interfaces/default/images/media_flags/studio/this_is_that.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tlc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tnt.png
create mode 100644 data/interfaces/default/images/media_flags/studio/toho.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tor.png
create mode 100644 data/interfaces/default/images/media_flags/studio/touchstone.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tristar_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/trutv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/turner.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tv2.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tv3.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tv4.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tv_2.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tv_land.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tv_tokyo.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tvn.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tvnz.png
create mode 100644 data/interfaces/default/images/media_flags/studio/tvp.png
create mode 100644 data/interfaces/default/images/media_flags/studio/twisted_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/twit.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ugc.png
create mode 100644 data/interfaces/default/images/media_flags/studio/uk_film_council.png
create mode 100644 data/interfaces/default/images/media_flags/studio/united_artists.png
create mode 100644 data/interfaces/default/images/media_flags/studio/universal.png
create mode 100644 data/interfaces/default/images/media_flags/studio/univision.png
create mode 100644 data/interfaces/default/images/media_flags/studio/up_tv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/upn.png
create mode 100644 data/interfaces/default/images/media_flags/studio/usa_network.png
create mode 100644 data/interfaces/default/images/media_flags/studio/vara.png
create mode 100644 data/interfaces/default/images/media_flags/studio/versus.png
create mode 100644 data/interfaces/default/images/media_flags/studio/vertigo.png
create mode 100644 data/interfaces/default/images/media_flags/studio/vh1.png
create mode 100644 data/interfaces/default/images/media_flags/studio/viacom.png
create mode 100644 data/interfaces/default/images/media_flags/studio/view_askew.png
create mode 100644 data/interfaces/default/images/media_flags/studio/village_roadshow_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/vimeo.png
create mode 100644 data/interfaces/default/images/media_flags/studio/virtual_studios.png
create mode 100644 data/interfaces/default/images/media_flags/studio/vital_film_works.png
create mode 100644 data/interfaces/default/images/media_flags/studio/viz.png
create mode 100644 data/interfaces/default/images/media_flags/studio/vortex_entertainment.png
create mode 100644 data/interfaces/default/images/media_flags/studio/vox.png
create mode 100644 data/interfaces/default/images/media_flags/studio/vpro.png
create mode 100644 data/interfaces/default/images/media_flags/studio/vtm.png
create mode 100644 data/interfaces/default/images/media_flags/studio/walden_media.png
create mode 100644 data/interfaces/default/images/media_flags/studio/walt_disney_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/warner_bros.png
create mode 100644 data/interfaces/default/images/media_flags/studio/warner_bros_animation.png
create mode 100644 data/interfaces/default/images/media_flags/studio/warner_independent_pictures.png
create mode 100644 data/interfaces/default/images/media_flags/studio/water_walk_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/wdr.png
create mode 100644 data/interfaces/default/images/media_flags/studio/we_tv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/weinstein_company.png
create mode 100644 data/interfaces/default/images/media_flags/studio/wfdif.png
create mode 100644 data/interfaces/default/images/media_flags/studio/wgn.png
create mode 100644 data/interfaces/default/images/media_flags/studio/wild_bunch.png
create mode 100644 data/interfaces/default/images/media_flags/studio/wild_side.png
create mode 100644 data/interfaces/default/images/media_flags/studio/working_title_films.png
create mode 100644 data/interfaces/default/images/media_flags/studio/xfilme.png
create mode 100644 data/interfaces/default/images/media_flags/studio/xxx_productions.png
create mode 100644 data/interfaces/default/images/media_flags/studio/yahoo_screen.png
create mode 100644 data/interfaces/default/images/media_flags/studio/yari_film_group.png
create mode 100644 data/interfaces/default/images/media_flags/studio/youtube.png
create mode 100644 data/interfaces/default/images/media_flags/studio/ytv.png
create mode 100644 data/interfaces/default/images/media_flags/studio/zaloom_mayfield.png
create mode 100644 data/interfaces/default/images/media_flags/studio/zdf.png
create mode 100644 data/interfaces/default/images/media_flags/studio/zebra.png
create mode 100644 data/interfaces/default/images/media_flags/studio/zentropa.png
create mode 100644 data/interfaces/default/images/media_flags/studio/zomba.png
create mode 100644 data/interfaces/default/images/media_flags/video_codec/h264.png
create mode 100644 data/interfaces/default/images/media_flags/video_codec/hevc.png
create mode 100644 data/interfaces/default/images/media_flags/video_codec/mpeg1video.png
create mode 100644 data/interfaces/default/images/media_flags/video_codec/mpeg2video.png
create mode 100644 data/interfaces/default/images/media_flags/video_codec/mpeg4.png
create mode 100644 data/interfaces/default/images/media_flags/video_codec/vc1.png
create mode 100644 data/interfaces/default/images/media_flags/video_codec/wmv.png
create mode 100644 data/interfaces/default/images/media_flags/video_codec/wmvhd.png
create mode 100644 data/interfaces/default/images/media_flags/video_framerate/24p.png
create mode 100644 data/interfaces/default/images/media_flags/video_framerate/25p.png
create mode 100644 data/interfaces/default/images/media_flags/video_framerate/50p.png
create mode 100644 data/interfaces/default/images/media_flags/video_framerate/60p.png
create mode 100644 data/interfaces/default/images/media_flags/video_framerate/NTSC.png
create mode 100644 data/interfaces/default/images/media_flags/video_framerate/PAL.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/1080.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/1080i.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/270.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/360.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/432.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/468.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/480.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/480i.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/4k.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/540.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/544.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/576.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/576i.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/720.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/8k.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/hdtv.png
create mode 100644 data/interfaces/default/images/media_flags/video_resolution/sd.png
create mode 100644 data/interfaces/default/images/newsletter/newsletter-header.png
create mode 100644 data/interfaces/default/images/newsletter/view-on-plex-cover.png
create mode 100644 data/interfaces/default/images/newsletter/view-on-plex-flat.png
create mode 100644 data/interfaces/default/images/newsletter/view-on-plex-poster.png
create mode 100644 data/interfaces/default/images/platforms/android.svg
create mode 100644 data/interfaces/default/images/platforms/atv.svg
create mode 100644 data/interfaces/default/images/platforms/chrome.svg
create mode 100644 data/interfaces/default/images/platforms/chromecast.svg
create mode 100644 data/interfaces/default/images/platforms/cloudsync.svg
create mode 100644 data/interfaces/default/images/platforms/default.svg
create mode 100644 data/interfaces/default/images/platforms/dlna.svg
create mode 100644 data/interfaces/default/images/platforms/firefox.svg
create mode 100644 data/interfaces/default/images/platforms/gtv.svg
create mode 100644 data/interfaces/default/images/platforms/ie.svg
create mode 100644 data/interfaces/default/images/platforms/ios.svg
create mode 100644 data/interfaces/default/images/platforms/kodi.svg
create mode 100644 data/interfaces/default/images/platforms/linux.svg
create mode 100644 data/interfaces/default/images/platforms/macos.svg
create mode 100644 data/interfaces/default/images/platforms/msedge.svg
create mode 100644 data/interfaces/default/images/platforms/opera.svg
create mode 100644 data/interfaces/default/images/platforms/playstation.svg
create mode 100644 data/interfaces/default/images/platforms/plex.svg
create mode 100644 data/interfaces/default/images/platforms/plexamp.svg
create mode 100644 data/interfaces/default/images/platforms/roku.svg
create mode 100644 data/interfaces/default/images/platforms/safari.svg
create mode 100644 data/interfaces/default/images/platforms/samsung.svg
create mode 100644 data/interfaces/default/images/platforms/synclounge.svg
create mode 100644 data/interfaces/default/images/platforms/tivo.svg
create mode 100644 data/interfaces/default/images/platforms/wiiu.svg
create mode 100644 data/interfaces/default/images/platforms/windows.svg
create mode 100644 data/interfaces/default/images/platforms/xbox.svg
create mode 100644 data/interfaces/default/images/plex-logo-light-small.png
create mode 100644 data/interfaces/default/images/plex-logo-light.svg
create mode 100644 data/interfaces/default/images/poster-live.png
create mode 100644 data/interfaces/default/images/poster.png
create mode 100644 data/interfaces/default/images/tautulli.png
create mode 100644 data/interfaces/default/images/tautulli.svg
create mode 100644 data/interfaces/default/index.html
create mode 100644 data/interfaces/default/info.html
create mode 100644 data/interfaces/default/info_children_list.html
create mode 100644 data/interfaces/default/info_collection_list.html
create mode 100644 data/interfaces/default/info_search_results_list.html
create mode 100644 data/interfaces/default/ip_address_modal.html
create mode 100644 data/interfaces/default/js/Sortable.min.js
create mode 100644 data/interfaces/default/js/ajaxNotifications.js
create mode 100644 data/interfaces/default/js/bootstrap-hover-dropdown.min.js
create mode 100644 data/interfaces/default/js/bootstrap-wizard.min.js
create mode 100644 data/interfaces/default/js/bootstrap.min.js
create mode 100644 data/interfaces/default/js/dataTables.bootstrap.min.js
create mode 100644 data/interfaces/default/js/dataTables.bootstrap.pagination.js
create mode 100644 data/interfaces/default/js/dataTables.colVis.js
create mode 100644 data/interfaces/default/js/filterer.jquery.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_day.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_dayofweek.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_hourofday.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_month.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_platform.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_platform_by_stream_type.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_source_resolution.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_stream_resolution.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_stream_type.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_user.js
create mode 100644 data/interfaces/default/js/graphs/plays_by_user_by_stream_type.js
create mode 100644 data/interfaces/default/js/highcharts/api/css/font-awesome.css
create mode 100644 data/interfaces/default/js/highcharts/api/css/images/ui-bg_flat_75_ffffff_40x100.png
create mode 100644 data/interfaces/default/js/highcharts/api/css/images/ui-bg_glass_75_dadada_1x400.png
create mode 100644 data/interfaces/default/js/highcharts/api/css/jquery-ui.css
create mode 100644 data/interfaces/default/js/highcharts/api/css/ref.css
create mode 100644 data/interfaces/default/js/highcharts/api/fonts/fontawesome-webfont.woff
create mode 100644 data/interfaces/default/js/highcharts/api/highcharts.html
create mode 100644 data/interfaces/default/js/highcharts/api/images/Highcharts.svg
create mode 100644 data/interfaces/default/js/highcharts/api/images/apple-touch-icon-114x114.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/apple-touch-icon-120x120.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/apple-touch-icon-144x144.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/apple-touch-icon-152x152.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/apple-touch-icon-180x180.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/apple-touch-icon-57x57.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/apple-touch-icon-60x60.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/apple-touch-icon-72x72.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/apple-touch-icon-76x76.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/favicon-160x160.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/favicon-16x16.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/favicon-192x192.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/favicon-32x32.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/favicon-96x96.png
create mode 100644 data/interfaces/default/js/highcharts/api/images/splash.svg
create mode 100644 data/interfaces/default/js/highcharts/api/images/sprite.png
create mode 100644 data/interfaces/default/js/highcharts/api/js/highcharts.json
create mode 100644 data/interfaces/default/js/highcharts/api/js/jquery-ui.min.js
create mode 100644 data/interfaces/default/js/highcharts/api/js/jquery.min.js
create mode 100644 data/interfaces/default/js/highcharts/api/js/ref.js
create mode 100644 data/interfaces/default/js/highcharts/gfx/vml-radial-gradient.png
create mode 100644 data/interfaces/default/js/highcharts/graphics/meteogram-symbols-30px.png
create mode 100644 data/interfaces/default/js/highcharts/graphics/skies.jpg
create mode 100644 data/interfaces/default/js/highcharts/graphics/snow.png
create mode 100644 data/interfaces/default/js/highcharts/graphics/sun.png
create mode 100644 data/interfaces/default/js/highcharts/js/adapters/standalone-framework.js
create mode 100644 data/interfaces/default/js/highcharts/js/adapters/standalone-framework.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/highcharts.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/broken-axis.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/broken-axis.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/canvas-tools.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/canvas-tools.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/data.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/data.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/drilldown.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/drilldown.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/exporting.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/exporting.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/funnel.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/funnel.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/heatmap.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/heatmap.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/no-data-to-display.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/no-data-to-display.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/solid-gauge.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/solid-gauge.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/treemap.js
create mode 100644 data/interfaces/default/js/highcharts/js/modules/treemap.src.js
create mode 100644 data/interfaces/default/js/highcharts/js/themes/dark-blue.js
create mode 100644 data/interfaces/default/js/highcharts/js/themes/dark-green.js
create mode 100644 data/interfaces/default/js/highcharts/js/themes/dark-unica.js
create mode 100644 data/interfaces/default/js/highcharts/js/themes/gray.js
create mode 100644 data/interfaces/default/js/highcharts/js/themes/grid-light.js
create mode 100644 data/interfaces/default/js/highcharts/js/themes/grid.js
create mode 100644 data/interfaces/default/js/highcharts/js/themes/sand-signika.js
create mode 100644 data/interfaces/default/js/highcharts/js/themes/skies.js
create mode 100644 data/interfaces/default/js/ipaddr.min.js
create mode 100644 data/interfaces/default/js/jquery-2.1.4.min.js
create mode 100644 data/interfaces/default/js/jquery-cron-min.js
create mode 100644 data/interfaces/default/js/jquery-ui.min.js
create mode 100644 data/interfaces/default/js/jquery.dataTables.min.js
create mode 100644 data/interfaces/default/js/jquery.mousewheel.min.js
create mode 100644 data/interfaces/default/js/jquery.qrcode.min.js
create mode 100644 data/interfaces/default/js/jquery.rateit.min.js
create mode 100644 data/interfaces/default/js/jquery.scrollbar.min.js
create mode 100644 data/interfaces/default/js/jquery.tripleclick.min.js
create mode 100644 data/interfaces/default/js/moment-duration-format.js
create mode 100644 data/interfaces/default/js/moment-with-locale.js
create mode 100644 data/interfaces/default/js/parsley.min.js
create mode 100644 data/interfaces/default/js/platform.min.js
create mode 100644 data/interfaces/default/js/pnotify.custom.min.js
create mode 100644 data/interfaces/default/js/script.js
create mode 100644 data/interfaces/default/js/selectize.min.js
create mode 100644 data/interfaces/default/js/tables/accounts_table.js
create mode 100644 data/interfaces/default/js/tables/history_table.js
create mode 100644 data/interfaces/default/js/tables/history_table_modal.js
create mode 100644 data/interfaces/default/js/tables/libraries.js
create mode 100644 data/interfaces/default/js/tables/login_logs.js
create mode 100644 data/interfaces/default/js/tables/logs.js
create mode 100644 data/interfaces/default/js/tables/media_info_table.js
create mode 100644 data/interfaces/default/js/tables/newsletter_logs.js
create mode 100644 data/interfaces/default/js/tables/notification_logs.js
create mode 100644 data/interfaces/default/js/tables/plex_logs.js
create mode 100644 data/interfaces/default/js/tables/servers_table.js
create mode 100644 data/interfaces/default/js/tables/sync_table.js
create mode 100644 data/interfaces/default/js/tables/user_ips.js
create mode 100644 data/interfaces/default/js/tables/users.js
create mode 100644 data/interfaces/default/libraries.html
create mode 100644 data/interfaces/default/library.html
create mode 100644 data/interfaces/default/library_recently_added.html
create mode 100644 data/interfaces/default/library_stats.html
create mode 100644 data/interfaces/default/library_user_stats.html
create mode 100644 data/interfaces/default/login.html
create mode 100644 data/interfaces/default/logs.html
create mode 100644 data/interfaces/default/mobile_device_config.html
create mode 100644 data/interfaces/default/mobile_devices_table.html
create mode 100644 data/interfaces/default/newsletter_auth.html
create mode 100644 data/interfaces/default/newsletter_config.html
create mode 100644 data/interfaces/default/newsletter_preview.html
create mode 100644 data/interfaces/default/newsletters_table.html
create mode 100644 data/interfaces/default/notifier_config.html
create mode 100644 data/interfaces/default/notifier_text_preview.html
create mode 100644 data/interfaces/default/notifiers_table.html
create mode 100644 data/interfaces/default/plextv_account_modal.html
create mode 100644 data/interfaces/default/queue_modal.html
create mode 100644 data/interfaces/default/recently_added.html
create mode 100644 data/interfaces/default/scheduler_table.html
create mode 100644 data/interfaces/default/search.html
create mode 100644 data/interfaces/default/server_config.html
create mode 100644 data/interfaces/default/server_status.html
create mode 100644 data/interfaces/default/settings.html
create mode 100644 data/interfaces/default/shutdown.html
create mode 100644 data/interfaces/default/stream_data.html
create mode 100644 data/interfaces/default/support.html
create mode 100644 data/interfaces/default/sync.html
create mode 100644 data/interfaces/default/update_metadata.html
create mode 100644 data/interfaces/default/user.html
create mode 100644 data/interfaces/default/user_player_stats.html
create mode 100644 data/interfaces/default/user_recently_watched.html
create mode 100644 data/interfaces/default/user_watch_time_stats.html
create mode 100644 data/interfaces/default/users.html
create mode 100644 data/interfaces/default/welcome.html
create mode 100644 data/interfaces/newsletters/recently_added.html
create mode 100644 data/interfaces/newsletters/recently_added.internal.html
create mode 100644 init-scripts/init-alt.freebsd
create mode 100644 init-scripts/init.fedora.centos.service
create mode 100644 init-scripts/init.freebsd
create mode 100644 init-scripts/init.freenas
create mode 100644 init-scripts/init.osx
create mode 100644 init-scripts/init.solaris11
create mode 100644 init-scripts/init.systemd
create mode 100644 init-scripts/init.ubuntu
create mode 100644 init-scripts/init.upstart
create mode 100644 installation.md
create mode 100644 plexpy/__init__.py
create mode 100644 plexpy/activity_handler.py
create mode 100644 plexpy/activity_pinger.py
create mode 100644 plexpy/activity_processor.py
create mode 100644 plexpy/api2.py
create mode 100644 plexpy/classes.py
create mode 100644 plexpy/common.py
create mode 100644 plexpy/config.py
create mode 100644 plexpy/database.py
create mode 100644 plexpy/datafactory.py
create mode 100644 plexpy/datatables.py
create mode 100644 plexpy/exceptions.py
create mode 100644 plexpy/graphs.py
create mode 100644 plexpy/helpers.py
create mode 100644 plexpy/http_handler.py
create mode 100644 plexpy/libraries.py
create mode 100644 plexpy/lock.py
create mode 100644 plexpy/log_reader.py
create mode 100644 plexpy/logger.py
create mode 100644 plexpy/mobile_app.py
create mode 100644 plexpy/newsletter_handler.py
create mode 100644 plexpy/newsletters.py
create mode 100644 plexpy/notification_handler.py
create mode 100644 plexpy/notifiers.py
create mode 100644 plexpy/plexivity_import.py
create mode 100644 plexpy/plextv.py
create mode 100644 plexpy/plexwatch_import.py
create mode 100644 plexpy/request.py
create mode 100644 plexpy/servers.py
create mode 100644 plexpy/session.py
create mode 100644 plexpy/tautulli_import.py
create mode 100644 plexpy/users.py
create mode 100644 plexpy/version.py
create mode 100644 plexpy/versioncheck.py
create mode 100644 plexpy/web_socket.py
create mode 100644 plexpy/webauth.py
create mode 100644 plexpy/webserve.py
create mode 100644 plexpy/webstart.py
create mode 100644 pylintrc
create mode 100644 requirements.in
create mode 100644 requirements.txt
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..ded1ace0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,76 @@
+
+# Compiled source #
+###################
+*.pyc
+*.py~
+*.pyproj
+*.sln
+
+# PlexPy files #
+######################
+*.log
+*.db*
+*.db-journal
+*.ini
+release.lock
+version.lock
+logs/*
+backups/*
+cache/*
+newsletters/*
+*.mmdb
+
+# HTTPS Cert/Key #
+##################
+/*.crt
+/*.key
+/*.csr
+/*.pem
+
+# Mergetool
+*.orgin
+
+# OS generated files #
+######################
+.DS_Store?
+.DS_Store
+ehthumbs.db
+Icon?
+Thumbs.db
+
+#Ignore files generated by PyCharm
+*.idea/*
+
+#Ignore files generated by vi
+*.swp
+
+#Ignore files build by Visual Studio
+*.obj
+*.exe
+*.pdb
+*.user
+*.aps
+*.pch
+*.vspscc
+*_i.c
+*_p.c
+*.ncb
+*.suo
+*.tlb
+*.tlh
+*.bak
+*.cache
+*.ilk
+*.log
+[Bb]in
+[Dd]ebug*/
+*.lib
+*.sbr
+obj/
+[Rr]elease*/
+_ReSharper*/
+[Tt]est[Rr]esult*
+/cache
+/logs
+.project
+.pydevproject
diff --git a/API.md b/API.md
new file mode 100644
index 00000000..85df4018
--- /dev/null
+++ b/API.md
@@ -0,0 +1,2739 @@
+# API Reference
+
+## General structure
+The API endpoint is
+```
+http://IP_ADDRESS:PORT + [/HTTP_ROOT] + /api/v2?apikey=$apikey&cmd=$command
+```
+
+Example:
+```
+http://localhost:8181/api/v2?apikey=66198313a092496b8a725867d2223b5f&cmd=get_metadata&rating_key=153037
+```
+
+Response example (default `json`)
+```
+{
+ "response": {
+ "data": [
+ {
+ "loglevel": "INFO",
+ "msg": "Signal 2 caught, saving and exiting...",
+ "thread": "MainThread",
+ "time": "22-sep-2015 01:42:56 "
+ }
+ ],
+ "message": null,
+ "result": "success"
+ }
+}
+```
+```
+General optional parameters:
+
+ out_type: "json" or "xml"
+ callback: "pong"
+ debug: 1
+```
+
+## API methods
+
+### add_newsletter_config
+Add a new notification agent.
+
+```
+Required parameters:
+ agent_id (int): The newsletter type to add
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### add_notifier_config
+Add a new notification agent.
+
+```
+Required parameters:
+ agent_id (int): The notification agent to add
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### arnold
+Get to the chopper!
+
+
+### backup_config
+Create a manual backup of the `config.ini` file.
+
+
+### backup_db
+Create a manual backup of the `plexpy.db` file.
+
+
+### delete_all_library_history
+Delete all Tautulli history for a specific library.
+
+```
+Required parameters:
+ section_id (str): The id of the Plex library section
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_all_user_history
+Delete all Tautulli history for a specific user.
+
+```
+Required parameters:
+ user_id (str): The id of the Plex user
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_cache
+Delete and recreate the cache directory.
+
+
+### delete_hosted_images
+Delete the images uploaded to image hosting services.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ rating_key (int): 1234
+ (Note: Must be the movie, show, season, artist, or album rating key)
+ service (str): 'imgur' or 'cloudinary'
+ delete_all (bool): 'true' to delete all images form the service
+
+Returns:
+ json:
+ {"result": "success",
+ "message": "Deleted hosted images from Imgur."}
+```
+
+
+### delete_image_cache
+Delete and recreate the image cache directory.
+
+
+### delete_library
+Delete a library section from Tautulli. Also erases all history for the library.
+
+```
+Required parameters:
+ section_id (str): The id of the Plex library section
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_login_log
+Delete the Tautulli login logs.
+
+```
+Required paramters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_lookup_info
+Delete the 3rd party API lookup info.
+
+```
+Required parameters:
+ rating_key (int): 1234
+ (Note: Must be the movie, show, or artist rating key)
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"result": "success",
+ "message": "Deleted lookup info."}
+```
+
+
+### delete_media_info_cache
+Delete the media info table cache for a specific library.
+
+```
+Required parameters:
+ section_id (str): The id of the Plex library section
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_mobile_device
+Remove a mobile device from the database.
+
+```
+Required parameters:
+ mobile_device_id (int): The device id to delete
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_newsletter
+Remove a newsletter from the database.
+
+```
+Required parameters:
+ newsletter_id (int): The newsletter to delete
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_newsletter_log
+Delete the Tautulli newsletter logs.
+
+```
+Required paramters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_notification_log
+Delete the Tautulli notification logs.
+
+```
+Required paramters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_notifier
+Remove a notifier from the database.
+
+```
+Required parameters:
+ notifier_id (int): The notifier to delete
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### delete_temp_sessions
+Flush out all of the temporary sessions in the database.
+
+
+### delete_user
+Delete a user from Tautulli. Also erases all history for the user.
+
+```
+Required parameters:
+ user_id (str): The id of the Plex user
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### docs
+Return the api docs as a dict where commands are keys, docstring are value.
+
+
+### docs_md
+Return the api docs formatted with markdown.
+
+
+### download_config
+Download the Tautulli configuration file.
+
+
+### download_database
+Download the Tautulli database file.
+
+
+### download_log
+Download the Tautulli log file.
+
+
+### download_plex_log
+Download the Plex log file.
+
+
+### edit_library
+Update a library section on Tautulli.
+
+```
+Required parameters:
+ section_id (str): The id of the Plex library section
+
+Optional parameters:
+ custom_thumb (str): The URL for the custom library thumbnail
+ keep_history (int): 0 or 1
+
+Returns:
+ None
+```
+
+
+### edit_user
+Update a user on Tautulli.
+
+```
+Required parameters:
+ user_id (str): The id of the Plex user
+
+Optional paramters:
+ friendly_name(str): The friendly name of the user
+ custom_thumb (str): The URL for the custom user thumbnail
+ keep_history (int): 0 or 1
+ allow_guest (int): 0 or 1
+
+Returns:
+ None
+```
+
+
+### get_activity
+Get the current activity on the PMS.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ session_key (int): Session key for the session info to return, OR
+ session_id (str): Session ID for the session info to return
+
+Returns:
+ json:
+ {"lan_bandwidth": 25318,
+ "sessions": [
+ {
+ "actors": [
+ "Kit Harington",
+ "Emilia Clarke",
+ "Isaac Hempstead-Wright",
+ "Maisie Williams",
+ "Liam Cunningham",
+ ],
+ "added_at": "1461572396",
+ "allow_guest": 1,
+ "art": "/library/metadata/1219/art/1503306930",
+ "aspect_ratio": "1.78",
+ "audience_rating": "",
+ "audience_rating_image": "rottentomatoes://image.rating.upright",
+ "audio_bitrate": "384",
+ "audio_bitrate_mode": "",
+ "audio_channel_layout": "5.1(side)",
+ "audio_channels": "6",
+ "audio_codec": "ac3",
+ "audio_decision": "direct play",
+ "audio_language": "",
+ "audio_language_code": "",
+ "audio_profile": "",
+ "audio_sample_rate": "48000",
+ "bandwidth": "25318",
+ "banner": "/library/metadata/1219/banner/1503306930",
+ "bif_thumb": "/library/parts/274169/indexes/sd/1000",
+ "bitrate": "10617",
+ "channel_stream": 0,
+ "collections": [],
+ "container": "mkv",
+ "content_rating": "TV-MA",
+ "deleted_user": 0,
+ "device": "Windows",
+ "directors": [
+ "Jeremy Podeswa"
+ ],
+ "do_notify": 0,
+ "duration": "2998272",
+ "email": "Jon.Snow.1337@CastleBlack.com",
+ "file": "/media/TV Shows/Game of Thrones/Season 06/Game of Thrones - S06E01 - The Red Woman.mkv",
+ "file_size": "3979115377",
+ "friendly_name": "Jon Snow",
+ "full_title": "Game of Thrones - The Red Woman",
+ "genres": [
+ "Adventure",
+ "Drama",
+ "Fantasy"
+ ],
+ "grandparent_rating_key": "1219",
+ "grandparent_thumb": "/library/metadata/1219/thumb/1503306930",
+ "grandparent_title": "Game of Thrones",
+ "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en",
+ "height": "1078",
+ "id": "",
+ "indexes": 1,
+ "ip_address": "10.10.10.1",
+ "ip_address_public": "64.123.23.111",
+ "is_admin": 1,
+ "is_allow_sync": null,
+ "is_home_user": 1,
+ "is_restricted": 0,
+ "keep_history": 1,
+ "labels": [],
+ "last_viewed_at": "1462165717",
+ "library_name": "TV Shows",
+ "local": "1",
+ "location": "lan",
+ "machine_id": "lmd93nkn12k29j2lnm",
+ "media_index": "1",
+ "media_type": "episode",
+ "optimized_version": 0,
+ "optimized_version_profile": "",
+ "optimized_version_title": "",
+ "originally_available_at": "2016-04-24",
+ "original_title": "",
+ "parent_media_index": "6",
+ "parent_rating_key": "153036",
+ "parent_thumb": "/library/metadata/153036/thumb/1503889210",
+ "parent_title": "Season 6",
+ "platform": "Plex Media Player",
+ "platform_name": "plex",
+ "platform_version": "2.4.1.787-54a020cd",
+ "player": "Castle-PC",
+ "product": "Plex Media Player",
+ "product_version": "3.35.2",
+ "profile": "Konvergo",
+ "progress_percent": "0",
+ "quality_profile": "Original",
+ "rating": "7.8",
+ "rating_image": "rottentomatoes://image.rating.ripe",
+ "rating_key": "153037",
+ "relay": 0,
+ "section_id": "2",
+ "session_id": "helf15l3rxgw01xxe0jf3l3d",
+ "session_key": "27",
+ "shared_libraries": [
+ "10",
+ "1",
+ "4",
+ "5",
+ "15",
+ "20",
+ "2"
+ ],
+ "sort_title": "Red Woman",
+ "state": "playing",
+ "stream_aspect_ratio": "1.78",
+ "stream_audio_bitrate": "384",
+ "stream_audio_bitrate_mode": "",
+ "stream_audio_channel_layout": "5.1(side)",
+ "stream_audio_channel_layout_": "5.1(side)",
+ "stream_audio_channels": "6",
+ "stream_audio_codec": "ac3",
+ "stream_audio_decision": "direct play",
+ "stream_audio_language": "",
+ "stream_audio_language_code": "",
+ "stream_audio_sample_rate": "48000",
+ "stream_bitrate": "10617",
+ "stream_container": "mkv",
+ "stream_container_decision": "direct play",
+ "stream_duration": "2998272",
+ "stream_subtitle_codec": "",
+ "stream_subtitle_container": "",
+ "stream_subtitle_decision": "",
+ "stream_subtitle_forced": 0,
+ "stream_subtitle_format": "",
+ "stream_subtitle_language": "",
+ "stream_subtitle_language_code": "",
+ "stream_subtitle_location": "",
+ "stream_video_bit_depth": "8",
+ "stream_video_bitrate": "10233",
+ "stream_video_codec": "h264",
+ "stream_video_codec_level": "41",
+ "stream_video_decision": "direct play",
+ "stream_video_framerate": "24p",
+ "stream_video_height": "1078",
+ "stream_video_language": "",
+ "stream_video_language_code": "",
+ "stream_video_ref_frames": "4",
+ "stream_video_resolution": "1080",
+ "stream_video_width": "1920",
+ "studio": "HBO",
+ "subtitle_codec": "",
+ "subtitle_container": "",
+ "subtitle_decision": "",
+ "subtitle_forced": 0,
+ "subtitle_format": "",
+ "subtitle_language": "",
+ "subtitle_language_code": "",
+ "subtitle_location": "",
+ "subtitles": 0,
+ "summary": "Jon Snow is dead. Daenerys meets a strong man. Cersei sees her daughter again.",
+ "synced_version": 0,
+ "synced_version_profile": "",
+ "tagline": "",
+ "throttled": "0",
+ "thumb": "/library/metadata/153037/thumb/1503889207",
+ "title": "The Red Woman",
+ "transcode_audio_channels": "",
+ "transcode_audio_codec": "",
+ "transcode_container": "",
+ "transcode_decision": "direct play",
+ "transcode_height": "",
+ "transcode_hw_decode": "",
+ "transcode_hw_decode_title": "",
+ "transcode_hw_decoding": 0,
+ "transcode_hw_encode": "",
+ "transcode_hw_encode_title": "",
+ "transcode_hw_encoding": 0,
+ "transcode_hw_full_pipeline": 0,
+ "transcode_hw_requested": 0,
+ "transcode_key": "",
+ "transcode_progress": 0,
+ "transcode_protocol": "",
+ "transcode_speed": "",
+ "transcode_throttled": 0,
+ "transcode_video_codec": "",
+ "transcode_width": "",
+ "type": "",
+ "updated_at": "1503889207",
+ "user": "LordCommanderSnow",
+ "user_id": 133788,
+ "user_rating": "",
+ "user_thumb": "https://plex.tv/users/k10w42309cynaopq/avatar",
+ "username": "LordCommanderSnow",
+ "video_bit_depth": "8",
+ "video_bitrate": "10233",
+ "video_codec": "h264",
+ "video_codec_level": "41",
+ "video_decision": "direct play",
+ "video_frame_rate": "23.976",
+ "video_framerate": "24p",
+ "video_height": "1078",
+ "video_language": "",
+ "video_language_code": "",
+ "video_profile": "high",
+ "video_ref_frames": "4",
+ "video_resolution": "1080",
+ "video_width": "1920",
+ "view_offset": "1000",
+ "width": "1920",
+ "writers": [
+ "David Benioff",
+ "D. B. Weiss"
+ ],
+ "year": "2016"
+ }
+ ],
+ "stream_count": "1",
+ "stream_count_direct_play": 1,
+ "stream_count_direct_stream": 0,
+ "stream_count_transcode": 0,
+ "total_bandwidth": 25318,
+ "wan_bandwidth": 0
+ }
+```
+
+
+### get_apikey
+Get the apikey. Username and password are required
+if auth is enabled. Makes and saves the apikey if it does not exist.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ username (str): Your Tautulli username
+ password (str): Your Tautulli password
+
+Returns:
+ string: "apikey"
+```
+
+
+### get_date_formats
+Get the date and time formats used by Tautulli.
+
+ ```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"date_format": "YYYY-MM-DD",
+ "time_format": "HH:mm",
+ }
+```
+
+
+### get_geoip_lookup
+Get the geolocation info for an IP address. The GeoLite2 database must be installed.
+
+```
+Required parameters:
+ ip_address
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"continent": "North America",
+ "country": "United States",
+ "region": "California",
+ "city": "Mountain View",
+ "postal_code": "94035",
+ "timezone": "America/Los_Angeles",
+ "latitude": 37.386,
+ "longitude": -122.0838,
+ "accuracy": 1000
+ }
+ json:
+ {"error": "The address 127.0.0.1 is not in the database."
+ }
+```
+
+
+### get_history
+Get the Tautulli history.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ grouping (int): 0 or 1
+ user (str): "Jon Snow"
+ user_id (int): 133788
+ rating_key (int): 4348
+ parent_rating_key (int): 544
+ grandparent_rating_key (int): 351
+ start_date (str): "YYYY-MM-DD"
+ section_id (int): 2
+ media_type (str): "movie", "episode", "track"
+ transcode_decision (str): "direct play", "copy", "transcode",
+ order_column (str): "date", "friendly_name", "ip_address", "platform", "player",
+ "full_title", "started", "paused_counter", "stopped", "duration"
+ order_dir (str): "desc" or "asc"
+ start (int): Row to start from, 0
+ length (int): Number of items to return, 25
+ search (str): A string to search for, "Thrones"
+
+Returns:
+ json:
+ {"draw": 1,
+ "recordsTotal": 1000,
+ "recordsFiltered": 250,
+ "total_duration": "42 days 5 hrs 18 mins",
+ "filter_duration": "10 hrs 12 mins",
+ "data":
+ [{"date": 1462687607,
+ "duration": 263,
+ "friendly_name": "Mother of Dragons",
+ "full_title": "Game of Thrones - The Red Woman",
+ "grandparent_rating_key": 351,
+ "grandparent_title": "Game of Thrones",
+ "original_title": "",
+ "group_count": 1,
+ "group_ids": "1124",
+ "id": 1124,
+ "ip_address": "xxx.xxx.xxx.xxx",
+ "media_index": 17,
+ "media_type": "episode",
+ "parent_media_index": 7,
+ "parent_rating_key": 544,
+ "parent_title": "",
+ "paused_counter": 0,
+ "percent_complete": 84,
+ "platform": "Chrome",
+ "player": "Plex Web (Chrome)",
+ "rating_key": 4348,
+ "reference_id": 1123,
+ "session_key": null,
+ "started": 1462688107,
+ "state": null,
+ "stopped": 1462688370,
+ "thumb": "/library/metadata/4348/thumb/1462414561",
+ "title": "The Red Woman",
+ "transcode_decision": "transcode",
+ "user": "DanyKhaleesi69",
+ "user_id": 8008135,
+ "watched_status": 0,
+ "year": 2016
+ },
+ {...},
+ {...}
+ ]
+ }
+```
+
+
+### get_home_stats
+Get the homepage watch statistics.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ grouping (int): 0 or 1
+ time_range (str): The time range to calculate statistics, '30'
+ stats_type (str): plays or duration
+ stats_count (str): The number of top items to list, '5'
+
+Returns:
+ json:
+ [{"stat_id": "top_movies",
+ "stat_type": "total_plays",
+ "rows": [{...}]
+ },
+ {"stat_id": "popular_movies",
+ "rows": [{...}]
+ },
+ {"stat_id": "top_tv",
+ "stat_type": "total_plays",
+ "rows":
+ [{"content_rating": "TV-MA",
+ "friendly_name": "",
+ "grandparent_thumb": "/library/metadata/1219/thumb/1462175063",
+ "labels": [],
+ "last_play": 1462380698,
+ "media_type": "episode",
+ "platform": "",
+ "platform_type": "",
+ "rating_key": 1219,
+ "row_id": 1116,
+ "section_id": 2,
+ "thumb": "",
+ "title": "Game of Thrones",
+ "total_duration": 213302,
+ "total_plays": 69,
+ "user": "",
+ "users_watched": ""
+ },
+ {...},
+ {...}
+ ]
+ },
+ {"stat_id": "popular_tv",
+ "rows": [{...}]
+ },
+ {"stat_id": "top_music",
+ "stat_type": "total_plays",
+ "rows": [{...}]
+ },
+ {"stat_id": "popular_music",
+ "rows": [{...}]
+ },
+ {"stat_id": "last_watched",
+ "rows": [{...}]
+ },
+ {"stat_id": "top_users",
+ "stat_type": "total_plays",
+ "rows": [{...}]
+ },
+ {"stat_id": "top_platforms",
+ "stat_type": "total_plays",
+ "rows": [{...}]
+ },
+ {"stat_id": "most_concurrent",
+ "rows": [{...}]
+ }
+ ]
+```
+
+
+### get_libraries
+Get a list of all libraries on your server.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ [{"art": "/:/resources/show-fanart.jpg",
+ "child_count": "3745",
+ "count": "62",
+ "parent_count": "240",
+ "section_id": "2",
+ "section_name": "TV Shows",
+ "section_type": "show",
+ "thumb": "/:/resources/show.png"
+ },
+ {...},
+ {...}
+ ]
+```
+
+
+### get_libraries_table
+Get the data on the Tautulli libraries table.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ order_column (str): "library_thumb", "section_name", "section_type", "count", "parent_count",
+ "child_count", "last_accessed", "last_played", "plays", "duration"
+ order_dir (str): "desc" or "asc"
+ start (int): Row to start from, 0
+ length (int): Number of items to return, 25
+ search (str): A string to search for, "Movies"
+
+Returns:
+ json:
+ {"draw": 1,
+ "recordsTotal": 10,
+ "recordsFiltered": 10,
+ "data":
+ [{"child_count": 3745,
+ "content_rating": "TV-MA",
+ "count": 62,
+ "do_notify": "Checked",
+ "do_notify_created": "Checked",
+ "duration": 1578037,
+ "id": 1128,
+ "keep_history": "Checked",
+ "labels": [],
+ "last_accessed": 1462693216,
+ "last_played": "Game of Thrones - The Red Woman",
+ "library_art": "/:/resources/show-fanart.jpg",
+ "library_thumb": "",
+ "media_index": 1,
+ "media_type": "episode",
+ "parent_count": 240,
+ "parent_media_index": 6,
+ "parent_title": "",
+ "plays": 772,
+ "rating_key": 153037,
+ "section_id": 2,
+ "section_name": "TV Shows",
+ "section_type": "Show",
+ "thumb": "/library/metadata/153036/thumb/1462175062",
+ "year": 2016
+ },
+ {...},
+ {...}
+ ]
+ }
+```
+
+
+### get_library
+Get a library's details.
+
+```
+Required parameters:
+ section_id (str): The id of the Plex library section
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"child_count": null,
+ "count": 887,
+ "do_notify": 1,
+ "do_notify_created": 1,
+ "keep_history": 1,
+ "library_art": "/:/resources/movie-fanart.jpg",
+ "library_thumb": "/:/resources/movie.png",
+ "parent_count": null,
+ "section_id": 1,
+ "section_name": "Movies",
+ "section_type": "movie"
+ }
+```
+
+
+### get_library_media_info
+Get the data on the Tautulli media info tables.
+
+```
+Required parameters:
+ section_id (str): The id of the Plex library section, OR
+ rating_key (str): The grandparent or parent rating key
+
+Optional parameters:
+ section_type (str): "movie", "show", "artist", "photo"
+ order_column (str): "added_at", "sort_title", "container", "bitrate", "video_codec",
+ "video_resolution", "video_framerate", "audio_codec", "audio_channels",
+ "file_size", "last_played", "play_count"
+ order_dir (str): "desc" or "asc"
+ start (int): Row to start from, 0
+ length (int): Number of items to return, 25
+ search (str): A string to search for, "Thrones"
+ refresh (str): "true" to refresh the media info table
+
+Returns:
+ json:
+ {"draw": 1,
+ "recordsTotal": 82,
+ "recordsFiltered": 82,
+ "filtered_file_size": 2616760056742,
+ "total_file_size": 2616760056742,
+ "data":
+ [{"added_at": "1403553078",
+ "audio_channels": "",
+ "audio_codec": "",
+ "bitrate": "",
+ "container": "",
+ "file_size": 253660175293,
+ "grandparent_rating_key": "",
+ "last_played": 1462380698,
+ "media_index": "1",
+ "media_type": "show",
+ "parent_media_index": "",
+ "parent_rating_key": "",
+ "play_count": 15,
+ "rating_key": "1219",
+ "section_id": 2,
+ "section_type": "show",
+ "thumb": "/library/metadata/1219/thumb/1436265995",
+ "title": "Game of Thrones",
+ "video_codec": "",
+ "video_framerate": "",
+ "video_resolution": "",
+ "year": "2011"
+ },
+ {...},
+ {...}
+ ]
+ }
+```
+
+
+### get_library_names
+Get a list of library sections and ids on the PMS.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ [{"section_id": 1, "section_name": "Movies", "section_type": "movie"},
+ {"section_id": 7, "section_name": "Music", "section_type": "artist"},
+ {"section_id": 2, "section_name": "TV Shows", "section_type": "show"},
+ {...}
+ ]
+```
+
+
+### get_library_user_stats
+Get a library's user statistics.
+
+```
+Required parameters:
+ section_id (str): The id of the Plex library section
+
+Optional parameters:
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ [{"friendly_name": "Jon Snow",
+ "total_plays": 170,
+ "user_id": 133788,
+ "user_thumb": "https://plex.tv/users/k10w42309cynaopq/avatar"
+ },
+ {"platform_type": "DanyKhaleesi69",
+ "total_plays": 42,
+ "user_id": 8008135,
+ "user_thumb": "https://plex.tv/users/568gwwoib5t98a3a/avatar"
+ },
+ {...},
+ {...}
+ ]
+```
+
+
+### get_library_watch_time_stats
+Get a library's watch time statistics.
+
+```
+Required parameters:
+ section_id (str): The id of the Plex library section
+
+Optional parameters:
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ [{"query_days": 1,
+ "total_plays": 0,
+ "total_time": 0
+ },
+ {"query_days": 7,
+ "total_plays": 3,
+ "total_time": 15694
+ },
+ {"query_days": 30,
+ "total_plays": 35,
+ "total_time": 63054
+ },
+ {"query_days": 0,
+ "total_plays": 508,
+ "total_time": 1183080
+ }
+ ]
+```
+
+
+### get_logs
+Get the Tautulli logs.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ sort (str): "time", "thread", "msg", "loglevel"
+ search (str): A string to search for
+ order (str): "desc" or "asc"
+ regex (str): A regex string to search for
+ start (int): Row number to start from
+ end (int): Row number to end at
+
+Returns:
+ json:
+ [{"loglevel": "DEBUG",
+ "msg": "Latest version is 2d10b0748c7fa2ee4cf59960c3d3fffc6aa9512b",
+ "thread": "MainThread",
+ "time": "2016-05-08 09:36:51 "
+ },
+ {...},
+ {...}
+ ]
+```
+
+
+### get_metadata
+Get the metadata for a media item.
+
+```
+Required parameters:
+ rating_key (str): Rating key of the item
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"actors": [
+ "Kit Harington",
+ "Emilia Clarke",
+ "Isaac Hempstead-Wright",
+ "Maisie Williams",
+ "Liam Cunningham",
+ ],
+ "added_at": "1461572396",
+ "art": "/library/metadata/1219/art/1462175063",
+ "audience_rating": "8",
+ "audience_rating_image": "rottentomatoes://image.rating.upright",
+ "banner": "/library/metadata/1219/banner/1462175063",
+ "collections": [],
+ "content_rating": "TV-MA",
+ "directors": [
+ "Jeremy Podeswa"
+ ],
+ "duration": "2998290",
+ "full_title": "Game of Thrones - The Red Woman",
+ "genres": [
+ "Adventure",
+ "Drama",
+ "Fantasy"
+ ],
+ "grandparent_rating_key": "1219",
+ "grandparent_thumb": "/library/metadata/1219/thumb/1462175063",
+ "grandparent_title": "Game of Thrones",
+ "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en",
+ "labels": [],
+ "last_viewed_at": "1462165717",
+ "library_name": "TV Shows",
+ "media_index": "1",
+ "media_info": [
+ {
+ "aspect_ratio": "1.78",
+ "audio_channel_layout": "5.1",
+ "audio_channels": "6",
+ "audio_codec": "ac3",
+ "audio_profile": "",
+ "bitrate": "10617",
+ "container": "mkv",
+ "height": "1078",
+ "id": "257925",
+ "optimized_version": 0,
+ "parts": [
+ {
+ "file": "/media/TV Shows/Game of Thrones/Season 06/Game of Thrones - S06E01 - The Red Woman.mkv",
+ "file_size": "3979115377",
+ "id": "274169",
+ "indexes": 1,
+ "streams": [
+ {
+ "id": "511663",
+ "type": "1",
+ "video_bit_depth": "8",
+ "video_bitrate": "10233",
+ "video_codec": "h264",
+ "video_codec_level": "41",
+ "video_frame_rate": "23.976",
+ "video_height": "1078",
+ "video_language": "",
+ "video_language_code": "",
+ "video_profile": "high",
+ "video_ref_frames": "4",
+ "video_width": "1920",
+ "selected": 0
+ },
+ {
+ "audio_bitrate": "384",
+ "audio_bitrate_mode": "",
+ "audio_channel_layout": "5.1(side)",
+ "audio_channels": "6",
+ "audio_codec": "ac3",
+ "audio_language": "",
+ "audio_language_code": "",
+ "audio_profile": "",
+ "audio_sample_rate": "48000",
+ "id": "511664",
+ "type": "2",
+ "selected": 1
+ },
+ {
+ "id": "511953",
+ "subtitle_codec": "srt",
+ "subtitle_container": "",
+ "subtitle_forced": 0,
+ "subtitle_format": "srt",
+ "subtitle_language": "English",
+ "subtitle_language_code": "eng",
+ "subtitle_location": "external",
+ "type": "3",
+ "selected": 1
+ }
+ ]
+ }
+ ],
+ "video_codec": "h264",
+ "video_framerate": "24p",
+ "video_profile": "high",
+ "video_resolution": "1080",
+ "width": "1920"
+ }
+ ],
+ "media_type": "episode",
+ "original_title": "",
+ "originally_available_at": "2016-04-24",
+ "parent_media_index": "6",
+ "parent_rating_key": "153036",
+ "parent_thumb": "/library/metadata/153036/thumb/1462175062",
+ "parent_title": "",
+ "rating": "7.8",
+ "rating_image": "rottentomatoes://image.rating.ripe",
+ "rating_key": "153037",
+ "section_id": "2",
+ "sort_title": "Game of Thrones",
+ "studio": "HBO",
+ "summary": "Jon Snow is dead. Daenerys meets a strong man. Cersei sees her daughter again.",
+ "tagline": "",
+ "thumb": "/library/metadata/153037/thumb/1462175060",
+ "title": "The Red Woman",
+ "user_rating": "9.0",
+ "updated_at": "1462175060",
+ "writers": [
+ "David Benioff",
+ "D. B. Weiss"
+ ],
+ "year": "2016"
+ }
+```
+
+
+### get_new_rating_keys
+Get a list of new rating keys for the PMS of all of the item's parent/children.
+
+```
+Required parameters:
+ rating_key (str): '12345'
+ media_type (str): "movie", "show", "season", "episode", "artist", "album", "track"
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {}
+```
+
+
+### get_newsletter_config
+Get the configuration for an existing notification agent.
+
+```
+Required parameters:
+ newsletter_id (int): The newsletter config to retrieve
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"id": 1,
+ "agent_id": 0,
+ "agent_name": "recently_added",
+ "agent_label": "Recently Added",
+ "friendly_name": "",
+ "id_name": "",
+ "cron": "0 0 * * 1",
+ "active": 1,
+ "subject": "Recently Added to {server_name}! ({end_date})",
+ "body": "View the newsletter here: {newsletter_url}",
+ "message": "",
+ "config": {"custom_cron": 0,
+ "filename": "newsletter_{newsletter_uuid}.html",
+ "formatted": 1,
+ "incl_libraries": ["1", "2"],
+ "notifier_id": 1,
+ "save_only": 0,
+ "time_frame": 7,
+ "time_frame_units": "days"
+ },
+ "email_config": {...},
+ "config_options": [{...}, ...],
+ "email_config_options": [{...}, ...]
+ }
+```
+
+
+### get_newsletter_log
+Get the data on the Tautulli newsletter logs table.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ order_column (str): "timestamp", "newsletter_id", "agent_name", "notify_action",
+ "subject_text", "start_date", "end_date", "uuid"
+ order_dir (str): "desc" or "asc"
+ start (int): Row to start from, 0
+ length (int): Number of items to return, 25
+ search (str): A string to search for, "Telegram"
+
+Returns:
+ json:
+ {"draw": 1,
+ "recordsTotal": 1039,
+ "recordsFiltered": 163,
+ "data":
+ [{"agent_id": 0,
+ "agent_name": "recently_added",
+ "end_date": "2018-03-18",
+ "id": 7,
+ "newsletter_id": 1,
+ "notify_action": "on_cron",
+ "start_date": "2018-03-05",
+ "subject_text": "Recently Added to Plex (Winterfell-Server)! (2018-03-18)",
+ "success": 1,
+ "timestamp": 1462253821,
+ "uuid": "7fe4g65i"
+ },
+ {...},
+ {...}
+ ]
+ }
+```
+
+
+### get_newsletters
+Get a list of configured newsletters.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ [{"id": 1,
+ "agent_id": 0,
+ "agent_name": "recently_added",
+ "agent_label": "Recently Added",
+ "friendly_name": "",
+ "cron": "0 0 * * 1",
+ "active": 1
+ }
+ ]
+```
+
+
+### get_notification_log
+Get the data on the Tautulli notification logs table.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ order_column (str): "timestamp", "notifier_id", "agent_name", "notify_action",
+ "subject_text", "body_text",
+ order_dir (str): "desc" or "asc"
+ start (int): Row to start from, 0
+ length (int): Number of items to return, 25
+ search (str): A string to search for, "Telegram"
+
+Returns:
+ json:
+ {"draw": 1,
+ "recordsTotal": 1039,
+ "recordsFiltered": 163,
+ "data":
+ [{"agent_id": 13,
+ "agent_name": "telegram",
+ "body_text": "DanyKhaleesi69 started playing The Red Woman.",
+ "id": 1000,
+ "notify_action": "on_play",
+ "rating_key": 153037,
+ "session_key": 147,
+ "subject_text": "Tautulli (Winterfell-Server)",
+ "success": 1,
+ "timestamp": 1462253821,
+ "user": "DanyKhaleesi69",
+ "user_id": 8008135
+ },
+ {...},
+ {...}
+ ]
+ }
+```
+
+
+### get_notifier_config
+Get the configuration for an existing notification agent.
+
+```
+Required parameters:
+ notifier_id (int): The notifier config to retrieve
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"id": 1,
+ "agent_id": 13,
+ "agent_name": "telegram",
+ "agent_label": "Telegram",
+ "friendly_name": "",
+ "config": {"incl_poster": 0,
+ "html_support": 1,
+ "chat_id": "123456",
+ "bot_token": "13456789:fio9040NNo04jLEp-4S",
+ "incl_subject": 1,
+ "disable_web_preview": 0
+ },
+ "config_options": [{...}, ...]
+ "actions": {"on_play": 0,
+ "on_stop": 0,
+ ...
+ },
+ "notify_text": {"on_play": {"subject": "...",
+ "body": "..."
+ }
+ "on_stop": {"subject": "...",
+ "body": "..."
+ }
+ ...
+ }
+ }
+```
+
+
+### get_notifier_parameters
+Get the list of available notification parameters.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {
+ }
+```
+
+
+### get_notifiers
+Get a list of configured notifiers.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ notify_action (str): The notification action to filter out
+
+Returns:
+ json:
+ [{"id": 1,
+ "agent_id": 13,
+ "agent_name": "telegram",
+ "agent_label": "Telegram",
+ "friendly_name": "",
+ "active": 1
+ }
+ ]
+```
+
+
+### get_old_rating_keys
+Get a list of old rating keys from the Tautulli database for all of the item's parent/children.
+
+```
+Required parameters:
+ rating_key (str): '12345'
+ media_type (str): "movie", "show", "season", "episode", "artist", "album", "track"
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {}
+```
+
+
+### get_plays_by_date
+Get graph data by date.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["YYYY-MM-DD", "YYYY-MM-DD", ...]
+ "series":
+ [{"name": "Movies", "data": [...]}
+ {"name": "TV", "data": [...]},
+ {"name": "Music", "data": [...]}
+ ]
+ }
+```
+
+
+### get_plays_by_dayofweek
+Get graph data by day of the week.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["Sunday", "Monday", "Tuesday", ..., "Saturday"]
+ "series":
+ [{"name": "Movies", "data": [...]}
+ {"name": "TV", "data": [...]},
+ {"name": "Music", "data": [...]}
+ ]
+ }
+```
+
+
+### get_plays_by_hourofday
+Get graph data by hour of the day.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["00", "01", "02", ..., "23"]
+ "series":
+ [{"name": "Movies", "data": [...]}
+ {"name": "TV", "data": [...]},
+ {"name": "Music", "data": [...]}
+ ]
+ }
+```
+
+
+### get_plays_by_source_resolution
+Get graph data by source resolution.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["720", "1080", "sd", ...]
+ "series":
+ [{"name": "Direct Play", "data": [...]}
+ {"name": "Direct Stream", "data": [...]},
+ {"name": "Transcode", "data": [...]}
+ ]
+ }
+```
+
+
+### get_plays_by_stream_resolution
+Get graph data by stream resolution.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["720", "1080", "sd", ...]
+ "series":
+ [{"name": "Direct Play", "data": [...]}
+ {"name": "Direct Stream", "data": [...]},
+ {"name": "Transcode", "data": [...]}
+ ]
+ }
+```
+
+
+### get_plays_by_stream_type
+Get graph data by stream type by date.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["YYYY-MM-DD", "YYYY-MM-DD", ...]
+ "series":
+ [{"name": "Direct Play", "data": [...]}
+ {"name": "Direct Stream", "data": [...]},
+ {"name": "Transcode", "data": [...]}
+ ]
+ }
+```
+
+
+### get_plays_by_top_10_platforms
+Get graph data by top 10 platforms.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["iOS", "Android", "Chrome", ...]
+ "series":
+ [{"name": "Movies", "data": [...]}
+ {"name": "TV", "data": [...]},
+ {"name": "Music", "data": [...]}
+ ]
+ }
+```
+
+
+### get_plays_by_top_10_users
+Get graph data by top 10 users.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["Jon Snow", "DanyKhaleesi69", "A Girl", ...]
+ "series":
+ [{"name": "Movies", "data": [...]}
+ {"name": "TV", "data": [...]},
+ {"name": "Music", "data": [...]}
+ ]
+ }
+```
+
+
+### get_plays_per_month
+Get graph data by month.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of months of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["Jan 2016", "Feb 2016", "Mar 2016", ...]
+ "series":
+ [{"name": "Movies", "data": [...]}
+ {"name": "TV", "data": [...]},
+ {"name": "Music", "data": [...]}
+ ]
+ }
+```
+
+
+### get_plex_log
+Get the PMS logs.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ window (int): The number of tail lines to return
+ log_type (str): "server" or "scanner"
+
+Returns:
+ json:
+ [["May 08, 2016 09:35:37",
+ "DEBUG",
+ "Auth: Came in with a super-token, authorization succeeded."
+ ],
+ [...],
+ [...]
+ ]
+```
+
+
+### get_pms_token
+Get the user's Plex token used for Tautulli.
+
+```
+Required parameters:
+ username (str): The Plex.tv username
+ password (str): The Plex.tv password
+
+Optional parameters:
+ None
+
+Returns:
+ string: The Plex token used for Tautulli
+```
+
+
+### get_pms_update
+Check for updates to the Plex Media Server.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"update_available": true,
+ "platform": "Windows",
+ "release_date": "1473721409",
+ "version": "1.1.4.2757-24ffd60",
+ "requirements": "...",
+ "extra_info": "...",
+ "changelog_added": "...",
+ "changelog_fixed": "...",
+ "label": "Download",
+ "distro": "english",
+ "distro_build": "windows-i386",
+ "download_url": "https://downloads.plex.tv/...",
+ }
+```
+
+
+### get_recently_added
+Get all items that where recently added to plex.
+
+```
+Required parameters:
+ count (str): Number of items to return
+
+Optional parameters:
+ start (str): The item number to start at
+ media_type (str): The media type: movie, show, artist
+ section_id (str): The id of the Plex library section
+
+Returns:
+ json:
+ {"recently_added":
+ [{"added_at": "1461572396",
+ "grandparent_rating_key": "1219",
+ "grandparent_thumb": "/library/metadata/1219/thumb/1462175063",
+ "grandparent_title": "Game of Thrones",
+ "library_name": "",
+ "media_index": "1",
+ "media_type": "episode",
+ "original_title": "",
+ "parent_media_index": "6",
+ "parent_rating_key": "153036",
+ "parent_thumb": "/library/metadata/153036/thumb/1462175062",
+ "parent_title": "",
+ "rating_key": "153037",
+ "section_id": "2",
+ "thumb": "/library/metadata/153037/thumb/1462175060",
+ "title": "The Red Woman",
+ "year": "2016"
+ },
+ {...},
+ {...}
+ ]
+ }
+```
+
+
+### get_server_friendly_name
+Get the name of the PMS.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ string: "Winterfell-Server"
+```
+
+
+### get_server_id
+Get the PMS server identifier.
+
+```
+Required parameters:
+ hostname (str): 'localhost' or '192.160.0.10'
+ port (int): 32400
+
+Optional parameters:
+ ssl (int): 0 or 1
+ remote (int): 0 or 1
+
+Returns:
+ json:
+ {'identifier': '08u2phnlkdshf890bhdlksghnljsahgleikjfg9t'}
+```
+
+
+### get_server_identity
+Get info about the local server.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ [{"machine_identifier": "ds48g4r354a8v9byrrtr697g3g79w",
+ "version": "0.9.15.x.xxx-xxxxxxx"
+ }
+ ]
+```
+
+
+### get_server_list
+Get all your servers that are published to Plex.tv.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ [{"clientIdentifier": "ds48g4r354a8v9byrrtr697g3g79w",
+ "httpsRequired": "0",
+ "ip": "xxx.xxx.xxx.xxx",
+ "label": "Winterfell-Server",
+ "local": "1",
+ "port": "32400",
+ "value": "xxx.xxx.xxx.xxx"
+ },
+ {...},
+ {...}
+ ]
+```
+
+
+### get_server_pref
+Get a specified PMS server preference.
+
+```
+Required parameters:
+ pref (str): Name of preference
+
+Returns:
+ string: Value of preference
+```
+
+
+### get_servers_info
+Get info about the PMS.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ [{"port": "32400",
+ "host": "10.0.0.97",
+ "version": "0.9.15.2.1663-7efd046",
+ "name": "Winterfell-Server",
+ "machine_identifier": "ds48g4r354a8v9byrrtr697g3g79w"
+ }
+ ]
+```
+
+
+### get_settings
+Gets all settings from the config file.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ key (str): Name of a config section to return
+
+Returns:
+ json:
+ {"General": {"api_enabled": true, ...}
+ "Advanced": {"cache_sizemb": "32", ...},
+ ...
+ }
+```
+
+
+### get_stream_data
+Get the stream details from history or current stream.
+
+```
+Required parameters:
+ row_id (int): The row ID number for the history item, OR
+ session_key (int): The session key of the current stream
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"aspect_ratio": "2.35",
+ "audio_bitrate": 231,
+ "audio_channels": 6,
+ "audio_codec": "aac",
+ "audio_decision": "transcode",
+ "bitrate": 2731,
+ "container": "mp4",
+ "current_session": "",
+ "grandparent_title": "",
+ "media_type": "movie",
+ "optimized_version": "",
+ "optimized_version_profile": "",
+ "optimized_version_title": "",
+ "original_title": "",
+ "pre_tautulli": "",
+ "quality_profile": "1.5 Mbps 480p",
+ "stream_audio_bitrate": 203,
+ "stream_audio_channels": 2,
+ "stream_audio_codec": "aac",
+ "stream_audio_decision": "transcode",
+ "stream_bitrate": 730,
+ "stream_container": "mkv",
+ "stream_container_decision": "transcode",
+ "stream_subtitle_codec": "",
+ "stream_subtitle_decision": "",
+ "stream_video_bitrate": 527,
+ "stream_video_codec": "h264",
+ "stream_video_decision": "transcode",
+ "stream_video_framerate": "24p",
+ "stream_video_height": 306,
+ "stream_video_resolution": "SD",
+ "stream_video_width": 720,
+ "subtitle_codec": "",
+ "subtitles": "",
+ "synced_version": "",
+ "synced_version_profile": "",
+ "title": "Frozen",
+ "transcode_hw_decoding": "",
+ "transcode_hw_encoding": "",
+ "video_bitrate": 2500,
+ "video_codec": "h264",
+ "video_decision": "transcode",
+ "video_framerate": "24p",
+ "video_height": 816,
+ "video_resolution": "1080",
+ "video_width": 1920
+ }
+```
+
+
+### get_stream_type_by_top_10_platforms
+Get graph data by stream type by top 10 platforms.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["iOS", "Android", "Chrome", ...]
+ "series":
+ [{"name": "Direct Play", "data": [...]}
+ {"name": "Direct Stream", "data": [...]},
+ {"name": "Transcode", "data": [...]}
+ ]
+ }
+```
+
+
+### get_stream_type_by_top_10_users
+Get graph data by stream type by top 10 users.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ time_range (str): The number of days of data to return
+ y_axis (str): "plays" or "duration"
+ user_id (str): The user id to filter the data
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ {"categories":
+ ["Jon Snow", "DanyKhaleesi69", "A Girl", ...]
+ "series":
+ [{"name": "Direct Play", "data": [...]}
+ {"name": "Direct Stream", "data": [...]},
+ {"name": "Transcode", "data": [...]}
+ ]
+ }
+```
+
+
+### get_synced_items
+Get a list of synced items on the PMS.
+
+```
+Required parameters:
+ machine_id (str): The PMS identifier
+
+Optional parameters:
+ user_id (str): The id of the Plex user
+
+Returns:
+ json:
+ [{"audio_bitrate": "192",
+ "client_id": "95434se643fsf24f-com-plexapp-android",
+ "content_type": "video",
+ "device_name": "Tyrion's iPad",
+ "failure": "",
+ "item_complete_count": "1",
+ "item_count": "1",
+ "item_downloaded_count": "1",
+ "item_downloaded_percent_complete": 100,
+ "metadata_type": "movie",
+ "photo_quality": "74",
+ "platform": "iOS",
+ "rating_key": "154092",
+ "root_title": "Movies",
+ "state": "complete",
+ "sync_id": "11617019",
+ "sync_title": "Deadpool",
+ "total_size": "560718134",
+ "user": "DrukenDwarfMan",
+ "user_id": "696969",
+ "username": "DrukenDwarfMan",
+ "video_bitrate": "4000"
+ "video_quality": "100"
+ },
+ {...},
+ {...}
+ ]
+```
+
+
+### get_user
+Get a user's details.
+
+```
+Required parameters:
+ user_id (str): The id of the Plex user
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"allow_guest": 1,
+ "deleted_user": 0,
+ "do_notify": 1,
+ "email": "Jon.Snow.1337@CastleBlack.com",
+ "friendly_name": "Jon Snow",
+ "is_allow_sync": 1,
+ "is_home_user": 1,
+ "is_restricted": 0,
+ "keep_history": 1,
+ "shared_libraries": ["10", "1", "4", "5", "15", "20", "2"],
+ "user_id": 133788,
+ "user_thumb": "https://plex.tv/users/k10w42309cynaopq/avatar",
+ "username": "LordCommanderSnow"
+ }
+```
+
+
+### get_user_ips
+Get the data on Tautulli users IP table.
+
+```
+Required parameters:
+ user_id (str): The id of the Plex user
+
+Optional parameters:
+ order_column (str): "last_seen", "ip_address", "platform", "player",
+ "last_played", "play_count"
+ order_dir (str): "desc" or "asc"
+ start (int): Row to start from, 0
+ length (int): Number of items to return, 25
+ search (str): A string to search for, "xxx.xxx.xxx.xxx"
+
+Returns:
+ json:
+ {"draw": 1,
+ "recordsTotal": 2344,
+ "recordsFiltered": 10,
+ "data":
+ [{"friendly_name": "Jon Snow",
+ "id": 1121,
+ "ip_address": "xxx.xxx.xxx.xxx",
+ "last_played": "Game of Thrones - The Red Woman",
+ "last_seen": 1462591869,
+ "media_index": 1,
+ "media_type": "episode",
+ "parent_media_index": 6,
+ "parent_title": "",
+ "platform": "Chrome",
+ "play_count": 149,
+ "player": "Plex Web (Chrome)",
+ "rating_key": 153037,
+ "thumb": "/library/metadata/153036/thumb/1462175062",
+ "transcode_decision": "transcode",
+ "user_id": 133788,
+ "year": 2016
+ },
+ {...},
+ {...}
+ ]
+ }
+```
+
+
+### get_user_logins
+Get the data on Tautulli user login table.
+
+```
+Required parameters:
+ user_id (str): The id of the Plex user
+
+Optional parameters:
+ order_column (str): "date", "time", "ip_address", "host", "os", "browser"
+ order_dir (str): "desc" or "asc"
+ start (int): Row to start from, 0
+ length (int): Number of items to return, 25
+ search (str): A string to search for, "xxx.xxx.xxx.xxx"
+
+Returns:
+ json:
+ {"draw": 1,
+ "recordsTotal": 2344,
+ "recordsFiltered": 10,
+ "data":
+ [{"browser": "Safari 7.0.3",
+ "friendly_name": "Jon Snow",
+ "host": "http://plexpy.castleblack.com",
+ "ip_address": "xxx.xxx.xxx.xxx",
+ "os": "Mac OS X",
+ "timestamp": 1462591869,
+ "user": "LordCommanderSnow",
+ "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A",
+ "user_group": "guest",
+ "user_id": 133788
+ },
+ {...},
+ {...}
+ ]
+ }
+```
+
+
+### get_user_names
+Get a list of all user and user ids.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ [{"friendly_name": "Jon Snow", "user_id": 133788},
+ {"friendly_name": "DanyKhaleesi69", "user_id": 8008135},
+ {"friendly_name": "Tyrion Lannister", "user_id": 696969},
+ {...},
+ ]
+```
+
+
+### get_user_player_stats
+Get a user's player statistics.
+
+```
+Required parameters:
+ user_id (str): The id of the Plex user
+
+Optional parameters:
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ [{"platform_type": "Chrome",
+ "player_name": "Plex Web (Chrome)",
+ "result_id": 1,
+ "total_plays": 170
+ },
+ {"platform_type": "Chromecast",
+ "player_name": "Chromecast",
+ "result_id": 2,
+ "total_plays": 42
+ },
+ {...},
+ {...}
+ ]
+```
+
+
+### get_user_watch_time_stats
+Get a user's watch time statistics.
+
+```
+Required parameters:
+ user_id (str): The id of the Plex user
+
+Optional parameters:
+ grouping (int): 0 or 1
+
+Returns:
+ json:
+ [{"query_days": 1,
+ "total_plays": 0,
+ "total_time": 0
+ },
+ {"query_days": 7,
+ "total_plays": 3,
+ "total_time": 15694
+ },
+ {"query_days": 30,
+ "total_plays": 35,
+ "total_time": 63054
+ },
+ {"query_days": 0,
+ "total_plays": 508,
+ "total_time": 1183080
+ }
+ ]
+```
+
+
+### get_users
+Get a list of all users that have access to your server.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ [{"allow_guest": 1,
+ "do_notify": 1,
+ "email": "Jon.Snow.1337@CastleBlack.com",
+ "filter_all": "",
+ "filter_movies": "",
+ "filter_music": "",
+ "filter_photos": "",
+ "filter_tv": "",
+ "is_admin": 0,
+ "is_allow_sync": 1,
+ "is_home_user": 1,
+ "is_restricted": 0,
+ "keep_history": 1,
+ "server_token": "PU9cMuQZxJKFBtGqHk68",
+ "shared_libraries": "1;2;3",
+ "thumb": "https://plex.tv/users/k10w42309cynaopq/avatar",
+ "user_id": "133788",
+ "username": "Jon Snow"
+ },
+ {...},
+ {...}
+ ]
+```
+
+
+### get_users_table
+Get the data on Tautulli users table.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ order_column (str): "user_thumb", "friendly_name", "last_seen", "ip_address", "platform",
+ "player", "last_played", "plays", "duration"
+ order_dir (str): "desc" or "asc"
+ start (int): Row to start from, 0
+ length (int): Number of items to return, 25
+ search (str): A string to search for, "Jon Snow"
+
+Returns:
+ json:
+ {"draw": 1,
+ "recordsTotal": 10,
+ "recordsFiltered": 10,
+ "data":
+ [{"allow_guest": "Checked",
+ "do_notify": "Checked",
+ "duration": 2998290,
+ "friendly_name": "Jon Snow",
+ "id": 1121,
+ "ip_address": "xxx.xxx.xxx.xxx",
+ "keep_history": "Checked",
+ "last_played": "Game of Thrones - The Red Woman",
+ "last_seen": 1462591869,
+ "media_index": 1,
+ "media_type": "episode",
+ "parent_media_index": 6,
+ "parent_title": "",
+ "platform": "Chrome",
+ "player": "Plex Web (Chrome)",
+ "plays": 487,
+ "rating_key": 153037,
+ "thumb": "/library/metadata/153036/thumb/1462175062",
+ "transcode_decision": "transcode",
+ "user_id": 133788,
+ "user_thumb": "https://plex.tv/users/568gwwoib5t98a3a/avatar",
+ "year": 2016
+ },
+ {...},
+ {...}
+ ]
+ }
+```
+
+
+### get_whois_lookup
+Get the connection info for an IP address.
+
+```
+Required parameters:
+ ip_address
+
+Optional parameters:
+ None
+
+Returns:
+ json:
+ {"host": "google-public-dns-a.google.com",
+ "nets": [{"description": "Google Inc.",
+ "address": "1600 Amphitheatre Parkway",
+ "city": "Mountain View",
+ "state": "CA",
+ "postal_code": "94043",
+ "country": "United States",
+ ...
+ },
+ {...}
+ ]
+ json:
+ {"host": "Not available",
+ "nets": [],
+ "error": "IPv4 address 127.0.0.1 is already defined as Loopback via RFC 1122, Section 3.2.1.3."
+ }
+```
+
+
+### import_database
+Import a PlexWatch or Plexivity database into Tautulli.
+
+```
+Required parameters:
+ app (str): "plexwatch" or "plexivity"
+ database_path (str): The full path to the plexwatch database file
+ table_name (str): "processed" or "grouped"
+
+Optional parameters:
+ import_ignore_interval (int): The minimum number of seconds for a stream to import
+
+Returns:
+ None
+```
+
+
+### install_geoip_db
+Downloads and installs the GeoLite2 database
+
+
+### notify
+Send a notification using Tautulli.
+
+```
+Required parameters:
+ notifier_id (int): The ID number of the notification agent
+ subject (str): The subject of the message
+ body (str): The body of the message
+
+Optional parameters:
+ script_args (str): The arguments for script notifications
+
+Returns:
+ None
+```
+
+
+### notify_newsletter
+Send a newsletter using Tautulli.
+
+```
+Required parameters:
+ newsletter_id (int): The ID number of the newsletter agent
+
+Optional parameters:
+ subject (str): The subject of the newsletter
+ body (str): The body of the newsletter
+ message (str): The message of the newsletter
+
+Returns:
+ None
+```
+
+
+### notify_recently_added
+Send a recently added notification using Tautulli.
+
+```
+Required parameters:
+ rating_key (int): The rating key for the media
+
+Optional parameters:
+ notifier_id (int): The ID number of the notification agent.
+ The notification will send to all enabled notification agents if notifier id is not provided.
+
+Returns:
+ json
+ {"result": "success",
+ "message": "Notification queued."
+ }
+```
+
+
+### pms_image_proxy
+Gets an image from the PMS and saves it to the image cache directory.
+
+```
+Required parameters:
+ img (str): /library/metadata/153037/thumb/1462175060
+ or
+ rating_key (str): 54321
+
+Optional parameters:
+ width (str): 300
+ height (str): 450
+ opacity (str): 25
+ background (str): 282828
+ blur (str): 3
+ img_format (str): png
+ fallback (str): "poster", "cover", "art"
+ refresh (bool): True or False whether to refresh the image cache
+ return_hash (bool): True or False to return the self-hosted image hash instead of the image
+
+Returns:
+ None
+```
+
+
+### refresh_libraries_list
+Refresh the Tautulli libraries list.
+
+
+### refresh_users_list
+Refresh the Tautulli users list.
+
+
+### register_device
+Registers the Tautulli Android App for notifications.
+
+```
+Required parameters:
+ device_name (str): The device name of the Tautulli Android App
+ device_id (str): The OneSignal device id of the Tautulli Android App
+
+Optional parameters:
+ friendly_name (str): A friendly name to identify the mobile device
+
+Returns:
+ None
+```
+
+
+### restart
+Restart Tautulli.
+
+
+### search
+Get search results from the PMS.
+
+```
+Required parameters:
+ query (str): The query string to search for
+
+Optional parameters:
+ limit (int): The maximum number of items to return per media type
+
+Returns:
+ json:
+ {"results_count": 69,
+ "results_list":
+ {"movie":
+ [{...},
+ {...},
+ ]
+ },
+ {"episode":
+ [{...},
+ {...},
+ ]
+ },
+ {...}
+ }
+```
+
+
+### set_mobile_device_config
+Configure an existing notification agent.
+
+```
+Required parameters:
+ mobile_device_id (int): The mobile device config to update
+
+Optional parameters:
+ friendly_name (str): A friendly name to identify the mobile device
+
+Returns:
+ None
+```
+
+
+### set_newsletter_config
+Configure an existing newsletter agent.
+
+```
+Required parameters:
+ newsletter_id (int): The newsletter config to update
+ agent_id (int): The newsletter type of the newsletter
+
+Optional parameters:
+ Pass all the config options for the agent with the 'newsletter_config_' and 'newsletter_email_' prefix.
+
+Returns:
+ None
+```
+
+
+### set_notifier_config
+Configure an existing notification agent.
+
+```
+Required parameters:
+ notifier_id (int): The notifier config to update
+ agent_id (int): The agent of the notifier
+
+Optional parameters:
+ Pass all the config options for the agent with the agent prefix:
+ e.g. For Telegram: telegram_bot_token
+ telegram_chat_id
+ telegram_disable_web_preview
+ telegram_html_support
+ telegram_incl_poster
+ telegram_incl_subject
+ Notify actions (int): 0 or 1,
+ e.g. on_play, on_stop, etc.
+ Notify text (str):
+ e.g. on_play_subject, on_play_body, etc.
+
+Returns:
+ None
+```
+
+
+### sql
+Query the Tautulli database with raw SQL. Automatically makes a backup of
+the database if the latest backup is older then 24h. `api_sql` must be
+manually enabled in the config file.
+
+```
+Required parameters:
+ query (str): The SQL query
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### terminate_session
+Stop a streaming session.
+
+```
+Required parameters:
+ session_key (int): The session key of the session to terminate, OR
+ session_id (str): The session id of the session to terminate
+
+Optional parameters:
+ message (str): A custom message to send to the client
+
+Returns:
+ None
+```
+
+
+### undelete_library
+Restore a deleted library section to Tautulli.
+
+```
+Required parameters:
+ section_id (str): The id of the Plex library section
+ section_name (str): The name of the Plex library section
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### undelete_user
+Restore a deleted user to Tautulli.
+
+```
+Required parameters:
+ user_id (str): The id of the Plex user
+ username (str): The username of the Plex user
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
+
+### uninstall_geoip_db
+Uninstalls the GeoLite2 database
+
+
+### update
+Update Tautulli.
+
+
+### update_check
+Check for Tautulli updates.
+
+```
+Required parameters:
+ None
+
+Optional parameters:
+ None
+
+Returns:
+ json
+ {"result": "success",
+ "update": true,
+ "message": "An update for Tautulli is available."
+ }
+```
+
+
+### update_metadata_details
+Update the metadata in the Tautulli database by matching rating keys.
+Also updates all parents or children of the media item if it is a show/season/episode
+or artist/album/track.
+
+```
+Required parameters:
+ old_rating_key (str): 12345
+ new_rating_key (str): 54321
+ media_type (str): "movie", "show", "season", "episode", "artist", "album", "track"
+
+Optional parameters:
+ None
+
+Returns:
+ None
+```
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..f8dbd7cd
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,1724 @@
+# Changelog
+
+## v4.1.07 (2021-12-04)
+* (FIXED) thread.isAlive() has been deprecated and replaced with is_alive()
+* (UPDATED) cffi package 1.14.6 not available for python 3.10.
+
+## v4.1.06 (2021-10-13)
+* (FIXED) Issue with signin after PyJWT update.
+* (UPDATED) Update installed packages.
+
+## v4.1.05 (2021-10-01)
+* (FIXED) Issue with use of ARROW timestamp in newsletters.
+
+## v4.1.04 (2021-09-20)
+* (UPDATED) Update installed packages.
+* (FIXED) Issue with use of ARROW timestamp.
+
+## v4.1.03 (2020-09-19)
+* (FIXED) Issue with notifier script execution after V4.1 changes.
+
+## v4.1.02 (2020-09-11)
+* (FIXED) Issue when playing media extras.
+
+## v4.1.01 (2020-07-27)
+* (FIXED) Issue with configuration update with keyword args after adding multi-account support.
+
+## v4.1.00 (2020-05-22)
+* (NEW) Support for multiple Plex.TV accounts.
+* (NEW) Added ability to start/stop server monitoring from dashboard server status.
+
+## v4.0.13 (2020-05-03)
+* (UPDATED) Added OSx instructions to installation.md - Thanks, SHASHWATAA
+* (FIXED) Library card initialization.
+* Add logger message for no servers found.
+* (FIXED) Issue with pip-tools.
+* (UPDATED) Python packages.
+* (UPDATED) Added installation tools (pip, setuptools) update to versioncheck.update.
+
+## v4.0.12 (2020-03-25)
+* (FIXED) Fix encoding issues in notifiers.py related to the Py3 migration.
+
+## v4.0.11 (2020-03-03)
+* (FIXED) Issue with encoding in notifiers.py when using Python < 3.8.
+
+## v4.0.10 (2020-02-29)
+* (FIXED) Issue with encoding when using killstream script.
+* (FIXED) Issue with dashboard activity cards when streams on different servers have the same session_key.
+
+## v4.0.09 (2020-02-17)
+* (FIXED) Issue with encoding in notifiers.py.
+* Increase rclone mount status checker timeout to reduce/eliminate false alerts.
+* Change rclone status checker interval from 30 seconds to 60 seconds.
+
+## v4.0.08 (2020-02-08)
+* (FIXED) Issues with IOS App. Since the Android and IOS apps don't support multi-server, I had to put in some workarounds to the API calls. Issue #10.
+* Add a warning in the readme about backing up your database if you are migrating from the official Tautulli.
+
+## v4.0.07 (2019-12-03)
+* (FIXED) Issues with newsletter handler generation for TV Shows and Albums.
+
+## v4.0.06 (2019-12-02)
+* Updated README to clarify the unofficial nature of this fork.
+* (FIXED) Issue with notification handler get_img_info while processing notification queue.
+
+## v4.0.05 (2019-11-25)
+* Support for Python 3.8.0
+
+## v4.0.04 (2019-11-18)
+* Deprecated function, platform.linux_distribution, replaced with distro. This is needed for Python 3.8. However, there is still an outstanding issue in the passlib package when using Python 3.8.
+* Site packages updated to current releases.
+
+## v4.0.03(2019-11-17)
+* (FIXED) Cloudinary image upload issue.
+
+## v4.0.02 (2019-11-10)
+* (FIXED) LIST issue during database migration from pre-V3.0.00 format.
+* (FIXED) Error in database exception handling.
+* (FIXED) Ensure data passed to json is type STR in web_socket.
+
+## v4.0.01 (2019-11-10)
+* (FIXED) Ensure list args passed to sqlite are type LIST.
+
+## v4.0.00 (2019-11-01)
+* (NEW) Python 3 migration. Tested with Python 3.7.3 and 3.6.8.
+* (NEW) Remove site packages from lib.
+* (NEW) Upgrade all site packages to current releases.
+* (NEW) Implement the use of python VENV.
+* (NEW) Implement the use of pip-tools for maintaining site packages used by Tautulli.
+* (FIXED) Occasional failures to process XML responses.
+* (FIXED) Media filtering in History display.
+
+
+> **NOTE:** If migrating from any release prior to V4.0.00, I recommend a clean install. However, you can keep your database from prior versions.
+
+##### Changes to the installation instructions:
+* Install Python3:
+ * `sudo apt-get install python3 python3-venv python3-all-dev`
+* Linux Install:
+ * Type: `cd /opt`
+ * Type: `sudo git clone https://github.com/zSeriesGuy/Tautulli.git`
+ * Type: `cd Tautulli`
+ * Type: `git checkout V4.0.00`
+ * Type: `python3 -m venv /opt/Tautulli`
+ * Type: `source /opt/Tautulli/bin/activate`
+ * Type: `python3 -m pip install --upgrade pip setuptools pip-tools`
+ * Type: `pip3 install -r /opt/Tautulli/requirements.txt`
+ * If running as a daemon, update the startup command in /lib/systemd/system/tautulli.service to `ExecStart=/opt/Tautulli/bin/python3 /opt/Tautulli/Tautulli.py`
+
+## v3.0.00-beta (2019-01-22)
+
+* Monitoring:
+ * New: Support for monitoring multiple Plex Servers.
+ * New: Support for monitoring rclone mount.
+ * Change: Changed Get for Plex Updates to 15 minute interval.
+* UI:
+ * New: Dashboard Server Status card.
+ * New: Added server name to lists (Libraries, History, User History)
+* History:
+ * New: Import for Tautulli databases
+ * New: Filter by server
+* Graphs:
+ * New: Added server selection
+ * New: View by media type or server
+* Newsletters:
+ * New: Added Server selection
+* Notifications:
+ * New: Added rclone up/down notification
+* Users:
+ * New: Added Guest access levels
+ * No Access
+ * Guest - Can see only their own history on the servers they are friended to. This is the same functionality as in previous releases.
+ * PowerGuest - Can see all users' history and all library sections but only on the servers they are friended to.
+ * SuperGuest - Can see all users' history and all library sections on all servers. But no access to settings.
+ * Admin - Full access to all controls.
+
+
+## v2.1.26 (2018-12-01)
+
+* Monitoring:
+ * Fix: Resume event not being triggered after buffering.
+* Notifications:
+ * New: Added user email as a notification parameter.
+* Graphs:
+ * Fix: History model showing no results for stream info graph.
+* API:
+ * Fix: API returning error when missing a cmd.
+
+## v2.1.25 (2018-11-03)
+
+* Monitoring:
+ * Fix: Audio and video codec showing up as * on the activity cards.
+ * New: Poster and background image on the activity cards for live TV.
+* UI:
+ * Fix: Alert message for invalid Tautulli Public Domain setting.
+
+
+## v2.1.24-beta (2018-10-29)
+
+* Monitoring:
+ * Fix: Transcode change events creating invalid sessions in the database.
+* Notifications:
+ * Change: Update Telegram character limit to 1024.
+* History:
+ * Fix: Save history table states separately for multiple Tautulli instances.
+* Graphs:
+ * Fix: Save graphs states separately for multiple Tautulli instances.
+ * Change: Version graphs to bypass browser cache.
+* UI:
+ * New: Added queued tasks modals to the scheduled tasks table for debugging.
+* Other:
+ * Change: Updated timezone info and display in configuration table.
+
+
+## v2.1.23-beta (2018-10-14)
+
+* Monitoring:
+ * Fix: Buffer events not being triggered properly.
+ * Fix: Watched progress sometimes not saved correctly. (Thanks @Sheigutn)
+* Notifications:
+ * New: Added notification trigger for transcode decision change.
+ * Fix: Multiple buffer notifications being triggered within the same second.
+ * Change: Default buffer notification threshold changed to 10 for buffer thresholds less than 10.
+* Newsletter:
+ * New: Added Other Video libraries to the newsletter.
+* Homepage:
+ * New: Added Other Video type to recently added on the homepage.
+ * Change: Save homepage recently added media type toggle state.
+ * Change: Save homepage stats config to local storage instead of the server.
+* History:
+ * Change: Save history table media type toggle state.
+* Graphs:
+ * Change: Save series visibility state when toggling the legend.
+ * Change: Save graph config to local storage instead of the server.
+* UI:
+ * New: Show the remote app device token and id in the edit device modal.
+ * Change: Lock certain settings if using the Tautulli docker container.
+* API:
+ * Fix: download_config, download_database, download_log, and download_plex_log API commands not working.
+ * Change: get_recently_added command 'type' parameter renamed to 'media_type'. Backwards compatibility is maintained.
+ * Change: get_home_stats command 'stats_type' parameter change to string 'plays' or 'duration'. Backwards compatibility is maintained.
+
+
+## v2.1.22 (2018-10-05)
+
+* Notifications:
+ * Fix: Notification agent settings not loading when failed to retrieve some data.
+* UI:
+ * Fix: Incorrectly showing localhost server in the setup wizard.
+* Other:
+ * Fix: Incorrect redirect to HTTP when HTTPS proxy header is present.
+ * Fix: Websocket not connecting automatically after the setup wizard.
+
+
+## v2.1.21 (2018-09-21)
+
+* Notifications:
+ * Fix: Content Rating notification condition always evaluating to True. (Thanks @Arcanemagus)
+ * Fix: Script arguments not showing substituted values in the notification logs.
+* UI:
+ * New: Unsupported browser warning when using IE or Edge.
+ * Fix: Misaligned refresh image icon in album search results. (Thanks @Sheigutn)
+ * Fix: Music history showing as pre-Tautulli in stream info modal.
+* Other:
+ * Fix: Typo in Systemd init script group value. (Thanks @ldumont)
+ * Fix: Execute permissions in Fedora/CentOS and Systemd init scripts. (Thanks @wilmardo)
+ * Fix: Systemd init script instructions per Linux distro. (Thanks @samwiseg00)
+ * Change: Fallback to Tautulli data directory if logs/backup/cache/newsletter directories are not writable.
+ * Change: Check for alternative reverse proxy headers if X-Forwarded-Host is missing.
+
+
+## v2.1.20 (2018-09-05)
+* No changes.
+
+
+## v2.1.20-beta (2018-09-02)
+
+* Monitoring:
+ * Fix: Fetch messing season info when "Hide Seasons" is enabled for a show.
+ * Fix: Video and Audio details sometimes missing on activity cards.
+* Notifications:
+ * New: Added UTC timestamp to notification parameters. (Thanks @samwiseg00)
+ * New: Added TAUTULLI_PUBLIC_URL to script environment variables. (Thanks @samwiseg00)
+* UI:
+ * Change: Automatically redirect '/' to HTTP root if enabled.
+* API:
+ * New: Added return_hash parameter to pms_image_proxy command.
+ * New: Added session_id parameter to get_activity command.
+* Other:
+ * Change: Linux systemd startup script to use the "tautulli" group permission. (Thanks @samwiseg00)
+
+
+## v2.1.19-beta (2018-08-19)
+
+* Notifications:
+ * New: Added Webhook notification agent.
+ * Fix: Scripts failing due to unicode characters in substituted script arguments.
+ * Change: Ability to override PYTHONPATH for scripts.
+ * Remove: Notify My Android notification agent.
+* Newsletters:
+ * New: Added option for threaded newsletter emails.
+ * Fix: Missing space in newsletter format.
+* UI:
+ * New: Added Windows system tray icon.
+ * Fix: Plex OAuth not working with Plex remote access disabled. (Thanks @samwiseg00)
+* API:
+ * Fix: SQL command creating a database backup every time. (Thanks @samwiseg00)
+
+
+## v2.1.18 (2018-07-27)
+
+* Monitoring:
+ * Fix: Progress bar on activity cards showing incorrect 100% when starting a stream.
+* Notifications:
+ * Fix: Notification text boxes scrolling to top when inputting text.
+ * Change: Skip formatting invalid notification parameters instead of returning default text.
+* UI:
+ * Fix: Padding around search bar causing the navigation bar to break on smaller screens.
+
+
+## v2.1.17-beta (2018-07-22)
+
+* Notifications:
+ * Change: Use default selected stream for media info in notifications.
+* UI:
+ * New: Automatically discover localhost Plex servers in server selection dropdown.
+ * Change: Save Datatables state indefinitely.
+
+
+## v2.1.16-beta (2018-07-06)
+
+* Monitoring:
+ * Fix: Plex server not detected as down during sudden network loss.
+* Notifications:
+ * Fix: Incorrect rounding of percentages in some cases.
+ * Fix: Incorrect stream duration value for playback start notifications.
+ * New: Added critic rating parameter for Rotten Tomatoes ratings.
+* Newsletters:
+ * Fix: Typo in "seasons" when there is only one additional season.
+* UI:
+ * New: Added ability to use Plex OAuth to login to Tautulli.
+* API:
+ * Fix: Unicode characters causing get_logs command to return bad data.
+ * New: Added rating_image and audience_rating_image to get_activity and get_metadata commands.
+
+
+## v2.1.15-beta (2018-07-01)
+
+* Monitoring:
+ * Fix: Progress percent displaying NaN for live TV.
+ * Fix: Unable to terminate sessions with unicode characters in the message.
+ * Change: Tizen platform to display the Samsung icon.
+* Notifications:
+ * New: Added PYTHONPATH to script environment variables so scripts can automatically import from Tautulli libraries.
+ * Fix: Proper handling of unicode script arguments.
+ * Fix: Incorrect TAUTULLI_URL environment variable if the HTTP host setting is changed.
+ * Fix: Email addresses selectize box not expanding.
+* Newsletters:
+ * Change: HTTPS URLS for images hosted on tautulli.com.
+* Graphs:
+ * Fix: SD resolution sometimes not grouped together.
+
+
+## v2.1.14 (2018-06-21)
+
+* Notifications:
+ * Fix: Parsing script arguments in quotes.
+* UI:
+ * Fix: Slow loading due to Font Awesome 5 javascript.
+ * Change: Play counts on user an library pages now respect the history grouping setting.
+* API:
+ * New: Added optional grouping parameter to user and library watch statistics.
+
+
+## v2.1.13 (2018-06-16)
+
+* Monitoring:
+ * Fix: Soft crash when viewing photos not in an album.
+* Notifications:
+ * New: Added current date and time notification parameters.
+* UI:
+ * New: Added support page with embedded Discord chat using WidgetBot.
+
+
+## v2.1.12 (2018-06-08)
+
+* Notifications:
+ * Change: Blank notification link source means disabled instead of default.
+* Newsletters:
+ * New: Make collection tags available in the raw newsletter data for custom templates.
+* API:
+ * New: Ability to terminate a stream using the session key.
+
+
+## v2.1.11-beta (2018-06-02)
+
+* Monitoring:
+ * Fix: Activity progress bar not updating in some cases.
+ * Fix: Monitory Remote Access setting disabled due to Plex Media Server API changes.
+ * Change: Improved logic for grouping history items without being successive plays.
+* Notifications:
+ * New: Added filename to notification parameters.
+* Other:
+ * Fix: Update metadata failing for tracks without track numbers.
+
+
+## v2.1.10-beta (2018-05-28)
+
+* Monitoring:
+ * Fix: Improved monitoring of live tv sessions.
+ * Change: Use track artist instead of album artist.
+* Notifications:
+ * New: Added timestamp to Discord notification embeds. (Thanks @samwiseg00)
+ * New: Enable notifications for "clip" media types.
+ * Fix: Actually add the "live" notification parameter.
+ * Change: Update Twitter for 280 characters.
+ * Change: Use HTTPS url for Cloudinary images.
+* Newsletters:
+ * Fix: Artist summaries not showing up on newsletter cards.
+ * Change: Do not send the newsletter if the template fails to render.
+
+
+## v2.1.9 (2018-05-21)
+
+* Notifications:
+ * New: Added "live" to notification parameters.
+
+
+## v2.1.8-beta (2018-05-19)
+
+* Newsletters:
+ * New: Added authentication options for self-hosted newsletters.
+ * Change: Check if the Tautulli footer has been removed in custom newsletter templates.
+* Notifications:
+ * Fix: Cloudinary images not working for Twitter notifications.
+* API:
+ * Fix: Return proper HTTP status codes for errors.
+
+
+## v2.1.7-beta (2018-05-13)
+
+* Newsletters:
+ * New: Option to toggle between inline or internal CSS style templates.
+ * New: Button to delete all uploaded images from Imgur/Cloudinary.
+ * Fix: Long titles overflowing the newsletter cards.
+ * Change: Self-hosted images on newsletters to use the /image endpoint instead of proxying through /newsletter/image.
+ * Change: Strip whitespace from newsletter for smaller file size before sending to email.
+* API:
+ * New: Added get_stream_data command to API.
+ * New: Added newsletter API commands to documentation.
+
+
+## v2.1.6-beta (2018-05-09)
+
+* Newsletters:
+ * Change: Setting to specify static URL ID name instead of using the newsletter ID number.
+ * Change: Reorganize newsletter config options.
+
+
+## v2.1.5-beta (2018-05-07)
+
+* Newsletters:
+ * New: Added setting for a custom newsletter template folder.
+ * New: Added option to enable static newsletter URLs to retrieve the last sent scheduled newsletter.
+ * New: Added ability to change the newsletter output directory and filenames.
+ * New: Added option to save the newsletter file without sending it to a notification agent.
+ * Fix: Check for disabled image hosting setting.
+ * Fix: Cache newsletter images when refreshing the page.
+ * Fix: Refresh image from the Plex server when uploading to image hosting.
+ * Change: Allow all image hosting options with self-hosted newsletters.
+* UI:
+ * Change: Don't retrieve recently added on the homepage if the Plex Cloud server is sleeping.
+* Other:
+ * Fix: Imgur database upgrade migration.
+
+
+## v2.1.4 (2018-05-05)
+
+* Newsletters:
+ * Fix: Newsletter URL without an HTTP root.
+
+
+## v2.1.3-beta (2018-05-04)
+
+* Newsletters:
+ * Fix: HTTP root doubled in newsletter URL.
+ * Fix: Configuration would not open with failed hostname resolution.
+ * Fix: Schedule one day off when using weekday names in cron.
+ * Fix: Images not refreshing when changed in Plex.
+ * Fix: Cloudinary upload with non-ASCII image titles.
+* Other:
+ * Fix: Potential XSS vulnerability in search.
+
+
+## v2.1.2-beta (2018-05-01)
+
+* Newsletters:
+ * New: Added Cloudinary option for image hosting.
+* Notifications:
+ * New: Added Message-ID to Email header (Thanks @Dam64)
+ * Fix: Posters not showing up on Twitter with self-hosted images.
+ * Fix: Incorrect action parameter for new device notifications.
+ * Change: Hardcode Pushover sound list instead of fetching the list every time.
+* API:
+ * Fix: Success result for empty response data.
+ * Change: Do not send notification when checking for Tautulli updates via the API.
+
+
+## v2.1.1-beta (2018-04-11)
+
+* Monitoring:
+ * Fix: Live TV transcoding showing incorrectly as direct play.
+* Newsletters:
+ * New: Added week number as parameter. (Thanks @samip5)
+ * Fix: Fallback to cover art on the newsletter cards.
+ * Change: Option to set newsletter time frame by calendar days or hours.
+* Notifications:
+ * New: Added week number as parameter. (Thanks @samip5)
+* Other:
+ * New: Added plexapi library for custom scripts.
+
+
+## v2.1.0-beta (2018-04-07)
+
+* Newsletters:
+ * New: A completely new scheduled newsletter system.
+ * Beautiful HTML formatted newsletter for recently added movies, TV shows, or music.
+ * Send newsletters on a daily, weekly, or monthly schedule to your users.
+ * Customize the number of days of recently added content and the libraries to include on the newsletter.
+ * Add a custom message to be included on the newsletter.
+ * Option to either send an HTML formatted email, or a link to a self-hosted newsletter on your own domain to any notification agent.
+* Notifications:
+ * New: Ability to use self-hosted images on your own domain instead of using Imgur.
+
+
+## v2.0.28 (2018-04-02)
+
+* Monitoring:
+ * Fix: Homepage activity header text.
+
+
+## v2.0.27 (2018-04-02)
+
+* Monitoring:
+ * Change: Move activity refresh interval setting to the settings page.
+
+
+## v2.0.26-beta (2018-03-30)
+
+* Monitoring:
+ * New: Setting to change the refresh interval on the homepage.
+ * Fix: Identify extras correctly on the activity cards.
+* Notifications:
+ * Change: Send Telegram image and text separately if the caption is longer than 200 characters.
+* UI:
+ * Fix: Error when clicking on synced playlist links.
+
+
+## v2.0.25 (2018-03-22)
+
+* Monitoring:
+ * Fix: Websocket not reconnecting causing activity monitoring and notifications to not work.
+ * Fix: Error checking for synced streams without Plex Pass.
+
+
+## v2.0.24 (2018-03-18)
+
+* Monitoring:
+ * Fix: Fix stream data not showing for history recorded before v2.
+* Notifications:
+ * Fix: Set all environment variables for scripts.
+ * Change: Moved all notification agent instructions to the wiki.
+ * Change: XBMC notification agent renamed to Kodi.
+ * Change: OSX Notify notification agent renamed to macOS Notification Center.
+
+
+## v2.0.23-beta (2018-03-16)
+
+* Monitoring:
+ * Fix: Certain transcode stream showing incorrectly as direct play in history. Fix is not retroactive.
+* Notifications:
+ * New: Added season/episode/album/track count to notification parameters.
+ * New: Added "Value 3" setting for IFTTT notifications.
+ * New: Set PLEX_URL, PLEX_TOKEN, TAUTULLI_URL, and TAUTULLI_APIKEY environment variables for scripts.
+ * Fix: Notifications failing to send with invalid custom conditions json.
+ * Fix: Email notifications failing with unicode username/passwords.
+ * Change: Facebook Graph API version updated to v2.12.
+* UI:
+ * New: Show the Plex Server URL in the settings.
+ * Fix: Incorrect info displayed in the Tautulli login logs.
+* API:
+ * Fix: API returning empty data if a message was in the original data.
+ * Change: get_server_id command returns json instead of string.
+* Other:
+ * Fix: Forgot git pull when changing branches in the web UI.
+
+
+## v2.0.22 (2018-03-10)
+
+* Tautulli v2 release!
+
+
+## v2.0.22-beta (2018-03-09)
+
+* Notifications:
+ * Fix: Pushover notifications failing with priority 2 is set.
+ * Fix: Expanding selectize box for some notification agent settings.
+* Other:
+ * Fix: Update check failing when an update is available.
+ * Fix: Item count incorrect for photo libraries.
+
+
+## v2.0.21-beta (2018-03-04)
+
+* Monitoring:
+ * New: Identify if a stream is using Plex Relay.
+ * Change: Don't ping the Plex server if the websocket is disconnected.
+* Notifications:
+ * Fix: Pause/resume state not being sent correctly in some instances.
+* Other:
+ * New: Add Patreon donation method.
+ * Fix: Catch failure to send analytics.
+ * Fix: IP address connection lookup error when the country is missing.
+ * Change: Updated all init scripts to Tautulli.
+ * Change: Move database to tautulli.db.
+ * Change: Move logs to tautulli.log.
+ * Change: Move startup file to Tautulli.py.
+
+
+## v2.0.20-beta (2018-02-24)
+
+* Notifications:
+ * New: Add poster support for Pushover notifications.
+ * New: Add poster support for Pushbullet notifications.
+ * Fix: Incorrect Plex/Tautulli update notification parameter types.
+ * Change: Poster and text sent as a single message for Telegram.
+ * Change: Posters uploaded directly to Telegram without Imgur.
+* UI:
+ * New: Add "Delete" button to synced items table on user pages.
+ * Fix: Button spacing/positioning on mobile site.
+ * Fix: Music statistic cards not using the fallback thumbnail.
+ * Fix: Logo not showing up when using an SVG.
+ * Change: Graphs now respect the "Group History" setting.
+* API:
+ * New: Add grouping to graph API commands.
+* Other:
+ * New: Added Google Analytics to collect installation metrics.
+ * Fix: Reconnecting to the Plex server when server settings are not changed.
+
+
+## v2.0.19-beta (2018-02-16)
+
+* Monitoring:
+ * Fix: Connect to Plex Cloud server without keeping it awake.
+ * Fix: Reconnect to Plex Cloud server after the server wakes up from sleeping.
+* Notifications:
+ * Fix: Don't send Plex Server Up/Down notifications when Tautulli starts up.
+ * Change: Better handling of Watched notifications.
+* UI:
+ * New: Added Plex server selection dropdown in the settings.
+ * Fix: Libraries and Users tables not refreshing properly.
+ * Change: Updated the masked info shown to guests.
+ * Change: Check for updates without refreshing to the homepage.
+* API:
+ * New: Added update_check to the API.
+ * Fix: delete_media_info_cache not deleting the cache.
+ * Change: Document "refresh" parameter for get_library_media_info.
+* Other:
+ * Fix: Show the full changelog since v2 on a fresh install.
+
+
+## v2.0.18-beta (2018-02-12)
+
+* Notifications:
+ * Fix: Default text for Tautulli update notifications using the wrong parameter.
+ * Fix: Playback pause and resume notifications only triggering once.
+ * Change: Negative operators for custom conditions now use "and" instead of "or".
+* UI:
+ * New: Added button to delete the 3rd party lookup info from the info pages.
+ * Fix: Missing host info in the login logs when logging in using Firefox.
+ * Change: Cleaned up settings. Advanced settings are now hidden behind a toggle.
+* API:
+ * New: Updated API documentation for v2.
+* Other:
+ * Fix: DeprecationWarning when using HTTPS with self-signed certificates.
+ * Change: Deleting the Imgur poster URL also deletes the poster from Imgur (only available for new uploads).
+ * Change: GitHub repository moved to Tautulli/Tautulli. Old GitHub URLs will still work.
+
+
+## v2.0.17-beta (2018-02-03)
+
+* Notifications:
+ * Fix: Unable to use @ mentions tags for Discord and Slack.
+ * New: Added Zapier notification agent.
+* API:
+ * Fix: get_synced_items returning no results.
+ * Fix: get_library_media_info returning incorrect media type for photo albums.
+ * Fix: get_library_media_info not being able to sort by title.
+
+
+## v2.0.16-beta (2018-01-30)
+
+* Monitoring:
+ * Fix: Timestamp sometimes showing as "0:60" on the activity cards.
+ * Fix: Incorrect session information being shown for playback of synced content.
+ * Fix: Sessions not being stopped when "Playback Stopped" notifications were enabled.
+* UI:
+ * Fix: Stream resolution showing up as "unknown" on the graphs.
+ * New: Added user filter to the Synced Items table.
+* Other:
+ * New: Option to use the Plex server update channel when checking for updates.
+
+
+## v2.0.15-beta (2018-01-27)
+
+* Monitoring:
+ * Fix: Live TV sessions not being stopped in History.
+ * Fix: Stream location showing as "unknown" on the activity cards.
+ * New: Improved Live TV details on the activity cards.
+* Notifications:
+ * New: Added labels and collections to notification parameters.
+ * New: Added more server details to notification parameters.
+ * Change: Renamed "PlexPy" update notification parameters to "Tautulli".
+
+
+## v2.0.14-beta (2018-01-20)
+
+* Monitoring:
+ * Change: Added "Cellular" bandwidth to "WAN" in activity header.
+* Notifications:
+ * Fix: Plex Web URL for tracks now go to the album page.
+ * Fix: Recently added notifications being sent for the entire library when DVR EPG data was refreshed.
+ * Fix: Notifier settings not loading with an apostrophe in the custom condition values.
+ * Fix: Custom email addresses not being saved when closing the notifier settings.
+ * Change: Re-enabled Browser notifications.
+ * Change: Renamed "PlexPy" update notification parameters to "Tautulli".
+ * Change: Emails no longer automatically insert HTML line breaks.
+ * Change: "Date" header added to email notifications.
+* UI:
+ * Change: Show all changelogs since the previous version when updating.
+
+
+## v2.0.13-beta (2018-01-13)
+
+* Notifications:
+ * New: Added dropdown selection for email addresses of shared users.
+ * New: Added more notification options for Join.
+ * Change: Show "OR" between custom condition values.
+* Other:
+ * New: Use JSON Web Tokens for authentication. Login now works with SSO applications.
+ * New: Allow the Plex server admin to login as a Tautulli admin using their Plex.tv account.
+
+
+## v2.0.12-beta (2018-01-07)
+
+* Notifications:
+ * Fix: Incorrect Plex URL parameter value.
+ * Change: Custom condition logic is now optional. An implicit "and" is applied between all conditions if the logic is blank.
+* UI:
+ * New: Added separate required LAN/WAN bandwidth in the activity header.
+* API:
+ * Fix: Notify API command not sending notifications.
+
+
+## v2.0.11-beta (2018-01-05)
+
+* Notifications:
+ * Fix: Some notification parameters showing up blank.
+* UI:
+ * Fix: Stream data showing up as "None" for pre-v2 history.
+* Other:
+ * Fix: Ability to login using the hashed password.
+
+
+## v2.0.10-beta (2018-01-04)
+
+* Monitoring:
+ * Fix: HW transcoding indicator on activity cards incorrect after refreshing.
+* Notifications:
+ * Remove: Notification toggles from library and user settings. Use custom conditions to filter out notifications instead.
+* UI:
+ * Fix: Incorrect examples for some date format options. Also added a few missing date format options. (Thanks @Tommatheussen)
+
+
+## v2.0.9-beta (2018-01-03)
+
+* Notifications:
+ * Fix: Notifications failing due to incorrect season/episode number types.
+
+
+## v2.0.8-beta (2018-01-03)
+
+* Monitoring:
+ * Fix: Incorrect HW transcoding indicator on activity cards.
+ * Fix: Long product/player names hidden behind platform icon on activity cards.
+* Notifications:
+ * Fix: Notifications failing due to some missing notification parameters.
+
+
+## v2.0.7-beta (2018-01-01)
+
+* Monitoring:
+ * Fix: Incorrect LAN/WAN location on activity cards.
+ * Fix: Paused time not recording correctly.
+* Other:
+ * Fix: Failed to retrieve synced items when there are special characters in the title.
+
+
+## v2.0.6-beta (2017-12-31)
+
+* Monitoring:
+ * New: Beta Plex Cloud support.
+ * Fix: Update paused time while still paused.
+* UI:
+ * Fix: Stopped time showing as "n/a" on history table.
+
+
+## v2.0.5-beta (2017-12-31)
+
+* Monitoring:
+ * Fix: IPv6 addresses overflowing on the activity cards.
+* Notifications:
+ * Fix: Error sending Join notifications.
+* UI:
+ * New: Added total required bandwidth in the activity header.
+* Other:
+ * Fix: Failing to retrieve releases from GitHub.
+ * Fix: CherryPy SSL connection warning. (Thanks @felixbuenemann)
+ * Fix: Sanitize script output in logs.
+ * Change: Login sessions persists across server restarts.
+
+
+## v2.0.4-beta (2017-12-29)
+
+* Monitoring:
+ * Fix: Current activity cards duplicating on the homepage.
+* Notifications:
+ * Fix: Concurrent stream notifications being sent when there is an incorrect number of streams.
+* UI:
+ * New: Info pages for collections.
+ * New: Button to test Plex Web URL override.
+ * Fix: Library and User pages return to the correct tab when pressing back.
+
+
+## v2.0.3-beta (2017-12-25)
+
+* Monitoring:
+ * Fix: Missing sync ID error causing logging to crash.
+ * Fix: Incorrect optimized version title column name causing logging to crash.
+* Notifications:
+ * Fix: Report correct beta version for Tautulli update notifications.
+* UI:
+ * Fix: Missing CSS for stream info modal.
+
+
+## v2.0.2-beta (2017-12-24)
+
+* Monitoring:
+ * Fix: Websocket connection fails to start with existing streams when upgrading to v2.
+ * Fix: Long request URI for refreshing current activity on the homepage.
+ * Fix: Missing subtitle database columns.
+ * Fix: Details for synced and optimized versions reporting incorrectly.
+* Notifications:
+ * Fix: Recently added notifications sending for previously added items. It is now limited to past 24 hours only.
+ * Fix: Source video/audio/subtitle parameters showing up as blank.
+ * Change: Validate condition logic when saving a notification agent.
+* API:
+ * Change: API is enabled by default on new installs.
+* UI:
+ * New: Add logo svg files. (Thanks @Fish2)
+ * New: Updated stream info modal.
+ * Change: Media info tables sort by sort title instead of title.
+* Other:
+ * Fix: Updating library IDs message on libraries page.
+ * Fix: Wtched percentage settings not saving after restart.
+ * Remove: Video Preview Thumbnails setting no longer used.
+ * Change: Add back HTTP Proxy setting under the Web Interface settings tab.
+ * Change: "Group Table and Watch Statistics History" and "Current Activity in History Tables" enabled by default on new installs.
+
+
+## v2.0.1-beta (2017-12-19)
+
+* Monitoring:
+ * Fix: Missing video_height database column.
+* Notifications:
+ * Fix: Join API key.
+ * Change: Temporarily disable broken browser notifications.
+* UI:
+ * Fix: Incorrect fallback image for music watch statistics.
+
+
+## v2.0.0-beta (2017-12-18)
+
+* Monitoring:
+ * New: More detailed stream info including subtitles, bitrates, bandwidth, and quality profiles.
+ * New: Terminate sessions from the current activity (Plex Pass only).
+ * Change: Monitoring uses websockets only now.
+* Notifications:
+ * New: Completely new notification system.
+ * Allow adding multiple of the same notification agent and/or duplicating existing notification agents.
+ * Each notification agent has it's own notification triggers and notification text.
+ * Notification agents are stored in the database instead of the config file. Some notification configurations may have been lost in the transfer. Sorry.
+ * New: Discord notification agent.
+ * New: GroupMe notification agent.
+ * New: MQTT notification agent.
+ * New: More customizable info cards for Discord, Facebook, Hipchat, and Slack.
+ * New: Script notifications are configured individually per script with separate arguments for each notification action.
+ * New: Icon and duration options for Plex Home Theater and XBMC notifications.
+ * New: Notification for Tautulli updates.
+ * New: Added <show>, <season>, <artist>, and <album> notification exclusion tags.
+ * <tv> is renamed to <episode>, and <music> is renamed to <track>
+ * New: Preview notification text in the notifier settings.
+ * New: Properly group recently added notifications when adding a batch of media.
+ * The {season_num}, {episode_num}, and {track_num} parameters will be substituted with the range (e.g. 06-10)
+ * New: Option to group recently added notifications by show/artist or season/album.
+ * New: More detailed media info (video, audio, subtitle, file, etc.) notification options available.
+ * New: Added notification text modifiers to change case and slice lists.
+ * New: Custom notification conditions using parameters to filter notifications.
+ * New: Button to trigger manual recently added notifications from the info pages.
+ * New: Lookup TVMaze and TheMovieDatabase links.
+ * Remove: The shared Imgur client ID has been removed. Please enter your own client ID in the settings to continue uploading posters.
+ * Change: Notifications with a blank subject or body will no longer be sent at all.
+ * Change: Line breaks inserted automatically in Email notification text.
+ * Change: Notifications for season/episodes now use the season poster and album/track now use the album art.
+ * Change: The {action} parameter is no longer capitalized.
+ * Change: Notification success or failure added to notification logs.
+* API:
+ * New: Added check for Plex Media Server updates with the Tautulli API.
+ * New: Added show/artist and episode/track titles to the "get_history" API command.
+ * New: Added manual trigger for recently added notifications.
+ * Remove: Defunct API v1.
+ * Change: The "notify" API command now requires a notifier_id instead of an agent_id. The notifier ID can be found in the settings for each notification agent.
+ * Change: The returned json for the "get_metadata" API command is no longer nested under the "metadata" key.
+* UI:
+ * New: Updated current activity, watch statistics, and library statistics cards on the home page.
+ * New: Toggle stats and recently added categories directly on the homepage.
+ * New: Ability to delete synced items from the Synced Items page.
+ * New: Updated platform icons to a uniform style.
+ * Remove: Setting for number of top items for watch statistic cards.
+ * Change: Separate API and websocket logs.
+* Android Tautulli Remote App (beta):
+ * New: Download the Tautulli Remote app on Google Play!
+ * Link the app using a QR code in the Tautulli settings.
+ * New: Push notifications directly to the Tautulli Remote app.
+* Other:
+ * New: Option to update Tautulli automatically when an update is available.
+ * New: Option to switch the tracking git remote and branch.
+ * New: Option to change the path to your git environment variable.
+ * New: Option to use a HTTPS certificate chain.
+ * New: Option to override the Plex Web URL for click-through links.
+ * New: Separate watched percentage for movies, episodes, and tracks.
+ * New: Show changelog after updating Tautulli.
+ * New: Support for IPv6 geolocation lookup.
+ * New: Download the Tautulli configuration file or database from the settings.
+ * New: Log failed Tautulli login attempts.
+ * Fix: Modal popups not working on mobile Safari.
+ * Fix: Prevent password managers from autofilling the password in the settings.
+ * Fix: Unable to search with special characters.
+ * Remove: Some unused options have been removed from the settings page.
+ * Change: The database schema has been changed, and reverting back to PlexPy v1 will not work.
+ * Change: The dev branch has been depreciated. A master/beta/nightly system is used instead.
+
+
+## v1.4.25 (2017-10-02)
+
+* Fix: Tab instead of spaces preventing startup.
+
+
+## v1.4.24 (2017-10-01)
+
+* Fix: New Plex Web urls. (Thanks @Joshua1337)
+* Fix: Fallback to the product name if the player title is blank.
+* New: Added no forking option to startup arguments. (Thanks @Vashypooh)
+
+
+## v1.4.23 (2017-09-30)
+
+* Fix: Playstation 4 platform name.
+* Fix: PlexWatch and Plexivity import.
+* Fix: Pushbullet authorization header.
+
+
+## v1.4.22 (2017-08-19)
+
+* Fix: Cleaning up of old config backups.
+* Fix: Temporary fix for incorrect source media info.
+
+
+## v1.4.21 (2017-07-01)
+
+* New: Updated donation methods.
+
+
+## v1.4.20 (2017-06-24)
+
+* New: Added platform image for the PlexTogether player.
+* Fix: Corrected math used to calculate human duration. (Thanks @senepa)
+* Fix: Sorting of 4k in media info tables.
+* Fix: Update file sizes when refreshing media info tables.
+* Fix: Support a custom port for Mattermost (Slack) notifications.
+
+
+## v1.4.19 (2017-05-31)
+
+* Fix: Video resolution not showing up for transcoded streams on PMS 1.7.x.
+
+
+## v1.4.18 (2017-04-22)
+
+* New: Added some new Arnold quotes. (Thanks @senepa)
+* Fix: Text wrapping in datatable footers.
+* Fix: API command get_apikey. (Thanks @Hellowlol)
+
+
+## v1.4.17 (2017-03-04)
+
+* New: Configurable month range for the Plays by month graph. (Thanks @Pbaboe)
+* New: Option to chanage the week to start on Monday for the the Plays by day of week graph. (Thanks @Pbaboe)
+* Fix: Invalid iOS icon file paths. (Thanks @demonbane)
+* Fix: Plex Web 3.0 URLs on info pages and notifications.
+* Fix: Update bitcoin donation link to Coinbase.
+* Fix: Update init scripts. (Thanks @ampsonic)
+
+
+## v1.4.16 (2016-11-25)
+
+* Fix: Websocket for new json response on PMS 1.3.0.
+* Fix: Update stream and transcoder tooltip percent.
+* Fix: Typo in the edit user modal.
+
+
+## v1.4.15 (2016-11-11)
+
+* New: Add stream and transcoder progress percent to the current activity tooltip.
+* Fix: Refreshing of images in the cache when authentication is disabled.
+* Fix: Plex.tv authentication with special characters in the username or password.
+* Fix: Line breaks in the info page summaries.
+* Fix: Redirect to the proper http root when restarting.
+* Fix: API result type and responses showing incorrectly. (Thanks @Hellowlol)
+* Change: Use https URL for app.plex.tv.
+* Change: Show API traceback errors in the browser with debugging enabled. (Thanks @Hellowlol)
+* Change: Increase table width on mobile devices and max width set to 1750px. (Thanks @XusBadia)
+
+
+## v1.4.14 (2016-10-12)
+
+* Fix: History logging locking up if media is removed from Plex before PlexPy can save the session.
+* Fix: Unable to save API key in the settings.
+* Fix: Some typos in the settings. (Thanks @Leafar3456)
+* Change: Disable script timeout by setting timeout to 0 seconds.
+
+
+## v1.4.13 (2016-10-08)
+
+* New: Option to set the number of days to keep PlexPy backups.
+* New: Option to add a supplementary url to Pushover notifications.
+* New: Option to set a timeout duration for script notifications.
+* New: Added flush temporary sessions button to extra settings for emergency use.
+* New: Added pms_image_proxy to the API.
+* Fix: Insanely long play durations being recorded when connection to the Plex server is lost.
+* Fix: Script notification output not being sent to the logger.
+* Fix: New libraries not being added to homepage automatically.
+* Fix: Success message shown incorrectly when sending a test notification.
+* Fix: PlexPy log level filter not working.
+* Fix: Admin username not shown in login logs.
+* Fix: FeatHub link in readme document.
+* Change: Posters disabled by default for all notification agents.
+* Change: Disable manual changing of the PlexPy API key.
+* Change: Force refresh the Plex.tv token when fetching a new token.
+* Change: Script notifications run in a new thread with the timeout setting.
+* Change: Watched percent moved to general settings.
+* Change: Use human readable file sizes to the media info tables. (Thanks @logaritmisk)
+* Change: Update pytz library.
+
+
+## v1.4.12 (2016-09-18)
+
+* Fix: PMS update check not working for MacOSX.
+* Fix: Square covers for music stats on homepage.
+* Fix: Card width on the homepage for iPhone 6/7 Plus. (Thanks @XusBadia)
+* Fix: Check for running PID when starting PlexPy. (Thanks @spolyack)
+* Fix: FreeBSD service script not stopping PlexPy properly.
+* Fix: Some web UI cleanup.
+* Change: GitHub repostitory moved.
+
+
+## v1.4.11 (2016-09-02)
+
+* Fix: PlexWatch and Plexivity import errors.
+* Fix: Searching in history datatables.
+* Fix: Notifications not sending for Local user.
+
+
+## v1.4.10 (2016-08-15)
+
+* Fix: Missing python ipaddress module preventing PlexPy from starting.
+
+
+## v1.4.9 (2016-08-14)
+
+* New: Option to include current activity in the history tables.
+* New: ISP lookup info in the IP address modal.
+* New: Option to disable web page previews for Telegram notifications.
+* Fix: Send correct JSON header for Slack/Mattermost notifications.
+* Fix: Twitter and Facebook test notifications incorrectly showing as "failed".
+* Fix: Current activity progress bars extending past 100%.
+* Fix: Typo in the setup wizard. (Thanks @wopian)
+* Fix: Update PMS server version before checking for a new update.
+* Change: Compare distro and build when checking for server updates.
+* Change: Nicer y-axis intervals when viewing "Play Duration" graphs.
+
+
+## v1.4.8 (2016-07-16)
+
+* New: Setting to specify PlexPy backup interval.
+* Fix: User Concurrent Streams Notifications by IP Address checkbox not working.
+* Fix: Substitute {update_version} in fallback PMS update notification text.
+* Fix: Check version for automatic IP logging setting.
+* Fix: Use library refresh interval.
+
+
+## v1.4.7 (2016-07-14)
+
+* New: Use MaxMind GeoLite2 for IP address lookup.
+ * Note: The GeoLite2 database must be installed from the settings page.
+* New: Check for Plex updates using plex.tv downloads instead of the server API.
+ * Note: Check for Plex updates has been disabled and must be re-enabled in the settings.
+* New: More notification options for Plex updates.
+* New: Notifications for concurrent streams by a single user.
+* New: Notifications for user streaming from a new device.
+* New: HipChat notification agent. (Thanks @aboron)
+* Fix: Username showing as blank when friendly name is blank.
+* Fix: Direct stream count wrong in the current activity header.
+* Fix: Current activity reporting direct stream when reducing the stream quality switches to transcoding.
+* Fix: Apostophe in an Arnold quote causing the shutdown/restart page to crash.
+* Fix: Disable refreshing posters in guest mode.
+* Fix: PlexWatch/Plexivity import unable to select the "grouped" database table.
+* Change: Updated Facebook notification instructions.
+* Change: Subject line optional for Join notifications.
+* Change: Line break between subject and body text instead of a colon for Facebook, Slack, Twitter, and Telegram.
+* Change: Allow Mattermost notifications using the Slack config.
+* Change: Better formatting for Slack poster notifications.
+* Change: Telegram only notifies once instead of twice when posters are enabled.
+* Change: Host Open Sans font locally instead of querying Google Fonts.
+
+
+## v1.4.6 (2016-06-11)
+
+* New: Added User and Library statistics to the API.
+* New: Ability to refresh individual poster images without clearing the entire cache. (Thanks @Hellowlol)
+* New: Added {added_date}, {updated_date}, and {last_viewed_date} to metadata notification options.
+* New: Log level filter for Plex logs. (Thanks @sanderploegsma)
+* New: Log level filter for PlexPy logs.
+* New: Button to download Plex logs directly from the web interface.
+* New: Advanced setting in the config file to change the number of Plex log lines retrieved.
+* Fix: FreeBSD and FreeNAS init scripts to reflect the path in the installation guide. (Thanks @nortron)
+* Fix: Monitoring crashing when failed to retrieve current activity.
+
+
+## v1.4.5 (2016-05-25)
+
+* Fix: PlexPy unable to start if failed to get shared libraries for a user.
+* Fix: Matching port number when retrieving the PMS url.
+* Fix: Extract mapped IPv4 address in Plexivity import.
+* Change: Revert back to internal url when retrieving PMS images.
+
+
+## v1.4.4 (2016-05-24)
+
+* Fix: Image queries crashing the PMS when playing clips from channels.
+* Fix: Plexivity import if IP address is missing.
+* Fix: Tooltips shown behind the datatable headers.
+* Fix: Current activity instances rendered in a random order causing them to jump around.
+
+
+## v1.4.3 (2016-05-22)
+
+* Fix: PlexPy not starting without any authentication method.
+
+
+## v1.4.2 (2016-05-22)
+
+* New: Option to use HTTP basic authentication instead of the HTML login form.
+* Fix: Unable to save settings when enabling the HTTP proxy setting.
+* Change: Match the PMS port when retrieving the PMS url.
+
+
+## v1.4.1 (2016-05-20)
+
+* New: HTTP Proxy checkbox in the settings. Enable this if using an SSL enabled reverse proxy in front of PlexPy.
+* Fix: Check for blank username/password on login.
+* Fix: Persist current activity artwork blur across refreshes when transcoding details are visible.
+* Fix: Send notifications to multiple XBMC/Plex Home Theater devices.
+* Fix: Reset PMS identifier when clicking verify server button in settings.
+* Fix: Crash when trying to group current activity session in database.
+* Fix: Check current activity returns sessions when refreshing.
+* Fix: Logs sorted out of order.
+* Fix: Resolution reported incorrectly in the stream info modal.
+* Fix: PlexPy crashing when hashing password in the config file.
+* Fix: CherryPy doubling the port number when accessing PlexPy locally with http_proxy enabled.
+* Change: Sort by most recent for ties in watch statistics.
+* Change: Refresh Join devices when changing the API key.
+* Change: Format the Join device IDs.
+* Change: Join notifications now sent with Python Requests module.
+* Change: Add paging for recently added in the API.
+
+
+## v1.4.0 (2016-05-15)
+
+* New: An HTML form login page with sessions support.
+* New: Guest access control for shared users using Plex.tv authentication.
+ * Enable the option in the settings and toggle guest access per user from Users > Edit mode.
+ * Guests can only view their own user data. Other user info is removed/masked.
+ * Guests can only view media from libraries that are shared with them (content rating and label filters are respected). Other libraries are removed/masked.
+ * All settings and admin controls are restricted from guests.
+ * All current activity on the server is shown, but with masked user/metadata info.
+* New: Login logs table on the User and Logs pages.
+* New: Filter the history table by user.
+* New: Filter the graphs by user. (Thanks @Otger)
+* New: Option to hash the admin passowrd in the config file.
+* New: Options to enable/disable/rearrange each section on the homepage
+* New: Toggle media types for recently added items on the homepage.
+* New: Option to enter an Imgur API client ID for uploading posters.
+ * Note: The shared Imgur client id will be removed in a future PlexPy update! Please enter your own client id in the settings to continue uploading posters!
+* New: HTML support for Email.
+* New: Posters and HTML support for Telegram.
+* New: Poster support for Slack.
+* New: Poster support for Twitter.
+* New: Re-added Plex Home Theater notification agent.
+* New: Browser notification agent (experimental).
+* New: Added {plex_url} as a notification option.
+* New: Added transcode decision to the activity header.
+* New: Documentation for APIv2 (see API.md for details).
+* New: Import a Plexivity database into PlexPy.
+* New: Prettier fallback image for art/episodes.
+* New: Prettier confirm modal dialogues.
+* New: Cache images to reduce Plex API calls. This can be disabled in the under Settings > Extra Settings. (Thanks @Hellowlol)
+* New: Scheduled backups of the config file.
+* New: Button to clear the PlexPy cache/images in the settings.
+* New: Button to manually backup the PlexPy database/config in the settings.
+* New: Button to clear the PlexPy logs in the settings.
+* New: Button to download PlexPy log file on the Logs tab.
+* New: Advanced setting in config file to change the Plex API timeout value.
+* Fix: Mixed content HTTP request in settings (for reverse proxies with SSL).
+* Fix: Rename recently "watched" music to "played".
+* Change: Current activity details now persists across refreshes.
+* Change: Smoother transitions between preview thumbnails in current activity.
+* Change: Datatables now display all columns and scroll horizontally on smaller screens.
+* Change: Ability to change the base URL for reverse proxies in the web interface.
+* Change: Added a "Verify Server" button in the settings.
+* Change: Added request status code in the logs for notifer errors.
+* Change: Remove in-memory logs and read lines from log file instead. (Thanks @Hellowlol)
+* Change: Limit number of failed attempts to write sessions to history. Default is 5 attempts.
+* Change: A bunch of UI updates.
+* Change: A bunch of backend code cleanup.
+* Removed: All unused Python packages.
+
+
+## v1.3.16 (2016-05-01)
+
+* Fix: Viewing photos crashing PlexPy.
+* Fix: Persist Users > Edit mode on datatable page change.
+* Fix: PMS update notifications broken.
+* Change: Cache notifications poster with thread ID to avoid overwritting images.
+
+
+## v1.3.15 (2016-04-18)
+
+* Fix: Slack notifications failing when using and icon URL.
+* Fix: 127.0.0.1 showing as an external IP address on the history tables.
+* Fix: Regression file sizes not shown in the media info table footer.
+* Fix: Retrieving proper PMS URL when multiple connections are published to plex.tv.
+* Fix: Some typos in the logger.
+* Fix: Some other typos in the WebUI. (Thanks @xtjoeytx)
+* Change: Optimized mobile web app icons and spash screens. (Thanks @alotufo)
+
+
+## v1.3.14 (2016-03-29)
+
+* Fix: Regression for missing notify_action for script notifications.
+* Fix: Typo for home stats cards in the settings.
+
+
+## v1.3.13 (2016-03-27)
+
+* Fix: Only mask strings longer than 5 characters in logs.
+
+
+## v1.3.12 (2016-03-27)
+
+* Fix: "Check GitHub for updates" not rescheduling when toggling setting.
+* Fix: Bug where notifications would fail if metadata is not found.
+* Fix: Bug where notifications would fail if unable to upload poster to Imgur.
+* Fix: PlexPy will now start properly for different Python environment variables.
+* New: Feature requests moved to FeatHub.
+* New: Ability to specify a GitHub API token for updates (optional).
+* New: Mask out sensitive information from the logs.
+* New: New and updated Arnold quotes. (Thanks @Vilsol & @Chrisophogus)
+* New: "First" and "Last" page buttons to datatables.
+* New: Access log file from the "Help & Info" page.
+* New: CherryPy environment options (for development). (Thanks @codedecay)
+* New: PlexPy development environment (for development only).
+* Change: Facebook posts with a posters now include a summary.
+* Change: Facebook posts now use a default poster if the poster is not found or unable to upload to Imgur.
+* Change: IFTTT events can be fromatted with the {action} name.
+* Change: Logs now use ISO date format to avoid locale encoding errors. (Thanks @alshain)
+* Remove: Non-functioning Plex notification agent.
+
+
+## v1.3.11 (2016-03-15)
+
+* Fix: Typo preventing history logging for websockets.
+
+
+## v1.3.10 (2016-03-12)
+
+* Fix: Actually allow HTML tags for Pushover.
+* Fix: PlexPy not restarting on Windows if there is a space in the folder path.
+* Fix: Reconnect websocket when changing PMS SSL setting.
+* Fix: Datatables not loading when view_offset or duration is blank.
+* Fix: Bug when checking the PMS version in the settings.
+* Fix: Auto-refreshing of log tables.
+* Fix: Logging of IPv6 addresses. (PMS version >0.9.14 only.)
+* Fix: Hide days selection from the Play Totals graph page.
+* Fix: PlexPy overwriting user's own SSL certificate/key.
+* Fix: Multiple watched notifications when using websocket.
+* Fix: Some missing python library imports.
+* Fix: Some typos in settings and PlexWatch importer.
+* New: Ability to get notified of PMS updates.
+* New: Ability to disable the link to Plex Web with Facebook notifications and use IMDB, TVDB, TMDb, or Last.fm instead.
+* New: Ability to reset Imgur poster url from the info page if the poster is changed.
+* New: Tooltips on the current activity progress bars.
+* New: Side scrolling of Recently Added/Recently Played items.
+* New: Document all date/time format options.
+* New: Button to clear notification logs.
+* New: Customizable backup, cache, and log directories.
+* Change: Retry writing sessions to history if it fails, so sessions don't get lost. (Activity pinger only, not availble for websocket.)
+* Change: Save any unknown sessions to the "Local" user.
+* Change: History table modal is filtered depending on which graph series is clicked.
+* Change: Revert back to saving the state of datatables (search, sorting, entries per page, etc.).
+* Change: Newlines are not longer stripped from notification text which allows for finer control of how notifications look.
+* Change: Updated FreeNAS/FreeBSD init scripts. (Must have updated jails.) (Thanks @chiviak)
+
+
+## v1.3.9 (2016-02-21)
+
+* Fix: Recently added notification not sent to all notification agents.
+* New: Pushover HTML support. (Thanks @elseym)
+
+
+## v1.3.8 (2016-02-21)
+
+* Fix: Regression unable to clear HTTP password.
+* Fix: Remove media tags from script arguments for server notifications.
+* Fix: Encode poster titles to UTF-8 for Imgur upload.
+* Fix: Allow notifications to send without poster if Imgur upload fails.
+* New: Notification Logs table in the Logs tab.
+* New: Toggle in settings to enable posters in notifications. (Disabled by default.)
+* Change: Save Imgur poster URL to database so upload is not needed every time.
+* Change: Notify log in database to log each event as a separate entry.
+* Change: Monitor remote access is unchecked if remote access is disabled on server.
+
+
+## v1.3.7 (2016-02-20)
+
+* Fix: Verifying server with SSL enabled.
+* Fix: Regression where {stream_duration} reported as 0.
+* Fix: Video metadata flags showing up for track info.
+* Fix: Custom library icons not applied to Library Statistics.
+* Fix: Typos in the Web UI.
+* New: ETA to Current Activity overlay.
+* New: Total duration to Libraries and Users tables.
+* New: {machine_id} to notification options.
+* New: IMDB, TVDB, TMDb, Last.fm, and Trackt IDs/URLs to notification options.
+* New: {poster_url} to notification options using Imgur.
+* New: Poster and link for Facebook notifications.
+* New: Log javascript errors from the Web UI.
+* New: Configuration and Scheduler info to the settings page.
+* New: Schedule background task to backup the PlexPy database.
+* New: URL anonymizer for external links.
+* New: Plex Media Scanner log file to Log viewer.
+* New: API v2 (sill very experimental). (Thanks @Hellowlol)
+* Change: Allow secure websocket connections.
+* Change: History grouping now accounts for the view offset.
+* Change: Subject line can be toggled off for Facebook, Slack, Telegram, and Twitter.
+* Change: Create self-signed SSL certificates when enabling HTTPS.
+* Change: Revert homepage "Last Played" to "Last Watched".
+* Change: Disable monitor remote access checkbox if remote access is not enabled on the PMS.
+* Change: Disable IP logging checkbox if PMS version is 0.9.14 or greater.
+
+
+## v1.3.6 (2016-02-03)
+
+* Fix: Regression where {duration} not reported in minutes.
+* Fix: Proper daemonizing in FreeBSD and FreeNAS init scripts.
+* Change: Update readme documentation.
+
+
+## v1.3.5 (2016-02-02)
+
+* Fix: Removing unique constraints from database.
+* Fix: Unable to expand media info table when missing "Added At" date.
+* Fix: Server verification for unpublished servers.
+* Fix: Updating PMS identifier for server change.
+* New: {stream_time}, {remaining_time}, and {progress_time} to notification options.
+* New: Powershell script support. (Thanks @Hellowlol)
+* New: Method to delete duplicate libraries.
+* Change: Daemonize before running start up tasks.
+
+
+## v1.3.4 (2016-01-29)
+
+* Fix: Activity checker not starting with library update (history not logging).
+* Fix: Libraries duplicated in database.
+* Fix: Buffer notifications even when disabled when using websockets.
+* Fix: Libraries and Users lists not refreshing.
+* Fix: Server verification in settings.
+* Fix: Empty libraries not added to database.
+* New: Unique identifiers to notification options.
+* Remove: Requirement of media type toggles for recently added notifications.
+* Remove: Built in Twitter key and secret.
+* Change: Unnecessary quoting of script arguments.
+* Change: Facebook notification instructions.
+
+
+## v1.3.3 (2016-01-26)
+
+* Fix: Plays by Month graph not loading.
+* Change: Disable caching for datatables.
+* Change: Improved updating library data in the database again.
+
+
+## v1.3.2 (2016-01-24)
+
+* Fix: 'datestamp' and 'timestamp' for server notifications.
+* Change: New method for updating library data in database.
+
+
+## v1.3.1 (2016-01-23)
+
+* Fix: Notifiers authorization popups for reverse proxies.
+* Fix: Empty brackets in titles on tables.
+* Fix: Star rating overlapping text.
+* Fix: Unable to startup when library refresh fails.
+* Fix: Unable to parse 'datestamp' and 'timestamp' format.
+* Change: Rename "Last Watched" to "Last Played".
+* Change: More descriptive libraries updating message.
+
+
+## v1.3.0 (2016-01-23)
+
+* New: Brand new Libraries section.
+* New: Lots of new library statistics.
+* New: Media info table for libraries.
+* New: Web app for Android and iOS. (Thanks @zobe123)
+* New: Slack notification agent. (Thanks @richipargo)
+* New: Facebook notification agent.
+* New: Custom script notification agent. (Thanks @Hellowlol)
+* New: Custom "From Name" to email notification agent.
+* New: Ability to test notifications / send custom one-off notifications.
+* New: 'datestamp' and 'timestamp' notification options.
+* New: More concurrent stream statistics.
+* New: Media info flags on the info pages.
+* New: Ability to fix broken metadata if the item has been moved in Plex.
+* New: Ability to rearrange the homepage statistics cards.
+* New: CentOS startup script (Thanks @PHoSawyer)
+* Fix: Server name blank after first run wizard.
+* Fix: Incorrect duration for grouped home stats.
+* Fix: Allow SSL when verifying server in settings.
+* Fix: Metadata for grouped recently added notifications.
+* Fix: Unable to access settings with missing changelog file.
+* Fix: Month name localization on play totals graphs.
+* Fix: Get new PMS identifier when changing servers.
+* Fix: Websocket log spam when there is no active session.
+* Fix: Logs and cache folder not created in the data directory.
+* Fix: Title links on sync table.
+* Fix: Other various minor bugs and graphical glitches.
+* Change: Prettier thumbnail popovers on tables.
+* Change: Star ratings to use css/font-awesome.
+* Change: More detailed logging info to warnings and errors.
+* Change: Better PlexPy process restart handling (Thanks @jackwilsdon)
+* Change: Massive behind the scenes code cleanup.
+* Remove: Built in Pushover API token (User's own API token is now required).
+
+
+## v1.2.16 (2015-12-22)
+
+* Fix Most Concurrent stream stat for emtpy databases
+* Change logs to 50 lines by default
+
+
+## v1.2.15 (2015-12-20)
+
+* Fix navbar covering current activity on smaller screens.
+* Fix metadata for grouped recently added notifications.
+* Fix Growl notification agent not working.
+* Change graph days selection.
+* Change watch statistics to match table history grouping.
+* Add automatic discovery of Pushbullet devices.
+* Add Most Concurrent Streams watch statistic.
+* Add precentage to current activity progress bars.
+* Add a bunch of stream details to notification options.
+* Add notification for Plex Remote Access/Plex Media Server back up.
+* Add CC/BCC and multiple recipients to email notification agent.
+* Add total watch time to history table footer.
+
+
+## v1.2.14 (2015-12-07)
+
+* Fix regression with PlexWatch db importer and buffer warnings.
+
+
+## v1.2.13 (2015-12-06)
+
+* Fix match newlines between tags in notification text.
+* Fix current activity not showing on PMS 0.9.12.
+
+
+## v1.2.12 (2015-12-06)
+
+* Fix for "too many open files" error.
+
+
+## v1.2.11 (2015-12-06)
+
+* Fix more regressions (sorry).
+
+
+## v1.2.10 (2015-12-06)
+
+* Fix broken count graphs regression.
+
+
+## v1.2.9 (2015-12-06)
+
+* Fix and improve text sanitization.
+
+
+## v1.2.8 (2015-12-06)
+
+* Fix sanitize player names
+* Fix recently added notification delay
+* Fix recently added metadata queries
+* Fix multiple lines in notification body text
+* Fix UTF-8 encoding in Prowl notifications subject line
+* Change to only log IPv4 addresses
+* Add global toggle for recently added notifcations
+* Add feature to delete users
+* Add channel support for Telegram notification agent
+* Add icon for Apple tvOS
+* Add icon for Microsoft Edge
+
+
+## v1.2.7 (2015-11-27)
+
+* Fix IP address option in notifications
+
+
+## v1.2.6 (2015-11-27)
+
+* Fixes for IP logging in PMS < 0.9.14.x.
+* Fix issue in plexWatch importer when trying to import item with no ratingKey.
+
+
+## v1.2.5 (2015-11-25)
+
+* Add video_decision and audio_decision to notification options
+* Fix IP address logging
+* Fix log spam if notifications disabled
+
+
+## v1.2.4 (2015-11-24)
+
+* Add filtering by media type in the history table
+* Add IFTTT notification agent
+* Add Telegram notification agent
+* Add notifications for recently added media
+* Add notifications for server down and remote access down
+* Add more metadata to notifications options
+* Add IP address to notification options (for PMS 0.9.14 and above)
+* Add server uptime to notification options
+* Add IP address to current activity
+* Add IPv6 address logging
+* Add PMS server name to the page title
+* Fix bug in "Last Watched" statistic
+* Fix bug in search query
+* Fix bug on user pages for usernames with single quotes
+* Fix name for new Plex Media Center
+* Fix Pushover notifications with unicode characters
+* Fix bug with showing old usernames in datatables
+* Fix bug with "Please verify your server" in settings
+* Change IP lookup provider
+* Change notifications custom body text to larger text box
+* Change movie/tv logging and notifications into individual options
+
+
+## v1.2.3 (2015-10-18)
+
+* Added "remaining time" as notification substitution.
+* Fix bug on home stats cards.
+* Fix visual bug on user page.
+
+
+## v1.2.2 (2015-10-12)
+
+* Add server discovery on first run.
+* Add column to tables for Platform.
+* Add link to top level breadcrumbs on info pages.
+* Add ability to change notification sounds for Pushover and Boxcar.
+* Show watched percentage tooltip on progress column in history tables.
+* More logging in event an http request fails.
+* Code cleanups and other fixes.
+* Fix ordering on sync table.
+* Fix bug on home stats cards.
+* Fix bug on activity pane where music details were not shown.
+
+
+## v1.2.1 (2015-09-29)
+
+* Fix for possible issue when paused_counter is null.
+
+
+## v1.2.0 (2015-09-29)
+
+* Added option to group consecutive plays in the history tables.
+* Added option for websocket monitoring (still slightly experimental and disabled by default).
+* Added global search option (searches your Plex library).
+* Added option to update any items that may have had their rating keys changed.
+* Added option to disable consecutive notifications.
+* Some visual tweaks and fixes.
+* Fix bug where monitoring wouldn't start up after first run.
+* Fix bug showing incorrect transcode decisions for music tracks on history tables.
+
+
+## v1.1.10 (2015-09-20)
+
+* Added dedicated settings section for home stats configuration with ability to show/hide selected stats and sections.
+* Added support for Twitter notifications.
+* Only show music in graphs if music logging is enabled.
+* The monitoring ignore interval now excludes paused time.
+* Fix display bug on activity panel which incorrectly reported transcoding sometimes.
+* Fix bug with Email notification TLS checkbox when it would be disabled by changing any other settings afterwards.
+* Fix issue on some Python releases where the webbrowser library isn't included.
+
+
+## v1.1.9 (2015-09-14)
+
+* Another JonnyWong release. I'm going to stop thanking you now ;)
+* Add music plays to graphs.
+* Add info pages for music items.
+* Add music to user recently watched items.
+* Add photo views to Activity pane (photos are not logged).
+* Fix token validation message on Settings page.
+* Fix some "Mystery" platform names.
+* Fix paused time be counted for graph data.
+* Other small bug fixes.
+
+
+## v1.1.8 (2015-09-09)
+
+* Add platform images for Windows devices. Thanks @JonnyWong.
+* Add click-through to PlexWeb preplay page from info page. Thanks @JonnyWong.
+* Fix broken delete option on info pages. Thanks @JonnyWong.
+* Fix tagline bug in PlexWatch db import tool.
+* Fix home stats text overflow bug. Thanks @JonnyWong.
+
+
+## v1.1.7 (2015-09-07)
+
+* Show tagline in info screens for movies. Thanks @JonnyWong.
+* Add play/pause/buffer icon to activity pane. Thanks @JonnyWong.
+* Add transcoder info in activity pane info. Thanks @JonnyWong.
+* Show transcoder progress on activity progress bar. Thanks @JonnyWong.
+* Fix bug where custom notification strings would be ignored if unicode characters were present.
+* Fix text overflow issue on home stats cards. Thanks @JonnyWong.
+* Fix regression with user friendly name change input in edit screen. Thanks @JonnyWong.
+
+
+## v1.1.6 (2015-09-06)
+
+* Home stats cards are now expandable to show multiple items. Configurable in settings. Thanks @JonnyWong.
+* Completely redesigned media info pages. Thanks @JonnyWong.
+* Redesigned activity pane to match Plex Web more closely. Thanks @JonnyWong.
+* New Library stats on home page, shows total item counts per library. Thanks @JonnyWong.
+* New last watched card in home stats. Shows last watched items. Thanks @JonnyWong.
+* Improved some layout issues on mobile devices. Thanks @JonnyWong.
+* Fixed issue where some clip/channel items are reported as episodes and causing exceptions.
+* Many styling improvements and fixes. Thanks @JonnyWong.
+* Fixed incorrect sort on home stats platform count by duration. Thanks @JonnyWong.
+* Fix issue where user refresh would continually be called as "Local" user didn't exist in database.
+* Fixed styling on graph stream modal. Thanks @JonnyWong.
+* Fixed some issues with users page editing. Thanks @JonnyWong.
+* Fix error page when clicking through to an item that no longer exists.
+
+
+## v1.1.5 (2015-08-27)
+
+* Fix git tag being one release behind.
+
+
+## v1.1.4 (2015-08-26)
+
+* User info is now editable from the users table. Thanks @JonnyWong.
+* Improved delete mode for history pages - able to multi-select now. Thanks @JonnyWong.
+* Improved image quality on tooltip images.
+* More styling improvements and fixes on user and info pages. Thanks @JonnyWong.
+* Added some user submitted systemd init scripts. Thanks @malle-pietje and @artbird309.
+* Fixed some background operations when saving settings.
+* Fix max width restricting home stats to 1600px.
+* Fix stream duration parameter for notifications when paused counter is null.
+
+
+## v1.1.3 (2015-08-22)
+
+* Show human readable version info and this cool changelog in Settings -> General.
+* Add a "delete" mode to the history tables. Toggle it to show a delete button next to each history item.
+* Two digit season and episode numbers for custom notification messages. Thanks @JonnyWong.
+* New FreeNAS init script. Thanks @JonnyWong.
+* Lots of styling improvements! Thanks @JonnyWong.
+* Graph page remembers last selected options. Thanks @JonnyWong.
+* New Popular movie homepage stats. Thanks @JonnyWong.
+* Add option for duration vs play count on home stats. (Settings -> Extra Settings). Thanks @JonnyWong.
+* Clean up media info pages. Don't show metadata that is missing. Thanks @JonnyWong.
+* Add clear button to search inputs. Thanks @JonnyWong.
+* New columns on Users list. Thanks @JonnyWong.
+* New stream duration option for custom notification messages. Thanks @JonnyWong.
+* Rad new tooltips on the history pages. Thanks @JonnyWong.
+* And a lot of small visual changes and fixes. Thanks @JonnyWong.
+* Fixed IP address modal on user history page.
+* Fixed "invalid date" showing on monthly plays graph.
+
+## v1.1.2 (2015-08-16)
+
+* Fix bug where user refresh would fail under certain circumstances.
+
+## v1.1.1 (2015-08-15)
+
+* Added Most watched movie for home stats. Thanks @jroyal.
+* Added TV show title to recently added text. Thanks @jroyal.
+* Fix bug with buffer warnings where notification would trigger continuously after first trigger.
+* Fix bug where custom avatar URL would get reset on every user refresh.
+
+## v1.1.0 (2015-08-15)
+
+* Add option to disable all history logging per user.
+* Add option to change user avatar URL. Thanks @jroyal.
+* Show all users on users table even if they don't yet have history.
+* Add option to change time frame of statistics on home page (Settings -> Extra Settings). Thanks @jroyal.
+* Add 7 day period for graphs. Thanks @jroyal.
+* Add pause, resume and buffer warning notification options.
+* Add fine tuning settings for buffer warning triggers.
+* Fix issue with SSL cert verification bypass when method doesn't exist (depends on Python version).
+* Fix bug on home stats which wouldn't update unless a TV show was first logged.
+* Fix alignment of bands on daily graphs which highlight weekends.
+* Fix behaviour of close button on update popup, will now stay closed for an hour after clicking close.
+* Fix some styling niggles.
+
+## v1.0.1 (2015-08-13)
+
+* Allow SSL certificate check override for certain systems with bad CA stores.
+* Fix typo on graphs page causing date selection to break on Safari.
+
+## v1.0 (2015-08-11)
+
+* First release
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..b36103b1
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,41 @@
+# Contributing to Tautulli
+
+## Pull Requests
+If you think you can contribute code to the Tautulli repository, do not hesitate to submit a pull request.
+
+### Branches
+All pull requests should be based on the `nightly` branch, to minimize cross merges. When you want to develop a new feature, clone the repository with `git clone origin/nightly -b FEATURE_NAME`. Use meaningful commit messages.
+
+### Python Code
+
+#### Compatibility
+The code should work with Python 2.7. Note that Tautulli runs on many different platforms.
+
+Re-use existing code. Do not hesitate to add logging in your code. You can the logger module `plexpy.logger.*` for this. Web requests are invoked via `plexpy.request.*` and derived ones. Use these methods to automatically add proper and meaningful error handling.
+
+#### Code conventions
+Although Tautulli did not adapt a code convention in the past, we try to follow the [PEP8](http://legacy.python.org/dev/peps/pep-0008/) conventions for future code. A short summary to remind you (copied from http://wiki.ros.org/PyStyleGuide):
+
+ * 4 space indentation
+ * 80 characters per line
+ * `package_name`
+ * `ClassName`
+ * `method_name`
+ * `field_name`
+ * `_private_something`
+ * `self.__really_private_field`
+ * `_global`
+
+#### Documentation
+Document your code. Use docstrings See [PEP-257](https://www.python.org/dev/peps/pep-0257/) for more information.
+
+### HTML/Template code
+
+#### Compatibility
+HTML5 compatible browsers are targeted.
+
+#### Conventions
+* 4 space indentation
+* `methodName`
+* `variableName`
+* `ClassName`
\ No newline at end of file
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000..a1632d9a
--- /dev/null
+++ b/ISSUE_TEMPLATE.md
@@ -0,0 +1,41 @@
+
+
+**Version:**
+
+**Branch:**
+
+**Commit hash:**
+
+**Operating system:**
+
+**Python version:**
+
+**What you did?**
+
+**What happened?**
+
+**What you expected?**
+
+**How can we reproduce your issue?**
+
+
+**What are your (relevant) settings?**
+
+**Link to logs:**
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..94a9ed02
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/PlexPy.py b/PlexPy.py
new file mode 100644
index 00000000..c583df6c
--- /dev/null
+++ b/PlexPy.py
@@ -0,0 +1,28 @@
+#!/bin/sh
+''''which python >/dev/null 2>&1 && exec python "$0" "$@" # '''
+''''which python2 >/dev/null 2>&1 && exec python2 "$0" "$@" # '''
+''''which python2.7 >/dev/null 2>&1 && exec python2.7 "$0" "$@" # '''
+''''exec echo "Error: Python not found!" # '''
+
+# -*- coding: utf-8 -*-
+
+# This file is part of Tautulli.
+#
+# Tautulli is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Tautulli is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Tautulli. If not, see .
+
+from Tautulli import main
+
+# Call main() from Tautulli.py
+if __name__ == "__main__":
+ main()
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..985909e2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,31 @@
+# Tautulli
+
+This repo of Tautulli is a fork of the original work found [here](https://github.com/Tautulli/Tautulli).
+
+It has been modified primarily to support multiple Plex Media Servers.
+
+Due to the volume of changes and my lack of understanding of creating smaller commits, this fork will most likely never be incorporated into the original product.
+
+##### As such, this is an unofficial fork and is not supported by the original support channels for Tautulli.
+##### If you are upgrading an official Tautulli instance, please be sure to back up your config.ini and tautulli.db. This upgrade will irreversibly migrate your database to the new format required for this fork.
+
+If you experience any issues, please open an issue request on [this](https://github.com/zSeriesGuy/Tautulli/issues) repo.
+
+### Features
+- Supports multiple Plex.TV accounts and PMS servers.
+- Supports monitoring rclone mount and includes a notification of up/down status.
+- Import of Tautulli databases to facilitate consolidation of Tautulli data.
+- Multiple levels of Guest Users. A guest user that you allow to log on to Tautulli can be assigned a Guest Access Level that allows them to see more than just their own information.
+ Guest Access Levels:
+ - None - No logon access
+ - Guest - Same as the original Guest access.
+ - PowerGuest - Can see full information, but only for those servers that the user has shared access to.
+ - SuperGuest - Can see full information on all servers.
+ - Admin - Access to all administration functions of monitored servers but no access to Tautulli-specific administrative functions.
+- Python 3 support. This version now requires Python 3.5 or higher.
+- Replaced all shipped python packages with the use of python virtual environments and a requirements.txt.
+
+## Installation and Support
+* Read the [Installation Guides](https://github.com/zSeriesGuy/Tautulli/wiki/Installation) for instructions to install Tautulli.
+* Support is available on [this repo](https://github.com/zSeriesGuy/Tautulli/issues) only for this fork of Tautulli.
+
\ No newline at end of file
diff --git a/Tautulli.py b/Tautulli.py
new file mode 100644
index 00000000..66a07564
--- /dev/null
+++ b/Tautulli.py
@@ -0,0 +1,284 @@
+#!/bin/sh
+''''which python >/dev/null 2>&1 && exec python "$0" "$@" # '''
+''''which python3 >/dev/null 2>&1 && exec python3 "$0" "$@" # '''
+''''exec echo "Error: Python not found!" # '''
+
+# -*- coding: utf-8 -*-
+
+# This file is part of Tautulli.
+#
+# Tautulli is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Tautulli is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Tautulli. If not, see .
+
+import os
+import sys
+
+# Ensure lib added to path, before any other imports
+sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'lib'))
+
+import argparse
+import datetime
+import locale
+import pytz
+import signal
+import time
+import tzlocal
+
+import plexpy
+from plexpy import config, database, logger, webstart
+
+
+# Register signals, such as CTRL + C
+signal.signal(signal.SIGINT, plexpy.sig_handler)
+signal.signal(signal.SIGTERM, plexpy.sig_handler)
+
+
+def main():
+ """
+ Tautulli application entry point. Parses arguments, setups encoding and
+ initializes the application.
+ """
+
+ # Fixed paths to Tautulli
+ if hasattr(sys, 'frozen'):
+ plexpy.FULL_PATH = os.path.abspath(sys.executable)
+ else:
+ plexpy.FULL_PATH = os.path.abspath(__file__)
+
+ plexpy.PROG_DIR = os.path.dirname(plexpy.FULL_PATH)
+ plexpy.ARGS = sys.argv[1:]
+
+ # From sickbeard
+ plexpy.SYS_PLATFORM = sys.platform
+ plexpy.SYS_ENCODING = None
+
+ try:
+ locale.setlocale(locale.LC_ALL, "")
+ plexpy.SYS_LANGUAGE, plexpy.SYS_ENCODING = locale.getdefaultlocale()
+ except (locale.Error, IOError):
+ pass
+
+ # for OSes that are poorly configured I'll just force UTF-8
+ if not plexpy.SYS_ENCODING or plexpy.SYS_ENCODING in ('ANSI_X3.4-1968', 'US-ASCII', 'ASCII'):
+ plexpy.SYS_ENCODING = 'UTF-8'
+
+ # Set up and gather command line arguments
+ parser = argparse.ArgumentParser(
+ description='A Python based monitoring and tracking tool for Plex Media Server.')
+
+ parser.add_argument(
+ '-v', '--verbose', action='store_true', help='Increase console logging verbosity')
+ parser.add_argument(
+ '-q', '--quiet', action='store_true', help='Turn off console logging')
+ parser.add_argument(
+ '-d', '--daemon', action='store_true', help='Run as a daemon')
+ parser.add_argument(
+ '-p', '--port', type=int, help='Force Tautulli to run on a specified port')
+ parser.add_argument(
+ '--dev', action='store_true', help='Start Tautulli in the development environment')
+ parser.add_argument(
+ '--datadir', help='Specify a directory where to store your data files')
+ parser.add_argument(
+ '--config', help='Specify a config file to use')
+ parser.add_argument(
+ '--nolaunch', action='store_true', help='Prevent browser from launching on startup')
+ parser.add_argument(
+ '--pidfile', help='Create a pid file (only relevant when running as a daemon)')
+ parser.add_argument(
+ '--nofork', action='store_true', help='Start Tautulli as a service, do not fork when restarting')
+
+ args = parser.parse_args()
+
+ if args.verbose:
+ plexpy.VERBOSE = True
+ if args.quiet:
+ plexpy.QUIET = True
+
+ # Do an intial setup of the logger.
+ logger.initLogger(console=not plexpy.QUIET, log_dir=False,
+ verbose=plexpy.VERBOSE)
+
+ try:
+ plexpy.SYS_TIMEZONE = str(tzlocal.get_localzone())
+ plexpy.SYS_UTC_OFFSET = datetime.datetime.now(pytz.timezone(plexpy.SYS_TIMEZONE)).strftime('%z')
+ except (pytz.UnknownTimeZoneError, LookupError, ValueError) as e:
+ logger.error("Could not determine system timezone: %s" % e)
+ plexpy.SYS_TIMEZONE = 'Unknown'
+ plexpy.SYS_UTC_OFFSET = '+0000'
+
+ if os.getenv('TAUTULLI_DOCKER', False) == 'True':
+ plexpy.DOCKER = True
+
+ if args.dev:
+ plexpy.DEV = True
+ logger.debug(u"Tautulli is running in the dev environment.")
+
+ if args.daemon:
+ if sys.platform == 'win32':
+ sys.stderr.write(
+ "Daemonizing not supported under Windows, starting normally\n")
+ else:
+ plexpy.DAEMON = True
+ plexpy.QUIET = True
+
+ if args.nofork:
+ plexpy.NOFORK = True
+ logger.info("Tautulli is running as a service, it will not fork when restarted.")
+
+ if args.pidfile:
+ plexpy.PIDFILE = str(args.pidfile)
+
+ # If the pidfile already exists, plexpy may still be running, so
+ # exit
+ if os.path.exists(plexpy.PIDFILE):
+ try:
+ with open(plexpy.PIDFILE, 'r') as fp:
+ pid = int(fp.read())
+ os.kill(pid, 0)
+ except IOError as e:
+ raise SystemExit("Unable to read PID file: %s", e)
+ except OSError:
+ logger.warn("PID file '%s' already exists, but PID %d is " \
+ "not running. Ignoring PID file." %
+ (plexpy.PIDFILE, pid))
+ else:
+ # The pidfile exists and points to a live PID. plexpy may
+ # still be running, so exit.
+ raise SystemExit("PID file '%s' already exists. Exiting." %
+ plexpy.PIDFILE)
+
+ # The pidfile is only useful in daemon mode, make sure we can write the
+ # file properly
+ if plexpy.DAEMON:
+ plexpy.CREATEPID = True
+
+ try:
+ with open(plexpy.PIDFILE, 'w') as fp:
+ fp.write("pid\n")
+ except IOError as e:
+ raise SystemExit("Unable to write PID file: %s", e)
+ else:
+ logger.warn("Not running in daemon mode. PID file creation " \
+ "disabled.")
+
+ # Determine which data directory and config file to use
+ if args.datadir:
+ plexpy.DATA_DIR = args.datadir
+ else:
+ plexpy.DATA_DIR = plexpy.PROG_DIR
+
+ if args.config:
+ config_file = args.config
+ else:
+ config_file = os.path.join(plexpy.DATA_DIR, config.FILENAME)
+
+ # Try to create the DATA_DIR if it doesn't exist
+ if not os.path.exists(plexpy.DATA_DIR):
+ try:
+ os.makedirs(plexpy.DATA_DIR)
+ except OSError:
+ raise SystemExit(
+ 'Could not create data directory: ' + plexpy.DATA_DIR + '. Exiting....')
+
+ # Make sure the DATA_DIR is writeable
+ if not os.access(plexpy.DATA_DIR, os.W_OK):
+ raise SystemExit(
+ 'Cannot write to the data directory: ' + plexpy.DATA_DIR + '. Exiting...')
+
+ # Put the database in the DATA_DIR
+ plexpy.DB_FILE = os.path.join(plexpy.DATA_DIR, database.FILENAME)
+
+ # Move 'plexpy.db' to 'tautulli.db'
+ if os.path.isfile(os.path.join(plexpy.DATA_DIR, 'plexpy.db')) and \
+ not os.path.isfile(os.path.join(plexpy.DATA_DIR, plexpy.DB_FILE)):
+ try:
+ os.rename(os.path.join(plexpy.DATA_DIR, 'plexpy.db'), plexpy.DB_FILE)
+ except OSError as e:
+ raise SystemExit("Unable to rename plexpy.db to tautulli.db: %s", e)
+
+ if plexpy.DAEMON:
+ plexpy.daemonize()
+
+ # Read config and start logging
+ plexpy.initialize(config_file)
+
+ # Start the background threads
+ plexpy.start()
+
+ # Force the http port if neccessary
+ if args.port:
+ plexpy.HTTP_PORT = args.port
+ logger.info('Using forced web server port: %i', plexpy.HTTP_PORT)
+ else:
+ plexpy.HTTP_PORT = int(plexpy.CONFIG.HTTP_PORT)
+
+ # Check if pyOpenSSL is installed. It is required for certificate generation
+ # and for CherryPy.
+ if plexpy.CONFIG.ENABLE_HTTPS:
+ try:
+ import OpenSSL
+ except ImportError:
+ logger.warn("The pyOpenSSL module is missing. Install this " \
+ "module to enable HTTPS. HTTPS will be disabled.")
+ plexpy.CONFIG.ENABLE_HTTPS = False
+
+ # Try to start the server. Will exit here is address is already in use.
+ web_config = {
+ 'http_port': plexpy.HTTP_PORT,
+ 'http_host': plexpy.CONFIG.HTTP_HOST,
+ 'http_root': plexpy.CONFIG.HTTP_ROOT,
+ 'http_environment': plexpy.CONFIG.HTTP_ENVIRONMENT,
+ 'http_proxy': plexpy.CONFIG.HTTP_PROXY,
+ 'enable_https': plexpy.CONFIG.ENABLE_HTTPS,
+ 'https_cert': plexpy.CONFIG.HTTPS_CERT,
+ 'https_cert_chain': plexpy.CONFIG.HTTPS_CERT_CHAIN,
+ 'https_key': plexpy.CONFIG.HTTPS_KEY,
+ 'http_username': plexpy.CONFIG.HTTP_USERNAME,
+ 'http_password': plexpy.CONFIG.HTTP_PASSWORD,
+ 'http_basic_auth': plexpy.CONFIG.HTTP_BASIC_AUTH
+ }
+ webstart.initialize(web_config)
+
+ # Open webbrowser
+ if plexpy.CONFIG.LAUNCH_BROWSER and not args.nolaunch and not plexpy.DEV:
+ plexpy.launch_browser(plexpy.CONFIG.HTTP_HOST, plexpy.HTTP_PORT,
+ plexpy.HTTP_ROOT)
+
+ # Windows system tray icon
+ if os.name == 'nt' and plexpy.CONFIG.WIN_SYS_TRAY:
+ plexpy.win_system_tray()
+
+ # Wait endlessy for a signal to happen
+ while True:
+ if not plexpy.SIGNAL:
+ try:
+ time.sleep(1)
+ except KeyboardInterrupt:
+ plexpy.SIGNAL = 'shutdown'
+ else:
+ logger.info('Received signal: %s', plexpy.SIGNAL)
+
+ if plexpy.SIGNAL == 'shutdown':
+ plexpy.shutdown()
+ elif plexpy.SIGNAL == 'restart':
+ plexpy.shutdown(restart=True)
+ elif plexpy.SIGNAL == 'checkout':
+ plexpy.shutdown(restart=True, checkout=True)
+ else:
+ plexpy.shutdown(restart=True, update=True)
+
+ plexpy.SIGNAL = None
+
+# Call main()
+if __name__ == "__main__":
+ main()
diff --git a/contrib/clean_pyc.sh b/contrib/clean_pyc.sh
new file mode 100644
index 00000000..e3d47e44
--- /dev/null
+++ b/contrib/clean_pyc.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+# Display information
+echo "This script will remove *.pyc files. These files are generated by Python, but they can cause conflicts after an upgrade. It's safe to remove them, because they will be regenerated."
+echo "Press enter to continue, or CTRL + C to quit."
+read
+
+# Remove the *.pyc
+find "`dirname $0`/.." -type f -name "*.pyc" -exec rm -rf {} \;
\ No newline at end of file
diff --git a/contrib/downgrade.sh b/contrib/downgrade.sh
new file mode 100644
index 00000000..edd4779e
--- /dev/null
+++ b/contrib/downgrade.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+# Parameter check
+if [ -z "$1" ]; then
+ echo "Syntax: $0 "
+ exit 1
+fi
+
+# Version file check
+if [ ! -s "$1/version.lock" ]; then
+ echo "Missing the version.lock file in the data folder, or the file is empty. Did you start PlexPy at least once?"
+ exit 1
+fi
+
+# Git installation check
+if [ ! -x "$(command -v git)" ]; then
+ echo "Git is required to downgrade."
+ exit 1
+fi
+
+# Display information
+HASH=$(cat $1/version.lock)
+
+echo "This script will try to downgrade PlexPy to the last version that started, version $HASH. Make sure you have a backup of your config file and database, just in case!"
+echo "Press enter to continue, or CTRL + C to quit."
+read
+
+# Downgrade
+cd "`dirname $0`/.."
+git reset --hard "$HASH"
+
+echo "All done, PlexPy should be downgraded to the last version that started."
\ No newline at end of file
diff --git a/data/interfaces/default/app_import.html b/data/interfaces/default/app_import.html
new file mode 100644
index 00000000..2807995f
--- /dev/null
+++ b/data/interfaces/default/app_import.html
@@ -0,0 +1,84 @@
+
+
+
+
+
Import ${app} Database
+
+
+
+ <%
+ v = ''
+ if app == 'PlexWatch':
+ v = '0.3.2'
+ elif app == 'Plexivity':
+ v = '0.9.8'
+ elif app == 'Tautulli':
+ v = '3.0.00'
+ %>
+ Please ensure your ${app} database is at version ${v} or higher.
+
+
+
+
+
+
+
+
+
Enter the path and file name for the ${app} database you wish to import.
+
+
+
+
+
+
+
+
+
The table name from which you wish to import. Only import one of these, importing both will result in duplicated data.
+
+
+
+
+
+
+
+
+
Enter the minimum duration (in seconds) an item must have been active for. Set to 0 to import all.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/interfaces/default/base.html b/data/interfaces/default/base.html
new file mode 100644
index 00000000..fdb7b30c
--- /dev/null
+++ b/data/interfaces/default/base.html
@@ -0,0 +1,470 @@
+<%
+ import plexpy
+ from plexpy import version
+ from plexpy.helpers import anon_url
+ from plexpy.notifiers import BROWSER_NOTIFIERS
+%>
+
+
+
+
+
+ Tautulli - ${title}
+
+
+
+
+
+
+
+
+
+
+ ${next.headIncludes()}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ % if _session['user_group'] == 'admin':
+ % if plexpy.CONFIG.CHECK_GITHUB and plexpy.UPDATE_AVAILABLE is None:
+
+ You are running an unknown version of Tautulli.
+ Update or Dismiss
+
+ % elif plexpy.CONFIG.CHECK_GITHUB and plexpy.UPDATE_AVAILABLE == 'release':
+
+ % elif plexpy.CONFIG.CHECK_GITHUB and plexpy.UPDATE_AVAILABLE == 'commit':
+
+ A
+ newer version of Tautulli is available!
+ You are ${plexpy.COMMITS_BEHIND} commit${'s' if plexpy.COMMITS_BEHIND > 1 else ''} behind.
+ Update or Dismiss
+
+ % else:
+
+ % endif
+ % endif
+
+
+
+${next.headerIncludes()}
+
+
+ ${next.body()}
+
+
+${next.modalIncludes()}
+
+% if _session['user_group'] != 'admin':
+