diff --git a/.gitbook.yaml b/.gitbook.yaml new file mode 100644 index 00000000..2b0a6c4e --- /dev/null +++ b/.gitbook.yaml @@ -0,0 +1,5 @@ +root: ./docs + +​structure: + readme: README.md + summary: SUMMARY.md​ diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index dbf78398..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,2167 +0,0 @@ -# Changelog - -## v2.6.8 (2021-03-08) - -* Mobile App: - * New: An all new Tautulli Remote App 2.0. Go to the Google Play link in the settings to download the new version. - * Fix: Registering the new app would fail if OneSignal is blocked. - - -## v2.6.7 (2021-03-07) - -* History: - * New: Added audio language to detailed stream info. (Thanks @herby2212) -* Notifications: - * New: Added season_name notification parameter. - * New: Update notifications to support custom season titles. -* Newsletters: - * New: Update recently added newsletter template to support custom season titles. -* Exporter: - * New: Added originalTitle and bannerFile to TV show export fields. -* UI: - * New: Added TVDB rating image to info page for the new Plex TV agent. - * New: Update the UI to support custom season titles. -* API: - * Fix: Return rating key for collections/playlists in get_synced_items. - * Fix: Return error when delete_synced_item fails. - * New: Return sync_media_type for collections/playlist in get_synced_items. - * New: Update pms_image_proxy to support playlist composite images. -* Other: - * Remove: Auto-updater for the Windows exe installer. - * New: Updated PlexAPI to 4.4.0. - - -## v2.6.6 (2021-02-06) - -* Exporter: - * Fix: Exporting failed with long file paths on Windows. - * New: Updated various exporter fields. - * Change: Renamed collection children to collection items. -* UI: - * Fix: Client side login redirect changed to server side. - * Change: Renamed "Fix Metadata" button to "Fix Match". -* API: - * New: Added get_children_metadata API command. - * New: Return more metadata from the get_home_stats API command. -* Other: - * New: Updated PlexAPI to 4.3.1. - - -## v2.6.5 (2021-01-09) - -* Other: - * Fix: Some IP addresses not being masked in the logs. - * New: Auto-updater for Windows exe installer. - * Change: Allow Snap package to access the user home directory. - * Change: Migrate Snap user data to a persistent location that is retained if Tautulli is reinstalled. - - -## v2.6.4 (2020-12-20) - -* Other: - * Fix: Restore Snap data folder from previous installs. - - -## v2.6.3 (2020-12-19) - -* Announcements: - * This is the last Tautulli version to support Python 2. Python 3 will be required to continue receiving updates. You can check your Python version on the settings page. -* Exporter: - * Fix: Accessible and exists attributes were blank for media info export level 9. -* UI: - * Fix: Guest usernames were not masked on mouse hover. -* Other: - * Fix: macOS menu bar icon for light and dark mode. - * New: Tautulli can officially be installed on Linux using a Snap package. See the installation wiki for details. - - -## v2.6.2 (2020-12-05) - -* Notifications: - * Change: Send a notification of a user new device for the first time only. This can be toggled off in the settings. -* Exporter: - * Fix: Allow exporting child fields only without requiring the parent fields as well. - * Fix: Exporting individual collection would fail. - * Change: Remove accessible and exists fields from the default media info export levels. This prevents the Plex server from reading the media files unnecessarily. -* Other: - * Fix: Enable high resolution for the macOS system tray icon and menu. - * New: Added rate limiting for failed login attempts. - * Change: Use a white logo for the macOS system tray icon. -* API: - * New: Added machine_id to the get_history API response. - - -## v2.6.1 (2020-11-03) - -* Other: - * Fix: High CPU/memory usage in some instances. - * Fix: Logger error preventing Tautulli from starting. - * Fix: Database issue with non-unique image hashes. - - -## v2.6.0 (2020-10-31) - -* Exporter: - * New: New exporter feature that allows you to export the metadata and images for any library, collection, playlist, or media item to csv, json, xml, or m3u8. Refer to the Exporter Guide in the wiki for more details. -* UI: - * Fix: Margin on the homepage activity and statistic/library cards. (Thanks @dotsam) - * Fix: Movie ratings not showing on the info page for the new Plex Movie agent. - * New: Added ability to browse collections and playlists from the library and user pages. - * Change: Updated platform brand logos and colours. -* API: - * New: Added export_metadata, download_export, and delete_export API commands. - * New: Added get_collections_table, and get_playlists_table API commands. - * New: Added min_version parameter to the register_device API command. - * New: Added include_activity parameter to the get_history API command. - * New: Added sync_id parameter to the get_metadata API command. - * New: Added delete_synced_item API command. - * New: Added a stat_id and stats_start parameters to the get_home_stats API command. - * New: Allow deleting a mobile device using the registration device_id for the delete_mobile_device API command. - * Change: Return Plex server info and Tautulli info from the register_device command. -* Other: - * New: The Docker container is now also built for the arm32v6 architecture. - * New: The Docker container is also published to the GitHub Container Registry at ghcr.io/tautulli/tautulli. - * Change: Tautulli is now using a forked version of plexapi 3.6.0. This is to support the exporter feature while still maintaining Python 2 compatibility. - * Change: Updated systemd script to remove process forking. (Thanks @MichaIng) - * Change: Cache GitHub update check on startup. - - -## v2.5.6 (2020-10-02) - -* Activity: - * Change: Renamed container "Transcode" to "Converting" on activity cards. -* Notifications: - * New: Added a silent notification option for Telegram. (Thanks @JohnnyKing94) - * New: Added container_decision notification parameter. - * New: Added notification trigger for Playback Error. - * New: Added remote access down notification threshold setting. -* Newsletter: - * Change: Stop flooring newsletter start date. -* UI: - * Fix: Unable to purge history from the library edit modal. - * Fix: QR code not showing up for localhost address when trying to register a device. - * New: Added library name to the fix metadata modal. -* API: - * New: Added default thumb and art to the Live TV library. -* Other: - * Fix: Synced items not loading for guest access. - * New: Schedule some more automatic database optimizations. - * Change: Added automatic uninstall before installing to the Windows installer. - - -## v2.5.5 (2020-09-06) - -* Activity: - * Fix: Filter out TV show background theme music sessions. -* Notifications: - * New: Check Plex external guids for notification metadata provider links. -* UI: - * Fix: Incorrect sorting for user/library recently played items. -* API: - * Fix: get_synced_items API command returning error with empty result. - * Fix: Download API commands not returning the file. - * Fix: get_logs API command encoding error. - * Fix: get_user_player_stats API command returning error instead of empty result. - * New: Added get_server_info API command. - * New: Added external guids to get_metadata API command. - * New: Added support for multi-column sorting for datatable API commands. - * Change: get_activity API command return thumbnail override for clips. - * Change: get_libraries_table API command return custom library artwork. -* Other: - * Fix: Tautulli failed to run with a stale pid file. - * New: Added scheduled task to optimize the Tautulli database. - * Change: Update plexapi to 3.6.0. - * Change: Update some libraries for Python 3 compatibility. - - -## v2.5.4 (2020-07-31) - -* Monitoring: - * Change: Montitoring remote access changed to use websockets. Refer to Tautulli/Tautulli-Issues#251 for details. -* Notifications: - * Fix: Uploading images to Cloudinary failed for titles with non-ASCII characters on Python 2. - * New: Added plex_id notification parameter. - * Remove: Running .exe files directly using script notifications is no longer supported. - * Remove: php, perl, and ruby prefix overrides for script notifications is no longer supported. - * Change: Stricter checking of file extensions for script notifications. - * Change: Fallback to The Movie Database lookup using title and year. - * Change: Fallback to TVmaze lookup using title. -* UI: - * New: Added ability to import a previous Tautullli configuration file in the settings. - * New: Added a browse button for settings which require a folder or file input. - * New: Added first streamed column to user IP addresses table. (Thanks @dotsam) - * New: Added The Movie Database rating image to media page. - * Change: Different icon to represent direct stream in the history tables. -* API: - * New: Updated API docs for importing a database and configuration file. - - -## v2.5.3 (2020-07-10) - -* History: - * Fix: Unable to delete more than 1000 history entries at the same time. -* Notifications: - * Change: Python script notifications to run using the same Python interpreter as Tautulli. -* Newsletters: - * Fix: Unable to view newsletters with special characters. -* Other: - * Fix: Tautulli failing to start after enabling HTTPS when installed using the Windows / macOS installers. - * Fix: Startup script not working on macOS. - * Fix: Unable to hide dock icon on macOS with the pkg install. Refer to the FAQ regarding the Python rocket dock icon. - * Change: Added path to Python interpreter in system startup (daemon) scripts. - * Change: Added Python version to Google analytics. - - -## v2.5.2 (2020-07-01) - -* Announcements: - * Tautulli now supports Python 3! - * Python 2 is still supported for the time being, but it is recommended to upgrade to Python 3. -* Notifications: - * Fix: Error uploading images to Cloudinary on Python 2. - * Fix: Testing browser notifications alert not disappearing. - * Change: Default recently added notification delay set to 300 seconds. -* UI: - * Fix: MacOS menu bar icon causing Tautulli to fail to start. - * Fix: Unable to login to Tautulli on Python 2. - * New: Windows and MacOS setting to enable Tautulli to start automatically when you login. - * New: Added menu bar icon for MacOS. - * New: Ability to import a Tautulli database in the settings. - * New: Added Tautulli news area on the settings page. - * New: Added platform icon for LG devices. - * Remove: Ability to login to Tautulli using a Plex username and password has been removed. Login using a Plex.tv account is only supported via OAuth. -* Mobile App: - * Fix: Improved API security and validation when registering the Android app. -* Docker: - * Fix: Docker container not respecting the PUID and PGID environment variables. -* Other: - * Fix: Error creating self-signed certificates on Python 3. - * Fix: Tautulli login session cookie not set on the HTTP root path. - * New: Windows and MacOS app installers to install Tautulli without needing Python installed. - - -## v2.2.4 (2020-05-16) - -* Monitoring: - * Fix: Show "None" as the subtitle source on the activity card for user selected subtitles. -* UI: - * Fix: Deleted libraries were showing up on the homepage library cards. - * Fix: Libraries could get stuck as inactive in the database in some instances. -* API: - * Fix: Incorrect title was being returned for the get_history API command. -* Other: - * Fix: Plex remote access check was not being rescheduled after changing the settings. - - -## v2.2.3 (2020-05-01) - -* Notifications: - * Fix: Notification grouping by season/album and show/artist not enabled by default. - * Fix: The rating key notification parameter was being overwritten when 3rd party lookup was enabled. - * Fix: Missing artist value for Musicbrainz lookup in certain situations. - * New: Added notification trigger for Tautulli database corruption. - * New: Added TAUTULLI_PYTHON_VERSION to script notification environment variables. - * New: Added Plex Android / iOS App notification agent. - * New: Added bandwidth notification parameters. - * New: Added user thumb to notification parameters. - * New: Added initial stream notification parameter and threshold setting to determine if a stream is the first stream of a continuous streaming session. - * New: Added Plex remote access notification parameters. - * Change: The file size notification parameter is now reported in SI units. (Thanks @aaronldunlap) -* UI: - * Fix: Delete lookup info from the media info page failing. - * Fix: XBMC platform icon not being redirected to the Kodi platform icon. - * Fix: History table was not being refreshed after deleting entries. - * New: Added icon on the users table to indicate if the user is not on the Plex server. - * New: Added icon on the libraries table to indicate if the library is not on the Plex server. - * Change: Improved deleting libraries so libraries with the same section ID are not also deleted. -* Mobile App: - * Fix: Temporary device token was not being invalidated after cancelling device registration. -* API: - * Fix: Returning XML from the API failing due to unicode characters. - * Fix: Grouping parameter for various API commands not falling back to default setting. - * New: Added time_queries parameter to get_library_watch_time_stats and get_user_watch_time_stats API command. (Thanks @KaasKop97) - * New: Added an "is_active" return value to the get_user, get_users, get_library, and get_libraries API commands which indicates if the user or library is on the Plex server. - * New: Added delete_history API command. - * Change: Added optional parameter for row_ids for delete_library, delete_user, delete_all_library_history, and delete_all_user_history API commands. -* Other: - * Fix: Update failing on CentOS due to an older git version. - * Fix: Manifest file for creating a web app had incorrect info. - * Fix: Auto-updater was not scheduled when enabling the setting unless Tautulli was restarted. - * New: Docker images updated to support ARM platforms. - * Change: Remove the unnecessary optional Plex logs volume from the Docker image. - * Change: Use Plex.tv for GeoIP lookup instead of requiring the MaxMind GeoLite2 database. - - -## v2.2.1 (2020-03-28) - -* Notifications: - * Fix: File size notification parameter incorrectly truncated to an integer. - * Fix: Notification grouping by season/album not enabled by default. - * New: Added transcode decision counts to notification parameters. - * Change: Tags (<>) are no longer stripped from from Webhook notification text. -* Newsletter: - * New: Added favicon to newsletter template when viewing as a web page. -* UI: - * Fix: Username missing from the Synced Items table. - * Fix: Windows system tray icon not enabled by default. - * Fix: Saving a mobile device with a blank friendly name caused an error. - * New: Added IMDb and Rotten Tomato Ratings to info pages. - * New: Added button in settings to delete all 3rd party metadata lookup info in the database. - * New: Added button in settings to flush recently added items in the database. -* API: - * New: Added delete_recenly_added API command to flush recently added items. - * Change: Updated delete_lookup_info API command parameters to allow deleteing all 3rd party metadata lookup info. - - -## v2.2.0 (2020-03-08) - -* Important Note! - * All Live TV changes requires Plex Media Server 1.18.7 or higher. -* Monitoring: - * Fix: Improved IPv6 display on the activity cards. (Thanks @felixbuenemann) - * New: Added Live TV metadata and posters to the activity cards. - * Change: Show bandwidth in Gbps when greater than 1000 Mbps. -* History: - * New: Added history logging for Live TV sessions. - * New: Added a fake "Live TV" library to collect Live TV history. - * Note: This library will show up the first time that Live TV is played. - * New: Added the ability to filter history by Live TV. -* Graphs: - * New: Added Live TV series to the "Plays by Period" and "Play Totals" graphs. - * Change: Media type series on the graphs are only shown if the corresponding library type is present. -* Notifications: - * Fix: Race condition causing stream count to be incorrect for playback stop notifications. - * New: Added Live TV channel notification parameters. - * New: Added Plex background art notification parameter. - * Note: This is the Plex API endpoint to retrieve the background art, not the actual image. - * New: Added poster images for clip notifications. - * Change: Default Webhook notification method to POST. -* UI: - * Fix: Windows platform showing up twice on the Most Active Platforms statistics card. - * New: Added option to change the background art for library sections when editing a library. - * New: Added button to reset Tautulli git installation in settings to fix failed git updates. -* API: - * New: Added ability to filter history using a "live" media type and by guid for the get_history API command. - * New: Added cutsom_art parameter to the edit_library API command. -* Other: - * Change: Add crossorigin use-credentials attribute to manifest tags. (Thanks @pkoenig10) - * Change: Disable automatic updates for Docker containers. Updates are now handled by updating the Docker container. - * Note: If you are using an old Docker container created before v2.2.0, then you may need to completely remove and recreate the container to update for the first time. - * Note: Use the ":latest" Docker tag for the newest stable release, or the ":beta" or ":nightly" tags to access the beta or nightly branches. - - -## v2.1.44 (2020-02-05) - -* Monitoring: - * Fix: SDR source video being identified as HDR stream video. -* Notifications: - * Fix: Unable to select condition operator for video color parameters. -* UI: - * Fix: Capitalization for platforms on history tables. - - -## v2.1.43 (2020-02-03) - -* Monitoring: - * New: Added HDR indicator on activity card. - * New: Added dynamic range to history steam info modal. -* Notifications: - * Fix: Webhook notification body sent as incorrect data type when Content-Type header is overridden. - * Fix: Telegram notification character limit incorrect for unicode characters. - * New: Added color and dynamic range notification parameters. -* Newsletters: - * Fix: Episodes and Albums plural spelling on recently added newsletter section headers. -* UI: - * Fix: Windows and macOS platform capitalization. - * Fix: Season number 0 not shown for episodes on history tables. -* Other: - * Change: Mask email addresses in logs. - * Change: Update deprecated GitHub access token URL parameter to Authorization header. - - -## v2.1.42 (2020-01-04) - -* Other: - * Fix: SSL certificate error when installing GeoLite2 database. - * Change: Verify MaxMind license key and GeoLite2 database path before installing. - * Change: Disable GeoLite2 database uninstall button when it is not installed. - - -## v2.1.41 (2019-12-30) - -* Other: - * Fix: Failing to extract the GeoLite2 database on Windows. - - -## v2.1.40 (2019-12-30) - -* UI: - * Change: Moved 3rd Party API settings to new tab in the settings. -* Graphs: - * Change: Improve calculating month ranges for Play Totals graphs. -* Other: - * Fix: Failing to verify a Plex Media Server using a hostname. - * Change: A license key is now required to install the MaxMind GeoLite2 database for IP geolocation. Please follow the guide in the wiki to reinstall the GeoLite2 database. - * Change: The GeoLite2 database will now automatically update periodically if installed. - - -## v2.1.39 (2019-12-08) - -* UI: - * New: Added creating admin username and password to setup wizard. -* API: - * Change: Remove default notification subject and body for notify API command. -* Other: - * Change: Check for database corruption when making backup. - - -## v2.1.38 (2019-11-17) - -* Notifications: - * New: Added custom JSON headers to the webhook notification agent. -* UI: - * Fix: Homepage recently watched card not showing grouped history. -* Other: - * New: Added GitHub sponsor donation option. - * Change: Improve resolving hostnames. - - -## v2.1.37 (2019-10-11) - -* Notifications: - * Fix: Last.fm URLs linking to artist page instead of the album page. - * New: Added option for MusicBrainz lookup for music notifications. Option must be enabled under 3rd Party APIs in the settings. - * New: Added MusicBrainz ID and MusicBrainz URL notification parameters. - * Change: Automatically truncate Discord description summary to 2048 characters. - - -## v2.1.36-beta (2019-10-05) - -* Monitoring: - * Fix: Activity card title not updating after pre-rolls or auto-play. -* History: - * Fix: Display correct interlaced or progressive video scan type on stream data modal. -* Graphs: - * New: Separate interlaced and progressive video scan type on source and stream resolution graphs. -* API: - * New: Added parent_guid and grandparent_guid to get_activity and get_metadata commands. - - -## v2.1.35-beta (2019-09-24) - -* Monitoring: - * Fix: Audio shown as blank on activity cards when changing audio tracks during direct play. - * Fix: Display correct interlaced or progressive video scan type on activity cards. - * New: Added flag for Nvidia hardware decoding on activity cards. -* Notifications: - * Fix: Notification parameter prefix and suffix were not substituted correctly. - * Fix: Release Date notification parameter was incorrectly casted to an integer instead of a string. - * New: Added video scan type and full resolution notification parameters. -* UI: - * Fix: Movies with the same title but different year being grouped on the homepage stats cards. -* API: - * New: Added video scan type and full resolution values to get_activity command. -* Other: - * Fix: Tautulli logging out every time after saving settings and restarting. - - -## v2.1.34 (2019-09-03) - -* History: - * New: Added Product column to history tables. -* Notifications: - * Fix: IMDB/TMDb/TVDB/TVmaze ID notification parameters showing blank values after lookup. -* UI: - * Fix: Libraries and Users tables did not respect the group history setting. -* API: - * Fix: Title field was not searchable in get_library_media_info command. - * New: Added grouping option to get_libraries_table and get_users_table commands. - * New: Added product value to get_history command. -* Other: - * Fix: Could not verify Plex Media Server with unpublished hostnames. - * Change: Automatically logout all Tautulli instances when changing the admin password. - - -## v2.1.33 (2019-07-27) - -* Notifications: - * Change: Mask notification agent password fields. - * Change: Enable searching by email address in dropdown menu. -* Other: - * Fix: Version number being overwritten with "None" which prevented updating in some instances. - * Change: Update Plex OAuth request headers. - - -## v2.1.32 (2019-06-26) - -* Newsletters: - * Fix: Newsletter scheduler issue for QNAP devices using an invalid "local" timezone preventing Tautulli from starting. - - -## v2.1.31 (2019-06-24) - -* No additional changes from v2.1.31-beta. - - -## v2.1.31-beta (2019-06-13) - -* Monitoring: - * Fix: Synced content showing incorrect stream info. -* Other: - * Fix: Unable to view database status when authentication is enabled. - * Change: Default database synchronous mode changed to prevent database corruption. Database response may be slower. - - -## v2.1.30-beta (2019-05-11) - -* Monitoring: - * Fix: Activity crashing with Plex's Artist TV feature. - * New: Added setting for Plex Media Server Update Check Interval. (Thanks @abiacco) -* Notifications: - * New: Added secure and relayed connection notification parameters. - * New: Added PLEX_USER_TOKEN to script environment variables. - * Change: Schedule notifications using UTC to prevent missing notifications due to misconfigured timezones. -* API: - * New: Added status API command to check the status of Tautulli. - - -## v2.1.29 (2019-05-11) - -* No additional changes from v2.1.29-beta. - - -## v2.1.29-beta (2019-04-14) - -* Monitoring: - * Change: "Required Bandwidth" changed to "Reserved Bandwidth" in order to match the Plex dashboard. -* Notifications: - * New: Added prefix and suffix notification text modifiers. See the "Notification Text Modifiers" help modal for details. -* UI: - * New: Added "Undelete" button to the edit library and edit user modals. - * Fix: User IP address history table showing incorrect "Last Seen" values. -* API: - * Fix: Search API only returning 3 results. - * Fix: Terminate stream API failing when both session_key and session_id were provided. - * Change: Improved API response HTTP status codes and error messages. - - -## v2.1.28 (2019-03-10) - -* Monitoring: - * New: Added secure/insecure connection icon on the activity cards. Requires Plex Media Server v1.15+. -* Other: - * Change: Improved mass deleting of all images from Cloudinary. Requires all previous images on Cloudinary to be manually tagged with "tautulli". New uploads are automatically tagged. - - -## v2.1.27-beta (2019-03-03) - -* Monitoring: - * Fix: Error when playing synced optimized versions. - * Change: Show message to complete the setup wizard instead of error communicating with server message. - * Change: URL changed on Plex.tv for Plex Media Server beta updates. -* Notifications: - * New: Show the media type exclusion tags in the text preview modal. - * Fix: Unicode error in the Email notification failed response message. - * Fix: Error when a notification agent response is missing the "Content-Type" header. -* UI: - * Fix: Usernames were not being sanitized in dropdown selectors. - * Change: Different display of "All" recently added items on the homepage due to change in the Plex Media Server v1.15+ API. -* API: - * New: Added current Tautulli version to update_check API response. - * Change: API no longer returns sanitized HTML response data. -* Other: - * New: Added auto-restart to systemd init script. - * Fix: Patreon donation URL. - * Remove: Crypto donation options. - - -## 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 additional changes from v2.1.20-beta. - - -## 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 deleted file mode 100644 index a415fb54..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,41 +0,0 @@ -# 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 3.6+. 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` diff --git a/docs/3rd-Party-APIs-Guide.md b/docs/3rd-Party-APIs-Guide.md new file mode 100644 index 00000000..b2dfb722 --- /dev/null +++ b/docs/3rd-Party-APIs-Guide.md @@ -0,0 +1,37 @@ +### 3rd Party APIs: + +* [Imgur](#imgur) +* [Cloudinary](#cloudinary) +* [MaxMind](#maxmind) + +--- + +### Imgur + +1. Sign up for an [Imgur account](https://imgur.com/register). Make sure to verify the account. +1. Register a [new application](https://api.imgur.com/oauth2/addclient). +1. Enter an **Application Name**, **Email**, **Description**, and select the option "*OAuth 2 authorization without a callback URL*", then click "*Submit*". +1. Copy the **Client ID** and fill in the Tautulli setting. + +--- + +### Cloudinary + +1. Sign up for a [Cloudinary account](https://cloudinary.com/users/register/free). Make sure to verify the account. +1. From the Cloudinary dashboard, copy the **Cloud Name**, **API Key**, and **API Secret** and fill in the Tautulli settings. + +--- + +### MaxMind + +Note: The GeoLite2 database is not required for Tautulli v2.2.3 and above. Geolocation lookup is done via Plex.tv. + +
+Legacy instructions for pre-v2.2.3 + +1. Sign up for a [MaxMind account](https://www.maxmind.com/en/geolite2/signup). Make sure to verify the account. +1. Go to your *Account*, then *Services* > *My License Key* in the side menu, then click "*Generate New License Key*". +1. Enter a **License key description**, and select "*No*" for "*Will this key be used for GeoIP Update?*", then click "*Confirm*". +1. Copy the *License Key* and fill in the Tautulli setting. + +
\ No newline at end of file diff --git a/docs/API-Reference.md b/docs/API-Reference.md new file mode 100644 index 00000000..d09541f6 --- /dev/null +++ b/docs/API-Reference.md @@ -0,0 +1,3283 @@ +## 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: + server_id (str): The Plex server identifier of the library section + section_id (str): The id of the Plex library section + +Optional parameters: + row_ids (str): Comma separated row ids to delete, e.g. "2,3,8" + +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: + row_ids (str): Comma separated row ids to delete, e.g. "2,3,8" + +Returns: + None +``` + + +### delete_cache +Delete and recreate the cache directory. + + +### delete_export +Delete exports from Tautulli. + +``` +Required parameters: + export_id (int): The row id of the exported file to delete + +Optional parameters: + delete_all (bool): 'true' to delete all exported files + +Returns: + None +``` + + +### delete_history +Delete history rows from Tautulli. + +``` +Required parameters: + row_ids (str): Comma separated row ids to delete, e.g. "65,110,2,3645" + +Optional parameters: + None + +Returns: + None +``` + + +### 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: + server_id (str): The Plex server identifier of the library section + section_id (str): The id of the Plex library section + +Optional parameters: + row_ids (str): Comma separated row ids to delete, e.g. "2,3,8" + +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: + None + +Optional parameters: + rating_key (int): 1234 + (Note: Must be the movie, show, artist, album, or track rating key) + service (str): 'themoviedb' or 'tvmaze' or 'musicbrainz' + delete_all (bool): 'true' to delete all images form the service + +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 mobile device database id to delete, OR + device_id (str): The unique device identifier for the mobile device + +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_recently_added +Flush out all of the recently added items in the database. + + +### delete_synced_item +Delete a synced item from a device. + +``` +Required parameters: + client_id (str): The client ID of the device to delete from + sync_id (str): The sync ID of the synced item + +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: + row_ids (str): Comma separated row ids to delete, e.g. "2,3,8" + +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_export +Download an exported metadata file + +``` +Required parameters: + export_id (int): The row id of the exported file to download + +Optional parameters: + None + +Returns: + download +``` + + +### 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 + custom_thumb (str): The URL for the custom library thumbnail + custom_art (str): The URL for the custom library background art + keep_history (int): 0 or 1 + +Optional parameters: + None + +Returns: + None +``` + + +### edit_user +Update a user on Tautulli. + +``` +Required parameters: + user_id (str): The id of the Plex user + 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 + +Optional paramters: + None + +Returns: + None +``` + + +### export_metadata +Export library or media metadata to a file + +``` +Required parameters: + section_id (int): The section id of the library items to export, OR + user_id (int): The user id of the playlist items to export, OR + rating_key (int): The rating key of the media item to export + +Optional parameters: + file_format (str): csv (default), json, xml, or m3u8 + metadata_level (int): The level of metadata to export (default 1) + media_info_level (int): The level of media info to export (default 1) + thumb_level (int): The level of poster/cover images to export (default 0) + art_level (int): The level of background artwork images to export (default 0) + custom_fields (str): Comma separated list of custom fields to export + in addition to the export level selected + export_type (str): 'collection' or 'playlist' for library/user export, + otherwise default to all library items + individual_files (bool): Export each item as an individual file for library/user export. + +Returns: + json: + {"result": "success", + "message": "Metadata export has started." + } +``` + + +### 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_call_sign": "", + "channel_identifier": "", + "channel_stream": 0, + "channel_thumb": "", + "children_count": "", + "collections": [], + "container": "mkv", + "container_decision": "direct play", + "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_guid": "com.plexapp.agents.thetvdb://121361?lang=en", + "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": 1, + "is_home_user": 1, + "is_restricted": 0, + "keep_history": 1, + "labels": [], + "last_viewed_at": "1462165717", + "library_name": "TV Shows", + "live": 0, + "live_uuid": "", + "local": "1", + "location": "lan", + "machine_id": "lmd93nkn12k29j2lnm", + "media_index": "1", + "media_type": "episode", + "optimized_version": 0, + "optimized_version_profile": "", + "optimized_version_title": "", + "original_title": "", + "originally_available_at": "2016-04-24", + "parent_guid": "com.plexapp.agents.thetvdb://121361/6?lang=en", + "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", + "secure": 1, + "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_chroma_subsampling": "4:2:0", + "stream_video_codec": "h264", + "stream_video_codec_level": "41", + "stream_video_color_primaries": "", + "stream_video_color_range": "tv", + "stream_video_color_space": "bt709", + "stream_video_color_trc": "", + "stream_video_decision": "direct play", + "stream_video_dynamic_range": "SDR", + "stream_video_framerate": "24p", + "stream_video_full_resolution": "1080p", + "stream_video_height": "1078", + "stream_video_language": "", + "stream_video_language_code": "", + "stream_video_ref_frames": "4", + "stream_video_resolution": "1080", + "stream_video_scan_type": "progressive", + "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_chroma_subsampling": "4:2:0", + "video_codec": "h264", + "video_codec_level": "41", + "video_color_primaries": "", + "video_color_range": "tv", + "video_color_space": "bt709", + "video_color_trc": ", + "video_decision": "direct play", + "video_dynamic_range": "SDR", + "video_frame_rate": "23.976", + "video_framerate": "24p", + "video_full_resolution": "1080p", + "video_height": "1078", + "video_language": "", + "video_language_code": "", + "video_profile": "high", + "video_ref_frames": "4", + "video_resolution": "1080", + "video_scan_type": "progressive", + "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_children_metadata +Get the metadata for the children of a media item. + +``` +Required parameters: + rating_key (str): Rating key of the item + media_type (str): Media type of the item + +Optional parameters: + None + +Returns: + json: + {"children_count": 9, + "children_type": "season", + "title": "Game of Thrones", + "children_list": [ + {...}, + {"actors": [], + "added_at": "1403553078", + "art": "/library/metadata/1219/art/1562110346", + "audience_rating": "", + "audience_rating_image": "", + "banner": "", + "content_rating": "", + "directors": [], + "duration": "", + "full_title": "Season 1" + "genres": [], + "grandparent_rating_key": "", + "grandparent_thumb": "", + "grandparent_title": "", + "guid": "com.plexapp.agents.thetvdb://121361/1?lang=en", + "labels": [], + "last_viewed_at": "1589992348", + "library_name": "TV Shows", + "media_index": "1", + "media_type": "season", + "original_title": "", + "originally_available_at": "", + "parent_media_index": "1", + "parent_rating_key": "1219", + "parent_thumb": "/library/metadata/1219/thumb/1562110346", + "parent_title": "Game of Thrones", + "rating": "", + "rating_image": "", + "rating_key": "1220", + "section_id": "2", + "sort_title": "", + "studio": "", + "summary": "", + "tagline": "", + "thumb": "/library/metadata/1220/thumb/1602176313", + "title": "Season 1", + "updated_at": "1602176313", + "user_rating": "", + "writers": [], + "year": "" + }, + {...}, + {...} + ] + } +``` + + +### get_collections_table +Get the data on the Tautulli collections tables. + +``` +Required parameters: + section_id (str): The id of the Plex library section + +Optional parameters: + None + +Returns: + json: + {"draw": 1, + "recordsTotal": 5, + "data": + [...] + } +``` + + +### 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_export_fields +Get a list of available custom export fields. + +``` +Required parameters: + media_type (str): The media type of the fields to return + +Optional parameters: + sub_media_type (str): The child media type for + collections (movie, show, artist, album, photoalbum), + or playlists (video, audio, photo) + +Returns: + json: + {"metadata_fields": + [{"field": "addedAt", "level": 1}, + ... + ], + "media_info_fields": + [{"field": "media.aspectRatio", "level": 1}, + ... + ] + } +``` + + +### get_exports_table +Get the data on the Tautulli export tables. + +``` +Required parameters: + section_id (str): The id of the Plex library section, OR + user_id (str): The id of the Plex user, OR + rating_key (str): The rating key of the exported item + +Optional parameters: + 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" + +Returns: + json: + {"draw": 1, + "recordsTotal": 10, + "recordsFiltered": 3, + "data": + [{"timestamp": 1602823644, + "art_level": 0, + "complete": 1, + "custom_fields": "", + "exists": true, + "export_id": 42, + "exported_items": 28, + "file_format": "json", + "file_size": 57793562, + "filename": null, + "individual_files": 1, + "media_info_level": 1, + "media_type": "collection", + "media_type_title": "Collection", + "metadata_level": 1, + "rating_key": null, + "section_id": 1, + "thumb_level": 2, + "title": "Library - Movies - Collection [1]", + "total_items": 28, + "user_id": null + }, + {...}, + {...} + ] + } +``` + + +### get_geoip_lookup +Get the geolocation info for an IP address. + +``` +Required parameters: + ip_address + +Optional parameters: + None + +Returns: + json: + {"code": 'US", + "country": "United States", + "region": "California", + "city": "Mountain View", + "postal_code": "94035", + "timezone": "America/Los_Angeles", + "latitude": 37.386, + "longitude": -122.0838, + "accuracy": 1000 + } +``` + + +### get_history +Get the Tautulli history. + +``` +Required parameters: + None + +Optional parameters: + grouping (int): 0 or 1 + include_activity (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", "live" + transcode_decision (str): "direct play", "copy", "transcode", + guid (str): Plex guid for an item, e.g. "com.plexapp.agents.thetvdb://121361/6/1" + 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", + "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", + "ip_address": "xxx.xxx.xxx.xxx", + "live": 0, + "machine_id": "lmd93nkn12k29j2lnm", + "media_index": 17, + "media_type": "episode", + "originally_available_at": "2016-04-24", + "parent_media_index": 7, + "parent_rating_key": 544, + "parent_title": "", + "paused_counter": 0, + "percent_complete": 84, + "platform": "Windows", + "product": "Plex for Windows", + "player": "Castle-PC", + "rating_key": 4348, + "reference_id": 1123, + "row_id": 1124, + "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 (int): The time range to calculate statistics, 30 + stats_type (str): 'plays' or 'duration' + stats_start (int) The row number of the stat item to start at, 0 + stats_count (int): The number of stat items to return, 5 + stat_id (str): A single stat to return, 'top_movies', 'popular_movies', + 'top_tv', 'popular_tv', 'top_music', 'popular_music', 'top_libraries', + 'top_users', 'top_platforms', 'last_watched', 'most_concurrent' + +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", + "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", + "labels": [], + "last_play": 1462380698, + "live": 0, + "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_libraries", + "stat_type": "total_plays", + "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", + "is_active": 1, + "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: + grouping (int): 0 or 1 + 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, + "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", + "histroy_row_id": 1128, + "is_active": 1, + "keep_history": "Checked", + "labels": [], + "last_accessed": 1462693216, + "last_played": "Game of Thrones - The Red Woman", + "library_art": "/:/resources/show-fanart.jpg", + "library_thumb": "/:/resources/show.png", + "live": 0, + "media_index": 1, + "media_type": "episode", + "originally_available_at": "2016-04-24", + "parent_count": 240, + "parent_media_index": 6, + "parent_title": "", + "plays": 772, + "rating_key": 153037, + "row_id": 1, + "section_id": 2, + "section_name": "TV Shows", + "section_type": "Show", + "server_id": "ds48g4r354a8v9byrrtr697g3g79w", + "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: + include_last_accessed (bool): True to include the last_accessed value for the library. + +Returns: + json: + {"child_count": null, + "count": 887, + "deleted_section": 0, + "do_notify": 1, + "do_notify_created": 1, + "is_active": 1, + "keep_history": 1, + "last_accessed": 1462693216, + "library_art": "/:/resources/movie-fanart.jpg", + "library_thumb": "/:/resources/movie.png", + "parent_count": null, + "row_id": 1, + "section_id": 1, + "section_name": "Movies", + "section_type": "movie", + "server_id": "ds48g4r354a8v9byrrtr697g3g79w" + } +``` + + +### 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", + "sort_title": "Game of Thrones", + "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", + "username": "LordCommanderSnow" + }, + {"friendly_name": "DanyKhaleesi69", + "total_plays": 42, + "user_id": 8008135, + "user_thumb": "https://plex.tv/users/568gwwoib5t98a3a/avatar", + "username: "DanyKhaleesi69" + }, + {...}, + {...} + ] +``` + + +### 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 + query_days (str): Comma separated days, e.g. "1,7,30,0" + +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, OR + sync_id (str): Sync ID of a synced 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_guid": "com.plexapp.agents.thetvdb://121361?lang=en", + "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", + "guids": [], + "labels": [], + "last_viewed_at": "1462165717", + "library_name": "TV Shows", + "live": 0, + "media_index": "1", + "media_info": [ + { + "aspect_ratio": "1.78", + "audio_channel_layout": "5.1", + "audio_channels": "6", + "audio_codec": "ac3", + "audio_profile": "", + "bitrate": "10617", + "channel_call_sign": "", + "channel_identifier": "", + "channel_thumb": "", + "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_color_primaries": "", + "video_color_range": "tv", + "video_color_space": "bt709", + "video_color_trc": "", + "video_frame_rate": "23.976", + "video_height": "1078", + "video_language": "", + "video_language_code": "", + "video_profile": "high", + "video_ref_frames": "4", + "video_scan_type": "progressive", + "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_full_resolution": "1080p", + "video_profile": "high", + "video_resolution": "1080", + "width": "1920" + } + ], + "media_type": "episode", + "original_title": "", + "originally_available_at": "2016-04-24", + "parent_guid": "com.plexapp.agents.thetvdb://121361/6?lang=en", + "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": "Red Woman", + "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_playlists_table +Get the data on the Tautulli playlists tables. + +``` +Required parameters: + section_id (str): The section id of the Plex library, OR + user_id (str): The user id of the Plex user + +Optional parameters: + None + +Returns: + json: + {"draw": 1, + "recordsTotal": 5, + "data": + [...] + } +``` + + +### 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": [...]}, + {"name": "Live TV", "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": [...]}, + {"name": "Live TV", "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": [...]}, + {"name": "Live TV", "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": [...]}, + {"name": "Live TV", "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": [...]}, + {"name": "Live TV", "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": [...]}, + {"name": "Live TV", "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_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": + [{"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", + "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", + "guids": [], + "labels": [], + "last_viewed_at": "1462165717", + "library_name": "TV Shows", + "media_index": "1", + "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": "Red Woman", + "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_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_info +Get the PMS server information. + +``` +Required parameters: + None + +Optional parameters: + None + +Returns: + json: + {"pms_identifier": "08u2phnlkdshf890bhdlksghnljsahgleikjfg9t", + "pms_ip": "10.10.10.1", + "pms_is_remote": 0, + "pms_name": "Winterfell-Server", + "pms_platform": "Windows", + "pms_plexpass": 1, + "pms_port": 32400, + "pms_ssl": 0, + "pms_url": "http://10.10.10.1:32400", + "pms_url_manual": 0, + "pms_version": "1.20.0.3133-fede5bdc7" + } +``` + + +### 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_language": "English", + "audio_language_code": "eng", + "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_language": "English", + "stream_audio_language_code", "eng", + "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_dynamic_range": "SDR", + "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_dynamic_range": "SDR", + "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: + None + +Optional parameters: + machine_id (str): The PMS identifier + 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_media_type": null, + "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: + include_last_seen (bool): True to include the last_seen value for the user. + +Returns: + json: + {"allow_guest": 1, + "deleted_user": 0, + "do_notify": 1, + "email": "Jon.Snow.1337@CastleBlack.com", + "friendly_name": "Jon Snow", + "is_active": 1, + "is_admin": 0, + "is_allow_sync": 1, + "is_home_user": 1, + "is_restricted": 0, + "keep_history": 1, + "last_seen": 1462591869, + "row_id": 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", "first_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", + "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", + "id": 1121, + "ip_address": "xxx.xxx.xxx.xxx", + "last_played": "Game of Thrones - The Red Woman", + "last_seen": 1462591869, + "first_seen": 1583968210, + "live": 0, + "media_index": 1, + "media_type": "episode", + "originally_available_at": "2016-04-24", + "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", + "current": false, + "expiry": "2021-06-30 18:48:03", + "friendly_name": "Jon Snow", + "host": "http://plexpy.castleblack.com", + "ip_address": "xxx.xxx.xxx.xxx", + "os": "Mac OS X", + "row_id": 1, + "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 + query_days (str): Comma separated days, e.g. "1,7,30,0" + +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_active": 1, + "is_admin": 0, + "is_allow_sync": 1, + "is_home_user": 1, + "is_restricted": 0, + "keep_history": 1, + "row_id": 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: + grouping (int): 0 or 1 + 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", + "guid": "com.plexapp.agents.thetvdb://121361/6/1?lang=en", + "history_row_id": 1121, + "ip_address": "xxx.xxx.xxx.xxx", + "is_active": 1, + "keep_history": "Checked", + "last_played": "Game of Thrones - The Red Woman", + "last_seen": 1462591869, + "live": 0, + "media_index": 1, + "media_type": "episode", + "originally_available_at": "2016-04-24", + "parent_media_index": 6, + "parent_title": "", + "platform": "Chrome", + "player": "Plex Web (Chrome)", + "plays": 487, + "rating_key": 153037, + "row_id": 1, + "thumb": "/library/metadata/153036/thumb/1462175062", + "transcode_decision": "transcode", + "user_id": 133788, + "user_thumb": "https://plex.tv/users/568gwwoib5t98a3a/avatar", + "username": "LordCommanderSnow", + "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_config +Import a Tautulli config file. + +``` +Required parameters: + config_file (file): The config file to import (multipart/form-data) + or + config_path (str): The full path to the config file to import + + +Optional parameters: + backup (bool): true or false whether to backup + the current config before importing + +Returns: + json: + {"result": "success", + "message": "Config import has started. Check the logs to monitor any problems. " + "Tautulli will restart automatically." + } +``` + + +### import_database +Import a Tautulli, PlexWatch, or Plexivity database into Tautulli. + +``` +Required parameters: + app (str): "tautulli" or "plexwatch" or "plexivity" + database_file (file): The database file to import (multipart/form-data) + or + database_path (str): The full path to the database file to import + method (str): For Tautulli only, "merge" or "overwrite" + table_name (str): For PlexWatch or Plexivity only, "processed" or "grouped" + + +Optional parameters: + backup (bool): For Tautulli only, true or false whether to backup + the current database before importing + import_ignore_interval (int): For PlexWatch or Plexivity only, the minimum number + of seconds for a stream to import + +Returns: + json: + {"result": "success", + "message": "Database import has started. Check the logs to monitor any problems." + } +``` + + +### logout_user_session +Logout Tautulli user sessions. + +``` +Required parameters: + row_ids (str): Comma separated row ids to sign out, e.g. "2,3,8" + +Optional parameters: + None + +Returns: + None +``` + + +### 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: + headers (str): The JSON headers for webhook notifications + 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): Hex color, e.g. 282828 + blur (str): 3 + img_format (str): png + fallback (str): "poster", "cover", "art", "poster-live", "art-live", "art-live-full", "user" + 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_id (str): The unique device identifier for the mobile device + device_name (str): The device name of the mobile device + +Optional parameters: + friendly_name (str): A friendly name to identify the mobile device + onesignal_id (str): The OneSignal id for the mobile device + min_version (str): The minimum Tautulli version supported by the mobile device, e.g. v2.5.6 + +Returns: + json: + {"pms_identifier": "08u2phnlkdshf890bhdlksghnljsahgleikjfg9t", + "pms_ip": "10.10.10.1", + "pms_is_remote": 0, + "pms_name": "Winterfell-Server", + "pms_platform": "Windows", + "pms_plexpass": 1, + "pms_port": 32400, + "pms_ssl": 0, + "pms_url": "http://10.10.10.1:32400", + "pms_url_manual": 0, + "pms_version": "1.20.0.3133-fede5bdc7" + "server_id": "2ce060c87958445d8399a7a0c5663755", + "tautulli_install_type": "git", + "tautulli_branch": "master", + "tautulli_commit": "14b98a32e085d969f010f0249c3d2f660db50880", + "tautulli_platform": "Windows", + "tautulli_platform_device_name": "Winterfell-PC", + "tautulli_platform_linux_distro": "", + "tautulli_platform_release": "10", + "tautulli_platform_version": "10.0.18362", + "tautulli_python_version": "3.8.3" + "tautulli_version": "v2.5.6", + } +``` + + +### 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": + [{...}, + {...}, + ] + }, + {...} + } +``` + + +### server_status +Get the current status of Tautulli's connection to the Plex server. + +``` +Required parameters: + None + +Optional parameters: + None + +Returns: + json: + {"result": "success", + "connected": true, + } +``` + + +### 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 while Tautulli is shut down. + +``` +Required parameters: + query (str): The SQL query + +Optional parameters: + None + +Returns: + None +``` + + +### status +Get the current status of Tautulli. + +``` +Required parameters: + None + +Optional parameters: + check (str): database + +Returns: + json: + {"result": "success", + "message": "Ok", + } +``` + + +### 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 +``` + + +### 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/docs/Asking-for-Support.md b/docs/Asking-for-Support.md new file mode 100644 index 00000000..c5cf6a0f --- /dev/null +++ b/docs/Asking-for-Support.md @@ -0,0 +1,84 @@ +## Before asking for support, make sure you try these things first +* Make sure you have updated to the latest version. +* ["Have you tried turning it off and on again?"](https://www.youtube.com/watch?v=nn2FB1P_Mn8) +* Analyzing your logs, you just might find the solution yourself! +* **Search** the [[Wiki|Home]], +[[Installation Guides|Installation]], and +[[FAQs|Frequently Asked Questions]]. +* If you have questions, feel free to ask them on [Discord](https://tautulli.com/discord) or [Reddit](https://www.reddit.com/r/Tautulli). Please include a link to your logs. See [How can I share my logs?](#how-can-i-share-my-logs) for more details. + +## What should I include when asking for support? + +When you contact support saying something like "it doesn't work" leaves little to go on to figure out what is wrong for you. When contacting support try to include information such as the following: + +* What did you try to do? When you describe what you did to reach the state you are in we may notice something you did different from the instructions, or something that your unique setup requires in addition. Some examples of what to provide here: + * What command did you enter? + * What did you click on? + * What settings did you change? + * Provide a step-by-step list of what you tried. +* What do you see? We cannot see your screen so some of the following is necessary for us to know what is going on: + * Did something happen? + * Did something not happen? + * Are there any error messages showing? + * Screenshots can help us see what you are seeing + * The Tautulli logs show exactly what happened and are often critical for identifying issues (see [How can I share my logs?](#how-can-i-share-my-logs) below). + +When you only provide something like "it doesn't work" think of it like going to the doctor and only telling them "I'm sick." Without you telling them things like what symptoms are you experiencing, whether you are feeling pain somewhere, or whether you are taking any medication. Just like the doctor in that situation, if you don't tell us what is wrong we have to ask you questions until we can get the basic information in place so we can start figuring out how to help you fix the issue. + +## How can I share my logs? + +First you will need to download your logs by opening the web interface. + +1. Go to the **Settings menu** (Gear Icon, top right) and click **View Logs**. +1. Click the Download Logs button on the _Tautulli Logs_ tab to save a copy of the `tautulli.log` file. +1. Open the log file and **upload the text** by going to [gist.github.com](https://gist.github.com/) and creating a new secret Gist of the contents. +1. **Share the link** with support ([Discord](https://tautulli.com/discord), [Reddit](https://www.reddit.com/r/Tautulli)) by copying the URL of the page. + +If Tautulli is unable to start, then the log file is located in the following locations: +* Git or zip based installation: `/logs/tautulli.log` +* Windows exe installation: `%LOCALAPPDATA%\Tautulli\logs\tautulli.log` +* macOS pkg installation: `~/Library/Application Support/Tautulli/logs/tautulli.log` +* Snap package installation: `/root/snap/tautulli/common/logs/tautulli.log` + +### Notes: +* Upload the **entire** log file. Only uploading what you think is important just makes the process of figuring out what is wrong take longer. +* Not seeing any errors is just as useful as seeing errors. It could indicate that something _isn't_ happening, that should be happening. +* Do not clear your logs unless asked to. +* _Notification Logs_ and _Newsletter Logs_ provide no information for support. These logs are only used to keep a history of what has been sent. + +## What is in my logs? + +### Tautulli Logs + +_Filename: `tautulli.log`_ + +Tautulli already sanitizes tokens from this log, leaving the following potentially sensitive information in there: +* Usernames + * Especially if your users leave them as email addresses +* Media titles + * For example `Session 771 started by user 18140375 (username) with ratingKey 364356 (Solo: A Star Wars Story).` +* Times that things were played + +If you want to keep this private feel free to replace the usernames before uploading the logs as long as you do so consistently! For example replacing `alice` with `user1` and `bob` with `user2` is fine, but don't replace one instance of `alice` with `user1`, and another with `user2` or replacing both `alice` and `bob` with `user`. + +Information that _isn't_ sensitive: +* Many identifiers aren't sensitive, such as: + * Session IDs + * Session keys + * Rating keys + * User ID numbers + * Etc. + +These numbers are unique to your specific Plex and Tautulli installation, but have no meaning outside of them so sharing them isn't an issue. + +### Tautulli API Logs + +_Filename: `tautulli_api.log`_ + +This log contains information about calls made to Tautulli's own API and is usually not needed for support issues. + +### Plex Websocket Logs + +_Filename: `plex_websocket.log`_ + +This is a log of the raw events that Plex sends to Tautulli as your users play media and you add new files. This log shouldn't contain any information more sensitive than the Tautulli Log itself, but is rarely required to diagnose issues. diff --git a/docs/Custom-Notification-Conditions.md b/docs/Custom-Notification-Conditions.md new file mode 100644 index 00000000..eec6d6b1 --- /dev/null +++ b/docs/Custom-Notification-Conditions.md @@ -0,0 +1,57 @@ +## Overview + +Tautulli allows you to define conditions that determine whether or not your Notifications will actually be sent. + +The conditions are used to _**allow**_ notifications through. For example: + * Allow notifications through if the `Username` `is` `alice`. + * Allow notifications through if the `Library Name` `is not` `4K Movies` + +## Single conditions + +The simplest use case is a single condition, allowing you to do things like not show Recently Added notifications for a specific library, or watched notifications for a specific user. + +### Excluding a specific user +![image](./images/excluding_specific_user.png) + +### Excluding a specific Library + +![image](./images/excluding_specific_library.png) + +### Custom Condition Logic + +By default Tautulli uses `AND` to combine multiple conditions together, meaning that all conditions must evaluate to true in order for the notification to send. If you need more complex logic than that you can customize this in the _Condition Logic_ setting. + +### Warning on `is not` + +Don't try to use multiple `is not` clauses for the same parameter and join them together with an `OR`! This will simply end up with the combination evaluating to `True` every single time. + +For example let's say you have this setup: +![image](https://user-images.githubusercontent.com/427137/41248058-a358bde4-6d64-11e8-8c5f-d2153bdf4998.png) + +* Play a song from `Music A`: + ``` + {1} Library Name is not Music A = False + {2} Library Name is not Music B = True + Condition Logic = {False} or {True} = True = Notification is sent + ``` +* Play a song from `Music B`: + ``` + {1} Library Name is not Music A = True + {2} Library Name is not Music B = False + Condition Logic = {True} or {False} = True = Notification is sent + ``` + +If you want to use `is not` for multiple values simply put both values in the same value list within Tautulli: +![image](https://user-images.githubusercontent.com/427137/41247785-fa722e4a-6d63-11e8-9eae-cc0d07e6b2ad.png) + +## Conditions and Triggers + +Conditions apply to the entire notification agent, this means that if you want to have some Triggers have one condition (Recently Added limited by library) and other Triggers limited by a different condition (Watched wasn't a specific user) you need to add different Notification Agents for the different triggers. Tautulli makes this simple to setup by providing a Duplicate button on each Notification Agent's dialog. + +### ⚠️ Available properties + +Note: Not all properties apply to all triggers! + +If you open the list of parameter descriptions the sections will tell you when the properties are available for conditions, but there is nothing in the interface that will prevent you from setting things up incorrectly! + +For example, the `{username}` property is only available for things related to a Stream such as the Watched or Playback triggers. It is _not_ available for things that have no stream details, such as the Recently Added trigger. If you set up a condition using a property that isn't available it's likely your notifications won't ever send! \ No newline at end of file diff --git a/docs/Custom-Scripts.md b/docs/Custom-Scripts.md new file mode 100644 index 00000000..6a0eb105 --- /dev/null +++ b/docs/Custom-Scripts.md @@ -0,0 +1,94 @@ +## How to Use Custom Scripts + +1. Go to Settings > Notification Agents > Add new notification agent > Script. +

+ +

+

+ +

+ +

+

+ +

+

+ +1. Set a "Script Folder" and a "Script File" + + + +1. Select the triggers that will be used to run the script. (e.g. Playback Start, Playback Stop). + + + +1. If you want to limit when the script runs, add [[custom conditions|Custom Notification Conditions]] to the agent. + + + +1. Set the arguments that should be passed to the script + + + +1. Save. Voila, all done! + +## Environment Variables + +| Variable | Description | +| --- | --- | +| `PLEX_URL` | The URL used to connect to the Plex server (e.g. `http://127.0.0.1:32400`). | +| `PLEX_TOKEN` | The admin's Plex token. | +| `PLEX_USER_TOKEN` | The user's Plex token only available for notifications with a user context (i.e. Playback triggers). | +| `TAUTULLI_URL` | The URL used to connect to the Tautulli server (e.g. `http://127.0.0.1:8181`). | +| `TAUTULLI_PUBLIC_URL` | The Public Tautulli Domain only if set in the Tautulli settings. | +| `TAUTULLI_APIKEY` | The Tautulli API key. | + + +## List of User Created Scripts + +### Visit the [JBOPS GitHub Repository](https://github.com/blacktwin/JBOPS) for more up-to-date scripts created by @Blacktwin. + + +#### Tautulli Scripts: + +| Description | Language | Author | +| --- | --- | --- | +| [Kill streams](https://github.com/blacktwin/JBOPS/blob/master/killstream/) | Python | [blacktwin](https://github.com/blacktwin) | +| [Throttle nzb client](https://gist.github.com/Hellowlol/a5d0cab4bde185b38404) | Python | [Hellowlol](https://gist.github.com/Hellowlol) | +| [Send an Email notification to users when a new episode to their "favorite" show have been added to Plex](https://github.com/blacktwin/JBOPS/blob/master/notify/notify_user_favorites.py) | Python | [blacktwin](https://gist.github.com/blacktwin) | +| [Send a Tautulli notification with the movie directors' IMDB page](https://gist.github.com/JonnyWong16/d508d8d5d1fcb336efc1a3d167eb7b1a) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Send a random Chuck Norris joke when a movie starring Chuck Norris is played](https://gist.github.com/JonnyWong16/6e3b07bbc99eeb15183ba86be5bdf9a7) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Send a Tautulli notification with geolocation data](https://gist.github.com/JonnyWong16/48d6362884b5edbf5e6d78859035183a) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Get notified when Plex disk usage exceeds a certain threshold](https://gist.github.com/JonnyWong16/f561f06a6266db66dad9) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Delete Tautulli history older than "X" days](https://gist.github.com/JonnyWong16/cb1b53e71b89d2159313) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Restart Plex](https://gist.github.com/Hellowlol/daaa7aa4c5f8bd54033895df5a5fb2d2) | bat | [Hellowlol](https://gist.github.com/Hellowlol) | +| [Plex Docker Container Restart with Rancher](https://gist.github.com/JigSawFr/70d7f95f16f1f6f27528a18e183ee67c) | Bash | [JigSawFr](https://gist.github.com/JigSawFr) | +| [Tautulli - Quiet hours and smart batching for Pushbullet notifications](https://gist.github.com/JimboMonkey1234/1c27897c3204c6b72a05fea64f0a9f02) | Python | [JimboMonkey1234](https://gist.github.com/JimboMonkey1234) | +| [Generate map from user geolocation data](https://github.com/blacktwin/JBOPS/tree/master/maps) | Python | [blacktwin](https://gist.github.com/blacktwin) | +| [Get notified when new IP address accesses Plex](https://github.com/blacktwin/JBOPS/blob/master/notify/notify_newip.py) | Python | [blacktwin](https://gist.github.com/blacktwin) | +| [Run a SSH command using Python](https://gist.github.com/JonnyWong16/e140f546b09950829685f000b7cf98bc) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Automatically add a label to recently added items](https://gist.github.com/JonnyWong16/4cfcf8ea50dab1b720b4d30e9a01835c) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Automatically mark a multi-episode file as watched in Plex](https://gist.github.com/JonnyWong16/7708c5e755c74e169c115490b0749279) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Automatically change episode artwork in Plex to hide spoilers](https://gist.github.com/JonnyWong16/ea8f51f674fdb4ebf4e47e53cd1a10e5) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Updates all metadata in the Tautulli database after moving Plex libraries](https://gist.github.com/JonnyWong16/f554f407832076919dc6864a78432db2) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Send recently added through native iOS push (OneSignal)](https://gist.github.com/LuisNunezC/64a3e677887c8ffb76e0f0de1c43311b) | Python | [LuisNunezC](https://github.com/LuisNunezC) | +| [Notify Sonarr that a plexDVR recording has been added to the library](https://gist.github.com/metaMMA/4ecd6579476fce7e93b6c8a5271c12ae) | Bash | [metaMMA](https://github.com/metaMMA) | +| [Notification script for Facebook Groups](https://gist.github.com/spuniun/56624e1464c621c91e52f88e03321582) | Python | [spuniun](https://github.com/spuniun) | + + +#### Other Plex Scripts: + +| Description | Language | Author | +| --- | --- | --- | +| [Automatically share and unshare libraries for Plex users](https://gist.github.com/JonnyWong16/f8139216e2748cb367558070c1448636) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Execute a command when no Plex sessions are active](https://gist.github.com/JonnyWong16/bc50c882985cc495e629f41c12bc7590) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Create a Plex collection from a text file list of rating keys](https://gist.github.com/JonnyWong16/148b5a5dc39211bd6a871cb8f9df8c48) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Sync Plex playlists to shared users](https://gist.github.com/JonnyWong16/2607abf0e3431b6f133861bbe1bb694e) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Removes ALL collections from ALL movies](https://gist.github.com/JonnyWong16/34878448ab45dfffffa930f5cf8c252a) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Saves artist.jpg to the Artist folder.](https://gist.github.com/JonnyWong16/8ede4aabce105217a70cc2386ce673f7) | Python | [JonnyWong16](https://gist.github.com/JonnyWong16) | +| [Randomly create haiku based on Plex libraries content.](https://github.com/blacktwin/JBOPS/blob/master/fun/plexapi_haiku.py) | Python | [Blacktwin](https://gist.github.com/Blacktwin) | +| [Create a Plex Playlist with what was aired today in history.](https://github.com/blacktwin/JBOPS/blob/master/fun/aired_today_playlist.py) | Python | [Blacktwin](https://gist.github.com/Blacktwin) | +| [Pull Movie and TV Show poster images from Plex.](https://github.com/blacktwin/JBOPS/blob/master/utility/plex_api_poster_pull.py) | Python | [Blacktwin](https://gist.github.com/Blacktwin) | +| [Download theme songs from Plex TV Shows.](https://github.com/blacktwin/JBOPS/blob/master/utility/plex_theme_songs.py) | Python | [Blacktwin](https://gist.github.com/Blacktwin) | +| [Delete shows that a list of users have watched.](https://github.com/blacktwin/JBOPS/blob/master/utility/delete_watched_TV.py) | Python | [Blacktwin](https://gist.github.com/Blacktwin) | +| [Delete movies that a list of users have watched.](https://github.com/blacktwin/JBOPS/blob/master/utility/remove_watched_movies.py) | Python | [Blacktwin](https://gist.github.com/Blacktwin) | \ No newline at end of file diff --git a/docs/Debugging.md b/docs/Debugging.md new file mode 100644 index 00000000..8c8d1a12 --- /dev/null +++ b/docs/Debugging.md @@ -0,0 +1,56 @@ +# Debugging Tautulli + +This page guides you through some common debugging steps to verify the +information in Tautulli. + +## Activity + +_Triple_ clicking on the word `ACTIVITY` at the top of the Tautulli page will +open up the raw XML file on your Plex server that Tautulli is parsing in order +to show you the current activity on the server. + +![2018-06-20_12-50-14](https://user-images.githubusercontent.com/427137/41681142-948d507e-7488-11e8-977f-e51cdbd8658e.gif) + +If you are accessing Tautulli from outside your network and the address that +Tautulli uses to connect to Plex isn't available you will need to fix the +location in the address bar. If you find yourself using this XML shortcut often +you can have Tautulli automatically override the link for you by shutting down +Tautulli, editing `config.ini`, and editing the `pms_url_override` value to the +public location of your Plex server. + +_Note:_ Your browser will likely block this at first since it is a pop-up! +You'll need to allow pop-ups in your browser for your Tautulli domain, +instructions for the Chrome browser can be found +[here](https://support.google.com/chrome/answer/95472?co=GENIE.Platform%3DDesktop&hl=en). + +## Stream Info + +You can view the information that Tautulli has parsed from the raw XML data for +a particular stream by _single_ clicking on the `STREAM` word in an activity +card: + +![2018-06-20_12-54-58](https://user-images.githubusercontent.com/427137/41681340-2f75a0f0-7489-11e8-9cae-70672318e6f8.gif) + +This information can be handy to check against when using text parameters or +conditions in a Notification Agent. + +## More XML Shortcuts + +Similar to triple clicking on the word `ACTIVITY` on the home page, if you _triple_ +click on one of the following you will be brought to the XML that the data is +being generated from: + +* "All Libraries" on the Libraries page +* "All Users" on the Users page +* "Synced Items" on the Synced Items page +* "PLEX MEDIA SERVER" under Settings -> Plex Media Server +* The [last breadcrumb](https://i.imgur.com/rkxFUxm.png) on any media info page +* "RECENTLY ADDED" on the home page + +## Scheduled Tasks + +Under Settings -> Help & Info Tautulli shows you a listing of the scheduled tasks currently active on your system. You can click on the following tasks to get a pop-up with a detailed listing of their relevant information: +* _Check for active sessions_ + * Click for a listing of currently active sessions and when they will be flushed to the database if Plex fails to send a stop event for them +* _Check for recently added items_ + * Click for a listing of items that Tautulli has recently seen get added to Plex, and when they are scheduled to be announced \ No newline at end of file diff --git a/docs/Exporter-Guide.md b/docs/Exporter-Guide.md new file mode 100644 index 00000000..e0ba6a2d --- /dev/null +++ b/docs/Exporter-Guide.md @@ -0,0 +1,1345 @@ +### Contents: + +* [Introduction](#introduction) +* [File Formats](#file-format) + * [Export Individual Files](#individual-files) +* [Metadata and Media Info Exports](#metadata-media-info-export) + * [Metadata and Media Info Export Levels](#metadata-media-info-export-level) + * [Custom Fields](#custom-field) +* [Image Exports](#image-export) + * [Image Export Levels](#image-export-level) +* [Media Type Fields](#media-type-field) + * [Movies](#movie) + * [Shows](#show) + * [Seasons](#season) + * [Episodes](#episode) + * [Artists](#artist) + * [Albums](#album) + * [Tracks](#track) + * [Photo Albums](#photoalbum) + * [Photos](#photo) + * [Clips](#clip) + * [Collections](#collection) + * [Playlists](#playlist) + +--- + +## Introduction + +The exporter feature of Tautulli allows you to export metadata and media info from your Plex library. The exporter can be accessed from various locations: + +1. On any library page from the [Collections](./images/exporter_library_collections.png), [Playlists](./images/exporter_library_playlists.png), or [Export](./images/exporter_library_export.png) tabs. This will allow you to export all of your collections, playlists or all items for any library on your Plex server. +1. On any user page from the [Playlists](./images/exporter_user_playlists.png) tab. This will allow you to export all of a user's playlists for any user on your Plex server. +1. On any media info page from the [Export](./images/exporter_media_info.png) tab. This will allow you to export the metadata for any single media item on your Plex server. + +Clicking on the export button on any of those pages will open up the [export metadata modal](./images/exporter_modal.png) where you can customize your export. All the customization options are described in the sections below. + +The [metadata exports table](./images/exporter_table.png) on the library, user, or media info page will list all your previous exports and allow you to view or download a copy of the exported files. The download will return the exported file if only a single data file is exported, otherwise the download will return a `zip` archive containing all the exported data files and images. A progress percentage will be shown in the downloads column while an export is in progress. Exports are processed in the background so you may leave the page and check back later when it is complete. + +* **Note:** The exporter only exports metadata. There is no import feature available in Tautulli. + + +## File Formats + +Metadata can be exported to various file formats. Notes about each file format is listed in the following table. + +| File Format | Description | +| :---: | --- | +| `csv` | Export a comma-separated values file.

| +| `json` | Export a `json` format file. | +| `xml` | Export a `xml` format file. | +| `m3u8` | Only export a `m3u8` playlist file with the paths to all the media items without any additional metadata. | + + +### Export Individual Files + +Enable this option to export one file for each collection/playlist/library item instead of a single file containing all items. + +* **Note:** This option is only available when exporting collections, playlists or all items from the library or user page. + + +## Metadata and Media Info Exports + +The exporter has several predefined export levels. The export levels are separated into _metadata levels_ which include fields about the metadata of the item (e.g. `title`, `year`, `summary`, etc.) and _media info levels_ which include fields about the media file (e.g. `media.videoResolution`, `media.audioCodec`, `media.hdr`, etc.). The metadata level and media info level can be different, and the same level *does not* need to be selected for both. Higher levels will include all the fields from the lower levels. The fields that will be exported for each level are listed in the [Media Type Fields](#media-type-field) sections below. + + +### Metadata and Media Info Export Levels + +| Matadata Export Level | Name | Description | +| :---: | --- | --- | +| **Level 0** | None / Custom | No metadata will be exported. Specify custom metadata fields to select which fields to export. | +| **Level 1** | Basic Metadata | Only basic metadata such as `title`, `year`, `summary`, etc. | +| **Level 2** | Extended Metadata | Tags such as `genres.tag`, `collections.tag`, `roles.tag`, etc. | +| **Level 3** | Advanced Metadata | Fields such as Plex API keys for `art`, `thumb`, `theme`, etc. | +| **Level 9** | All Metadata | All metadata will be exported. | + +| Media Info Export Level | Name | Description | +| :---: | --- | --- | +| **Level 0** | None / Custom | No media info will be exported. Specify custom media info fields to select which fields to export. | +| **Level 1** | Basic Media Info| Only basic media info such as `media.bitrate`, `media.videoCodec`, `media.audioChannels`, etc. | +| **Level 2** | Extended Media Info | Fields for the specific media file part such as `media.parts.size`, `media.parts.duration`, etc. | +| **Level 3** | Advanced Media Info | Fields for specific streams inside a media file part such as
`media.parts.videoStream.refFrames`, `media.parts.audioStream.samplingRate`, `media.parts.subtitleStream.language`, etc. | +| **Level 9** | All Media Info | All media info will be exported. | + + +### Custom Fields + +[Custom fields](./images/exporter_custom_fields.png) can be added *in addition* to any export level. All fields from the selected metadata or media info level *plus* the custom fields will be exported. Start typing in the custom field box to search for a specific field to add. Some fields will be disabled to indicate that it is already included in the selected export level. All the available fields are listed in the [Media Type Fields](#media-type-field) sections below. + +* **Note:** Custom fields for child media types are prefixed with the media type and separated with periods (`.`). The periods also delineate the tree structure in the `json` or `xml` file. + * e.g. The `seasons.episodes.title` field will export the episode title for all seasons and all episodes for a TV show. + +* **Note:** For [Collections](#collection) and [Playlists](#playlist), the `items` prefix can be different media types depending on the context. Refer to the [Media Type Fields](#media-type-field) sections below for all the possible media types. + * e.g. The `items.title` field will be the movie title in a movie collection or TV show titles in a TV show collection. + + +## Image Exports + +[Poster/cover images and background artwork](./images/exporter_images.png) can be exported along with the metadata. Images will be exported to a `.images` folder alongside the data file with the extension `.thumb.jpg` for posters/covers and `.art.jpg` for background artwork. When downloading an export from the [metadata exports table](./images/exporter_table.png), the images will be included in a `zip` archive with the data file. + +* **Warning:** Exporting images may take a long time! + +* **Note:** Images will only be exported by the selected image export level for the following supported media types: + * Movies, shows, seasons, artists, albums, collections and collection items, playlist items +* **Note:** Additional images for _any_ media type can be exported by adding `thumbFile` for posters/covers and `artFile` for background artwork to the custom metadata fields. Adding the custom field will export _all_ images of that type regardless of the selected image export level. + * e.g. Adding `episodes.thumbFile` to the custom metadata fields will export all episode thumbnails even though it is not included in the supported image export media types. + +### Image Export Levels + +| Poser and Cover Image Export Level | Name | Description | +| :---: | --- | --- | +| **Level 0** | None / Custom | No poster/cover images will be exported. Specific posters/covers can be exported by adding `thumbFile` to the custom metadata fields. | +| **Level 1** | Uploaded and Selected Posters and Covers Only | Only custom poster/cover images which have been uploaded manually and are currently selected as the active poster/cover. +| **Level 2** | Selected and Locked Posters and Covers Only | Only currently selected poster/cover images which have been changed from the default poster/cover. +| **Level 9** | All Selected Posters and Covers | All poster/cover images for the supported media types. | + +| Background Artwork Image Export Level | Name | Description | +| :---: | --- | --- | +| **Level 0** | None / Custom | No background artwork images will be exported. Specific background art can be exported by adding `artFile` to the custom metadata fields. | +| **Level 1** | Uploaded and Selected Artwork Only | Only custom background artwork images which have been uploaded manually and are currently selected as the active artwork. | +| **Level 2** | Selected and Locked Artwork Only | Only currently selected background artwork images which have been changed from the default artwork. | +| **Level 9** | All Selected Artwork | All background artwork images for the supported media types. | + + +## Media Type Fields + + +### Movies + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `art` | | | | ✓ | ✓ | +| `artBlurHash` | | | | | ✓ | +| `artFile` | Refer to [Image Exports](#image-export) | | | | | +| `audienceRating` | | ✓ | ✓ | ✓ | ✓ | +| `audienceRatingImage` | | ✓ | ✓ | ✓ | ✓ | +| `chapterSource` | | | | ✓ | ✓ | +| `contentRating` | | ✓ | ✓ | ✓ | ✓ | +| `duration` | | ✓ | ✓ | ✓ | ✓ | +| `durationHuman` | | ✓ | ✓ | ✓ | ✓ | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `key` | | | | ✓ | ✓ | +| `languageOverride` | | | | | ✓ | +| `lastViewedAt` | | | | ✓ | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `originalTitle` | | ✓ | ✓ | ✓ | ✓ | +| `originallyAvailableAt` | | ✓ | ✓ | ✓ | ✓ | +| `rating` | | ✓ | ✓ | ✓ | ✓ | +| `ratingImage` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `studio` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `tagline` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `thumbBlurHash` | | | | | ✓ | +| `thumbFile` | Refer to [Image Exports](#image-export) | | | | | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `useOriginalTitle` | | | | | ✓ | +| `userRating` | | ✓ | ✓ | ✓ | ✓ | +| `viewCount` | | | | ✓ | ✓ | +| `viewOffset` | | | | | ✓ | +| `year` | | ✓ | ✓ | ✓ | ✓ | +| `chapters.end` | | | | ✓ | ✓ | +| `chapters.id` | | | | | ✓ | +| `chapters.index` | | | | ✓ | ✓ | +| `chapters.start` | | | | ✓ | ✓ | +| `chapters.tag` | | | | ✓ | ✓ | +| `chapters.thumb` | | | | ✓ | ✓ | +| `collections.id` | | | | | ✓ | +| `collections.tag` | | | ✓ | ✓ | ✓ | +| `countries.id` | | | | | ✓ | +| `countries.tag` | | | ✓ | ✓ | ✓ | +| `directors.id` | | | | | ✓ | +| `directors.tag` | | | ✓ | ✓ | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `genres.id` | | | | | ✓ | +| `genres.tag` | | | ✓ | ✓ | ✓ | +| `guids.id` | | | ✓ | ✓ | ✓ | +| `labels.id` | | | | | ✓ | +| `labels.tag` | | | ✓ | ✓ | ✓ | +| `producers.id` | | | | | ✓ | +| `producers.tag` | | | ✓ | ✓ | ✓ | +| `roles.id` | | | | | ✓ | +| `roles.role` | | | ✓ | ✓ | ✓ | +| `roles.tag` | | | ✓ | ✓ | ✓ | +| `roles.thumb` | | | | | ✓ | +| `writers.id` | | | | | ✓ | +| `writers.tag` | | | ✓ | ✓ | ✓ | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `locations` | | ✓ | ✓ | ✓ | ✓ | +| `media.aspectRatio` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioChannels` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioCodec` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioProfile` | | ✓ | ✓ | ✓ | ✓ | +| `media.bitrate` | | ✓ | ✓ | ✓ | ✓ | +| `media.container` | | ✓ | ✓ | ✓ | ✓ | +| `media.duration` | | ✓ | ✓ | ✓ | ✓ | +| `media.has64bitOffsets` | | | | | ✓ | +| `media.hdr` | | ✓ | ✓ | ✓ | ✓ | +| `media.height` | | ✓ | ✓ | ✓ | ✓ | +| `media.id` | | | | | ✓ | +| `media.isOptimizedVersion` | | ✓ | ✓ | ✓ | ✓ | +| `media.optimizedForStreaming` | | | | | ✓ | +| `media.proxyType` | | | | | ✓ | +| `media.target` | | | | | ✓ | +| `media.title` | | | | | ✓ | +| `media.videoCodec` | | ✓ | ✓ | ✓ | ✓ | +| `media.videoFrameRate` | | ✓ | ✓ | ✓ | ✓ | +| `media.videoProfile` | | ✓ | ✓ | ✓ | ✓ | +| `media.videoResolution` | | ✓ | ✓ | ✓ | ✓ | +| `media.width` | | ✓ | ✓ | ✓ | ✓ | +| `media.parts.accessible` | | | | | ✓ | +| `media.parts.audioProfile` | | | ✓ | ✓ | ✓ | +| `media.parts.container` | | | ✓ | ✓ | ✓ | +| `media.parts.deepAnalysisVersion` | | | ✓ | ✓ | ✓ | +| `media.parts.duration` | | | ✓ | ✓ | ✓ | +| `media.parts.exists` | | | | | ✓ | +| `media.parts.file` | | | ✓ | ✓ | ✓ | +| `media.parts.has64bitOffsets` | | | | | ✓ | +| `media.parts.hasThumbnail` | | | | | ✓ | +| `media.parts.id` | | | | | ✓ | +| `media.parts.indexes` | | | ✓ | ✓ | ✓ | +| `media.parts.key` | | | | | ✓ | +| `media.parts.optimizedForStreaming` | | | ✓ | ✓ | ✓ | +| `media.parts.packetLength` | | | | | ✓ | +| `media.parts.requiredBandwidths` | | | | | ✓ | +| `media.parts.size` | | | ✓ | ✓ | ✓ | +| `media.parts.sizeHuman` | | | ✓ | ✓ | ✓ | +| `media.parts.syncItemId` | | | | | ✓ | +| `media.parts.syncState` | | | | | ✓ | +| `media.parts.videoProfile` | | | ✓ | ✓ | ✓ | +| `media.parts.audioStreams.audioChannelLayout` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitDepth` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitrate` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitrateMode` | | | | | ✓ | +| `media.parts.audioStreams.channels` | | | | ✓ | ✓ | +| `media.parts.audioStreams.codec` | | | | ✓ | ✓ | +| `media.parts.audioStreams.default` | | | | ✓ | ✓ | +| `media.parts.audioStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.audioStreams.duration` | | | | | ✓ | +| `media.parts.audioStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.audioStreams.id` | | | | | ✓ | +| `media.parts.audioStreams.index` | | | | | ✓ | +| `media.parts.audioStreams.key` | | | | | ✓ | +| `media.parts.audioStreams.language` | | | | ✓ | ✓ | +| `media.parts.audioStreams.languageCode` | | | | ✓ | ✓ | +| `media.parts.audioStreams.profile` | | | | ✓ | ✓ | +| `media.parts.audioStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.audioStreams.samplingRate` | | | | ✓ | ✓ | +| `media.parts.audioStreams.selected` | | | | | ✓ | +| `media.parts.audioStreams.streamIdentifier` | | | | | ✓ | +| `media.parts.audioStreams.streamType` | | | | | ✓ | +| `media.parts.audioStreams.title` | | | | ✓ | ✓ | +| `media.parts.audioStreams.type` | | | | | ✓ | +| `media.parts.subtitleStreams.codec` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.container` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.default` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.forced` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.format` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.headerCompression` | | | | | ✓ | +| `media.parts.subtitleStreams.id` | | | | | ✓ | +| `media.parts.subtitleStreams.index` | | | | | ✓ | +| `media.parts.subtitleStreams.key` | | | | | ✓ | +| `media.parts.subtitleStreams.language` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.languageCode` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.subtitleStreams.selected` | | | | | ✓ | +| `media.parts.subtitleStreams.streamType` | | | | | ✓ | +| `media.parts.subtitleStreams.title` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.transient` | | | | | ✓ | +| `media.parts.subtitleStreams.type` | | | | | ✓ | +| `media.parts.videoStreams.DOVIBLCompatID` | | | | | ✓ | +| `media.parts.videoStreams.DOVIBLPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVIELPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVILevel` | | | | | ✓ | +| `media.parts.videoStreams.DOVIPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVIProfile` | | | | | ✓ | +| `media.parts.videoStreams.DOVIRPUPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVIVersion` | | | | | ✓ | +| `media.parts.videoStreams.anamorphic` | | | | | ✓ | +| `media.parts.videoStreams.bitDepth` | | | | ✓ | ✓ | +| `media.parts.videoStreams.bitrate` | | | | ✓ | ✓ | +| `media.parts.videoStreams.cabac` | | | | | ✓ | +| `media.parts.videoStreams.chromaLocation` | | | | | ✓ | +| `media.parts.videoStreams.chromaSubsampling` | | | | | ✓ | +| `media.parts.videoStreams.codec` | | | | ✓ | ✓ | +| `media.parts.videoStreams.codecID` | | | | | ✓ | +| `media.parts.videoStreams.codedHeight` | | | | | ✓ | +| `media.parts.videoStreams.codedWidth` | | | | | ✓ | +| `media.parts.videoStreams.colorPrimaries` | | | | | ✓ | +| `media.parts.videoStreams.colorRange` | | | | | ✓ | +| `media.parts.videoStreams.colorSpace` | | | | ✓ | ✓ | +| `media.parts.videoStreams.colorTrc` | | | | | ✓ | +| `media.parts.videoStreams.default` | | | | ✓ | ✓ | +| `media.parts.videoStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.videoStreams.duration` | | | | | ✓ | +| `media.parts.videoStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.videoStreams.frameRate` | | | | ✓ | ✓ | +| `media.parts.videoStreams.frameRateMode` | | | | | ✓ | +| `media.parts.videoStreams.hasScalingMatrix` | | | | | ✓ | +| `media.parts.videoStreams.hdr` | | | | ✓ | ✓ | +| `media.parts.videoStreams.height` | | | | ✓ | ✓ | +| `media.parts.videoStreams.id` | | | | | ✓ | +| `media.parts.videoStreams.index` | | | | | ✓ | +| `media.parts.videoStreams.key` | | | | | ✓ | +| `media.parts.videoStreams.language` | | | | ✓ | ✓ | +| `media.parts.videoStreams.languageCode` | | | | ✓ | ✓ | +| `media.parts.videoStreams.level` | | | | ✓ | ✓ | +| `media.parts.videoStreams.pixelAspectRatio` | | | | | ✓ | +| `media.parts.videoStreams.pixelFormat` | | | | | ✓ | +| `media.parts.videoStreams.profile` | | | | ✓ | ✓ | +| `media.parts.videoStreams.refFrames` | | | | ✓ | ✓ | +| `media.parts.videoStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.videoStreams.scanType` | | | | ✓ | ✓ | +| `media.parts.videoStreams.selected` | | | | | ✓ | +| `media.parts.videoStreams.streamIdentifier` | | | | | ✓ | +| `media.parts.videoStreams.streamType` | | | | | ✓ | +| `media.parts.videoStreams.title` | | | | ✓ | ✓ | +| `media.parts.videoStreams.type` | | | | | ✓ | +| `media.parts.videoStreams.width` | | | | ✓ | ✓ | +
+ + +### Shows + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `art` | | | | ✓ | ✓ | +| `artBlurHash` | | | | | ✓ | +| `artFile` | Refer to [Image Exports](#image-export) | | | | | +| `audienceRating` | | ✓ | ✓ | ✓ | ✓ | +| `audienceRatingImage` | | ✓ | ✓ | ✓ | ✓ | +| `autoDeletionItemPolicyUnwatchedLibrary` | | | | | ✓ | +| `autoDeletionItemPolicyWatchedLibrary` | | | | | ✓ | +| `banner` | | | | ✓ | ✓ | +| `bannerFile` | | | | | ✓ | +| `childCount` | | ✓ | ✓ | ✓ | ✓ | +| `contentRating` | | ✓ | ✓ | ✓ | ✓ | +| `duration` | | ✓ | ✓ | ✓ | ✓ | +| `durationHuman` | | ✓ | ✓ | ✓ | ✓ | +| `episodeSort` | | | | | ✓ | +| `flattenSeasons` | | | | | ✓ | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | | | | ✓ | +| `key` | | | | ✓ | ✓ | +| `languageOverride` | | | | | ✓ | +| `lastViewedAt` | | | | ✓ | ✓ | +| `leafCount` | | | | | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `network` | | ✓ | ✓ | ✓ | ✓ | +| `originalTitle` | | ✓ | ✓ | ✓ | ✓ | +| `originallyAvailableAt` | | ✓ | ✓ | ✓ | ✓ | +| `rating` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `showOrdering` | | | | | ✓ | +| `studio` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `tagline` | | ✓ | ✓ | ✓ | ✓ | +| `theme` | | | | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `thumbBlurHash` | | | | | ✓ | +| `thumbFile` | Refer to [Image Exports](#image-export) | | | | | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `useOriginalTitle` | | | | | ✓ | +| `userRating` | | ✓ | ✓ | ✓ | ✓ | +| `viewCount` | | | | ✓ | ✓ | +| `viewedLeafCount` | | | | | ✓ | +| `year` | | ✓ | ✓ | ✓ | ✓ | +| `collections.id` | | | | | ✓ | +| `collections.tag` | | | ✓ | ✓ | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `genres.id` | | | | | ✓ | +| `genres.tag` | | | ✓ | ✓ | ✓ | +| `guids.id` | | | ✓ | ✓ | ✓ | +| `labels.id` | | | | | ✓ | +| `labels.tag` | | | ✓ | ✓ | ✓ | +| `roles.id` | | | | | ✓ | +| `roles.role` | | | ✓ | ✓ | ✓ | +| `roles.tag` | | | ✓ | ✓ | ✓ | +| `roles.thumb` | | | | | ✓ | +| `seasons` | | ✓
Includes [Seasons](#show-season) Level 1 | ✓
Includes [Seasons](#show-season) Level 2 | ✓
Includes [Seasons](#show-season) Level 3 | ✓
Includes [Seasons](#show-season) Level 9 | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `locations` | | | | | ✓ | +| `seasons` | | ✓
Includes [Seasons](#show-season) Level 1 | ✓
Includes [Seasons](#show-season) Level 2 | ✓
Includes [Seasons](#show-season) Level 3 | ✓
Includes [Seasons](#show-season) Level 9 | +
+ + +### Seasons + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `art` | | | | ✓ | ✓ | +| `artBlurHash` | | | | | ✓ | +| `artFile` | Refer to [Image Exports](#image-export) | | | | | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | ✓ | ✓ | ✓ | ✓ | +| `key` | | | | ✓ | ✓ | +| `lastViewedAt` | | | | ✓ | ✓ | +| `leafCount` | | | | | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `parentGuid` | | ✓ | ✓ | ✓ | ✓ | +| `parentIndex` | | | | | ✓ | +| `parentKey` | | | | ✓ | ✓ | +| `parentRatingKey` | | ✓ | ✓ | ✓ | ✓ | +| `parentTheme` | | | | ✓ | ✓ | +| `parentThumb` | | | | ✓ | ✓ | +| `parentTitle` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `thumbBlurHash` | | | | | ✓ | +| `thumbFile` | Refer to [Image Exports](#image-export) | | | | | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `userRating` | | ✓ | ✓ | ✓ | ✓ | +| `viewCount` | | | | ✓ | ✓ | +| `viewedLeafCount` | | | | | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `guids.id` | | | ✓ | ✓ | ✓ | +| `episodes` | | ✓
Includes [Episodes](#season-episode) Level 1 | ✓
Includes [Episodes](#season-episode) Level 2 | ✓
Includes [Episodes](#season-episode) Level 3 | ✓
Includes [Episodes](#season-episode) Level 9 | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `episodes` | | ✓
Includes [Episodes](#season-episode) Level 1 | ✓
Includes [Episodes](#season-episode) Level 2 | ✓
Includes [Episodes](#season-episode) Level 3 | ✓
Includes [Episodes](#season-episode) Level 9 | +
+ + +### Episodes + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `art` | | | | ✓ | ✓ | +| `artBlurHash` | | | | | ✓ | +| `artFile` | | | | | ✓ | +| `audienceRating` | | ✓ | ✓ | ✓ | ✓ | +| `audienceRatingImage` | | ✓ | ✓ | ✓ | ✓ | +| `chapterSource` | | | | ✓ | ✓ | +| `contentRating` | | ✓ | ✓ | ✓ | ✓ | +| `duration` | | ✓ | ✓ | ✓ | ✓ | +| `durationHuman` | | ✓ | ✓ | ✓ | ✓ | +| `grandparentArt` | | | | ✓ | ✓ | +| `grandparentGuid` | | ✓ | ✓ | ✓ | ✓ | +| `grandparentKey` | | | | ✓ | ✓ | +| `grandparentRatingKey` | | ✓ | ✓ | ✓ | ✓ | +| `grandparentTheme` | | | | ✓ | ✓ | +| `grandparentThumb` | | | | ✓ | ✓ | +| `grandparentTitle` | | ✓ | ✓ | ✓ | ✓ | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `hasIntroMarker` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | ✓ | ✓ | ✓ | ✓ | +| `key` | | | | ✓ | ✓ | +| `lastViewedAt` | | | | ✓ | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `originallyAvailableAt` | | ✓ | ✓ | ✓ | ✓ | +| `parentGuid` | | ✓ | ✓ | ✓ | ✓ | +| `parentIndex` | | ✓ | ✓ | ✓ | ✓ | +| `parentKey` | | | | ✓ | ✓ | +| `parentRatingKey` | | ✓ | ✓ | ✓ | ✓ | +| `parentThumb` | | | | ✓ | ✓ | +| `parentTitle` | | ✓ | ✓ | ✓ | ✓ | +| `rating` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `thumbBlurHash` | | | | | ✓ | +| `thumbFile` | | | | | ✓ | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `userRating` | | ✓ | ✓ | ✓ | ✓ | +| `viewCount` | | | | ✓ | ✓ | +| `viewOffset` | | | | | ✓ | +| `year` | | ✓ | ✓ | ✓ | ✓ | +| `chapters.end` | | | | ✓ | ✓ | +| `chapters.id` | | | | | ✓ | +| `chapters.index` | | | | ✓ | ✓ | +| `chapters.start` | | | | ✓ | ✓ | +| `chapters.tag` | | | | ✓ | ✓ | +| `chapters.thumb` | | | | ✓ | ✓ | +| `directors.id` | | | | | ✓ | +| `directors.tag` | | | ✓ | ✓ | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `guids.id` | | | ✓ | ✓ | ✓ | +| `markers.end` | | | ✓ | ✓ | ✓ | +| `markers.start` | | | ✓ | ✓ | ✓ | +| `markers.type` | | | ✓ | ✓ | ✓ | +| `writers.id` | | | | | ✓ | +| `writers.tag` | | | ✓ | ✓ | ✓ | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `locations` | | ✓ | ✓ | ✓ | ✓ | +| `media.aspectRatio` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioChannels` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioCodec` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioProfile` | | ✓ | ✓ | ✓ | ✓ | +| `media.bitrate` | | ✓ | ✓ | ✓ | ✓ | +| `media.container` | | ✓ | ✓ | ✓ | ✓ | +| `media.duration` | | ✓ | ✓ | ✓ | ✓ | +| `media.has64bitOffsets` | | | | | ✓ | +| `media.hdr` | | ✓ | ✓ | ✓ | ✓ | +| `media.height` | | ✓ | ✓ | ✓ | ✓ | +| `media.id` | | | | | ✓ | +| `media.isOptimizedVersion` | | ✓ | ✓ | ✓ | ✓ | +| `media.optimizedForStreaming` | | | | | ✓ | +| `media.proxyType` | | | | | ✓ | +| `media.target` | | | | | ✓ | +| `media.title` | | | | | ✓ | +| `media.videoCodec` | | ✓ | ✓ | ✓ | ✓ | +| `media.videoFrameRate` | | ✓ | ✓ | ✓ | ✓ | +| `media.videoProfile` | | ✓ | ✓ | ✓ | ✓ | +| `media.videoResolution` | | ✓ | ✓ | ✓ | ✓ | +| `media.width` | | ✓ | ✓ | ✓ | ✓ | +| `media.parts.accessible` | | | | | ✓ | +| `media.parts.audioProfile` | | | ✓ | ✓ | ✓ | +| `media.parts.container` | | | ✓ | ✓ | ✓ | +| `media.parts.deepAnalysisVersion` | | | ✓ | ✓ | ✓ | +| `media.parts.duration` | | | ✓ | ✓ | ✓ | +| `media.parts.exists` | | | | | ✓ | +| `media.parts.file` | | | ✓ | ✓ | ✓ | +| `media.parts.has64bitOffsets` | | | | | ✓ | +| `media.parts.hasThumbnail` | | | | | ✓ | +| `media.parts.id` | | | | | ✓ | +| `media.parts.indexes` | | | ✓ | ✓ | ✓ | +| `media.parts.key` | | | | | ✓ | +| `media.parts.optimizedForStreaming` | | | ✓ | ✓ | ✓ | +| `media.parts.packetLength` | | | | | ✓ | +| `media.parts.requiredBandwidths` | | | | | ✓ | +| `media.parts.size` | | | ✓ | ✓ | ✓ | +| `media.parts.sizeHuman` | | | ✓ | ✓ | ✓ | +| `media.parts.syncItemId` | | | | | ✓ | +| `media.parts.syncState` | | | | | ✓ | +| `media.parts.videoProfile` | | | ✓ | ✓ | ✓ | +| `media.parts.audioStreams.audioChannelLayout` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitDepth` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitrate` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitrateMode` | | | | | ✓ | +| `media.parts.audioStreams.channels` | | | | ✓ | ✓ | +| `media.parts.audioStreams.codec` | | | | ✓ | ✓ | +| `media.parts.audioStreams.default` | | | | ✓ | ✓ | +| `media.parts.audioStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.audioStreams.duration` | | | | | ✓ | +| `media.parts.audioStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.audioStreams.id` | | | | | ✓ | +| `media.parts.audioStreams.index` | | | | | ✓ | +| `media.parts.audioStreams.key` | | | | | ✓ | +| `media.parts.audioStreams.language` | | | | ✓ | ✓ | +| `media.parts.audioStreams.languageCode` | | | | ✓ | ✓ | +| `media.parts.audioStreams.profile` | | | | ✓ | ✓ | +| `media.parts.audioStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.audioStreams.samplingRate` | | | | ✓ | ✓ | +| `media.parts.audioStreams.selected` | | | | | ✓ | +| `media.parts.audioStreams.streamIdentifier` | | | | | ✓ | +| `media.parts.audioStreams.streamType` | | | | | ✓ | +| `media.parts.audioStreams.title` | | | | ✓ | ✓ | +| `media.parts.audioStreams.type` | | | | | ✓ | +| `media.parts.subtitleStreams.codec` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.container` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.default` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.forced` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.format` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.headerCompression` | | | | | ✓ | +| `media.parts.subtitleStreams.id` | | | | | ✓ | +| `media.parts.subtitleStreams.index` | | | | | ✓ | +| `media.parts.subtitleStreams.key` | | | | | ✓ | +| `media.parts.subtitleStreams.language` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.languageCode` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.subtitleStreams.selected` | | | | | ✓ | +| `media.parts.subtitleStreams.streamType` | | | | | ✓ | +| `media.parts.subtitleStreams.title` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.transient` | | | | | ✓ | +| `media.parts.subtitleStreams.type` | | | | | ✓ | +| `media.parts.videoStreams.DOVIBLCompatID` | | | | | ✓ | +| `media.parts.videoStreams.DOVIBLPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVIELPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVILevel` | | | | | ✓ | +| `media.parts.videoStreams.DOVIPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVIProfile` | | | | | ✓ | +| `media.parts.videoStreams.DOVIRPUPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVIVersion` | | | | | ✓ | +| `media.parts.videoStreams.anamorphic` | | | | | ✓ | +| `media.parts.videoStreams.bitDepth` | | | | ✓ | ✓ | +| `media.parts.videoStreams.bitrate` | | | | ✓ | ✓ | +| `media.parts.videoStreams.cabac` | | | | | ✓ | +| `media.parts.videoStreams.chromaLocation` | | | | | ✓ | +| `media.parts.videoStreams.chromaSubsampling` | | | | | ✓ | +| `media.parts.videoStreams.codec` | | | | ✓ | ✓ | +| `media.parts.videoStreams.codecID` | | | | | ✓ | +| `media.parts.videoStreams.codedHeight` | | | | | ✓ | +| `media.parts.videoStreams.codedWidth` | | | | | ✓ | +| `media.parts.videoStreams.colorPrimaries` | | | | | ✓ | +| `media.parts.videoStreams.colorRange` | | | | | ✓ | +| `media.parts.videoStreams.colorSpace` | | | | ✓ | ✓ | +| `media.parts.videoStreams.colorTrc` | | | | | ✓ | +| `media.parts.videoStreams.default` | | | | ✓ | ✓ | +| `media.parts.videoStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.videoStreams.duration` | | | | | ✓ | +| `media.parts.videoStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.videoStreams.frameRate` | | | | ✓ | ✓ | +| `media.parts.videoStreams.frameRateMode` | | | | | ✓ | +| `media.parts.videoStreams.hasScalingMatrix` | | | | | ✓ | +| `media.parts.videoStreams.hdr` | | | | ✓ | ✓ | +| `media.parts.videoStreams.height` | | | | ✓ | ✓ | +| `media.parts.videoStreams.id` | | | | | ✓ | +| `media.parts.videoStreams.index` | | | | | ✓ | +| `media.parts.videoStreams.key` | | | | | ✓ | +| `media.parts.videoStreams.language` | | | | ✓ | ✓ | +| `media.parts.videoStreams.languageCode` | | | | ✓ | ✓ | +| `media.parts.videoStreams.level` | | | | ✓ | ✓ | +| `media.parts.videoStreams.pixelAspectRatio` | | | | | ✓ | +| `media.parts.videoStreams.pixelFormat` | | | | | ✓ | +| `media.parts.videoStreams.profile` | | | | ✓ | ✓ | +| `media.parts.videoStreams.refFrames` | | | | ✓ | ✓ | +| `media.parts.videoStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.videoStreams.scanType` | | | | ✓ | ✓ | +| `media.parts.videoStreams.selected` | | | | | ✓ | +| `media.parts.videoStreams.streamIdentifier` | | | | | ✓ | +| `media.parts.videoStreams.streamType` | | | | | ✓ | +| `media.parts.videoStreams.title` | | | | ✓ | ✓ | +| `media.parts.videoStreams.type` | | | | | ✓ | +| `media.parts.videoStreams.width` | | | | ✓ | ✓ | +
+ + +### Artists + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `albumSort` | | | | | ✓ | +| `art` | | | | ✓ | ✓ | +| `artBlurHash` | | | | | ✓ | +| `artFile` | Refer to [Image Exports](#image-export) | | | | | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | | | | ✓ | +| `key` | | | | ✓ | ✓ | +| `lastViewedAt` | | | | ✓ | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `rating` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `thumbBlurHash` | | | | | ✓ | +| `thumbFile` | Refer to [Image Exports](#image-export) | | | | | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `userRating` | | ✓ | ✓ | ✓ | ✓ | +| `viewCount` | | | | ✓ | ✓ | +| `collections.id` | | | | | ✓ | +| `collections.tag` | | | ✓ | ✓ | ✓ | +| `countries.id` | | | | | ✓ | +| `countries.tag` | | | ✓ | ✓ | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `genres.id` | | | | | ✓ | +| `genres.tag` | | | ✓ | ✓ | ✓ | +| `moods.id` | | | | | ✓ | +| `moods.tag` | | | ✓ | ✓ | ✓ | +| `similar.id` | | | | | ✓ | +| `similar.tag` | | | ✓ | ✓ | ✓ | +| `styles.id` | | | | | ✓ | +| `styles.tag` | | | ✓ | ✓ | ✓ | +| `albums` | | ✓
Includes [Albums](#artist-album) Level 1 | ✓
Includes [Albums](#artist-album) Level 2 | ✓
Includes [Albums](#artist-album) Level 3 | ✓
Includes [Albums](#artist-album) Level 9 | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `locations` | | | | | ✓ | +| `albums` | | ✓
Includes [Albums](#artist-album) Level 1 | ✓
Includes [Albums](#artist-album) Level 2 | ✓
Includes [Albums](#artist-album) Level 3 | ✓
Includes [Albums](#artist-album) Level 9 | +
+ + +### Albums + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `art` | | | | ✓ | ✓ | +| `artBlurHash` | | | | | ✓ | +| `artFile` | Refer to [Image Exports](#image-export) | | | | | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | ✓ | ✓ | ✓ | ✓ | +| `key` | | | | ✓ | ✓ | +| `lastViewedAt` | | | | ✓ | ✓ | +| `leafCount` | | | | | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `loudnessAnalysisVersion` | | | | | ✓ | +| `originallyAvailableAt` | | ✓ | ✓ | ✓ | ✓ | +| `parentGuid` | | ✓ | ✓ | ✓ | ✓ | +| `parentKey` | | | | ✓ | ✓ | +| `parentRatingKey` | | ✓ | ✓ | ✓ | ✓ | +| `parentThumb` | | | | ✓ | ✓ | +| `parentTitle` | | ✓ | ✓ | ✓ | ✓ | +| `rating` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `studio` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `thumbBlurHash` | | | | | ✓ | +| `thumbFile` | Refer to [Image Exports](#image-export) | | | | | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `userRating` | | ✓ | ✓ | ✓ | ✓ | +| `viewCount` | | | | ✓ | ✓ | +| `viewedLeafCount` | | | | | ✓ | +| `year` | | ✓ | ✓ | ✓ | ✓ | +| `collections.id` | | | | | ✓ | +| `collections.tag` | | | ✓ | ✓ | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `genres.id` | | | | | ✓ | +| `genres.tag` | | | ✓ | ✓ | ✓ | +| `labels.id` | | | | | ✓ | +| `labels.tag` | | | ✓ | ✓ | ✓ | +| `moods.id` | | | | | ✓ | +| `moods.tag` | | | ✓ | ✓ | ✓ | +| `styles.id` | | | | | ✓ | +| `styles.tag` | | | ✓ | ✓ | ✓ | +| `tracks` | | ✓
Includes [Tracks](#album-track) Level 1 | ✓
Includes [Tracks](#album-track) Level 2 | ✓
Includes [Tracks](#album-track) Level 3 | ✓
Includes [Tracks](#album-track) Level 9 | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `tracks` | | ✓
Includes [Tracks](#album-track) Level 1 | ✓
Includes [Tracks](#album-track) Level 2 | ✓
Includes [Tracks](#album-track) Level 3 | ✓
Includes [Tracks](#album-track) Level 9 | +
+ + +### Tracks + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `art` | | | | ✓ | ✓ | +| `artBlurHash` | | | | | ✓ | +| `chapterSource` | | | | | ✓ | +| `duration` | | ✓ | ✓ | ✓ | ✓ | +| `durationHuman` | | ✓ | ✓ | ✓ | ✓ | +| `grandparentArt` | | | | ✓ | ✓ | +| `grandparentGuid` | | ✓ | ✓ | ✓ | ✓ | +| `grandparentKey` | | | | ✓ | ✓ | +| `grandparentRatingKey` | | ✓ | ✓ | ✓ | ✓ | +| `grandparentThumb` | | | | ✓ | ✓ | +| `grandparentTitle` | | ✓ | ✓ | ✓ | ✓ | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | ✓ | ✓ | ✓ | ✓ | +| `key` | | | | ✓ | ✓ | +| `lastViewedAt` | | | | ✓ | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `originalTitle` | | ✓ | ✓ | ✓ | ✓ | +| `parentGuid` | | ✓ | ✓ | ✓ | ✓ | +| `parentIndex` | | ✓ | ✓ | ✓ | ✓ | +| `parentKey` | | | | ✓ | ✓ | +| `parentRatingKey` | | ✓ | ✓ | ✓ | ✓ | +| `parentThumb` | | | | ✓ | ✓ | +| `parentTitle` | | ✓ | ✓ | ✓ | ✓ | +| `ratingCount` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `thumbBlurHash` | | | | | ✓ | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `userRating` | | ✓ | ✓ | ✓ | ✓ | +| `viewCount` | | | | ✓ | ✓ | +| `viewOffset` | | | | | ✓ | +| `year` | | ✓ | ✓ | ✓ | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `moods.id` | | | | | ✓ | +| `moods.tag` | | | ✓ | ✓ | ✓ | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `locations` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioChannels` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioCodec` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioProfile` | | ✓ | ✓ | ✓ | ✓ | +| `media.bitrate` | | ✓ | ✓ | ✓ | ✓ | +| `media.container` | | ✓ | ✓ | ✓ | ✓ | +| `media.duration` | | ✓ | ✓ | ✓ | ✓ | +| `media.id` | | | | | ✓ | +| `media.title` | | | | | ✓ | +| `media.parts.accessible` | | | | | ✓ | +| `media.parts.audioProfile` | | | ✓ | ✓ | ✓ | +| `media.parts.container` | | | ✓ | ✓ | ✓ | +| `media.parts.deepAnalysisVersion` | | | ✓ | ✓ | ✓ | +| `media.parts.duration` | | | ✓ | ✓ | ✓ | +| `media.parts.exists` | | | | | ✓ | +| `media.parts.file` | | | ✓ | ✓ | ✓ | +| `media.parts.hasThumbnail` | | | ✓ | ✓ | ✓ | +| `media.parts.id` | | | | | ✓ | +| `media.parts.key` | | | | | ✓ | +| `media.parts.requiredBandwidths` | | | | | ✓ | +| `media.parts.size` | | | ✓ | ✓ | ✓ | +| `media.parts.sizeHuman` | | | ✓ | ✓ | ✓ | +| `media.parts.syncItemId` | | | | | ✓ | +| `media.parts.syncState` | | | | | ✓ | +| `media.parts.audioStreams.albumGain` | | | | ✓ | ✓ | +| `media.parts.audioStreams.albumPeak` | | | | ✓ | ✓ | +| `media.parts.audioStreams.albumRange` | | | | ✓ | ✓ | +| `media.parts.audioStreams.audioChannelLayout` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitDepth` | | | | | ✓ | +| `media.parts.audioStreams.bitrate` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitrateMode` | | | | | ✓ | +| `media.parts.audioStreams.channels` | | | | ✓ | ✓ | +| `media.parts.audioStreams.codec` | | | | ✓ | ✓ | +| `media.parts.audioStreams.default` | | | | ✓ | ✓ | +| `media.parts.audioStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.audioStreams.duration` | | | | | ✓ | +| `media.parts.audioStreams.endRamp` | | | | ✓ | ✓ | +| `media.parts.audioStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.audioStreams.gain` | | | | ✓ | ✓ | +| `media.parts.audioStreams.id` | | | | | ✓ | +| `media.parts.audioStreams.index` | | | | | ✓ | +| `media.parts.audioStreams.key` | | | | | ✓ | +| `media.parts.audioStreams.language` | | | | | ✓ | +| `media.parts.audioStreams.languageCode` | | | | | ✓ | +| `media.parts.audioStreams.loudness` | | | | ✓ | ✓ | +| `media.parts.audioStreams.lra` | | | | ✓ | ✓ | +| `media.parts.audioStreams.peak` | | | | ✓ | ✓ | +| `media.parts.audioStreams.profile` | | | | | ✓ | +| `media.parts.audioStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.audioStreams.samplingRate` | | | | ✓ | ✓ | +| `media.parts.audioStreams.selected` | | | | | ✓ | +| `media.parts.audioStreams.startRamp` | | | | ✓ | ✓ | +| `media.parts.audioStreams.streamType` | | | | | ✓ | +| `media.parts.audioStreams.title` | | | | ✓ | ✓ | +| `media.parts.audioStreams.type` | | | | | ✓ | +| `media.parts.lyricStreams.codec` | | | | ✓ | ✓ | +| `media.parts.lyricStreams.default` | | | | ✓ | ✓ | +| `media.parts.lyricStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.lyricStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.lyricStreams.format` | | | | ✓ | ✓ | +| `media.parts.lyricStreams.id` | | | | | ✓ | +| `media.parts.lyricStreams.index` | | | | | ✓ | +| `media.parts.lyricStreams.key` | | | | | ✓ | +| `media.parts.lyricStreams.language` | | | | | ✓ | +| `media.parts.lyricStreams.languageCode` | | | | | ✓ | +| `media.parts.lyricStreams.minLines` | | | | ✓ | ✓ | +| `media.parts.lyricStreams.provider` | | | | ✓ | ✓ | +| `media.parts.lyricStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.lyricStreams.selected` | | | | | ✓ | +| `media.parts.lyricStreams.streamType` | | | | | ✓ | +| `media.parts.lyricStreams.timed` | | | | ✓ | ✓ | +| `media.parts.lyricStreams.title` | | | | ✓ | ✓ | +| `media.parts.lyricStreams.type` | | | | | ✓ | +
+ + +### Photo Albums + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `art` | | | | ✓ | ✓ | +| `composite` | | | | | ✓ | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | ✓ | ✓ | ✓ | ✓ | +| `key` | | | | ✓ | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `userRating` | | ✓ | ✓ | ✓ | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `photoalbums` | | ✓
Includes [Photo Albums](#photoalbum-photoalbum) Level 1 | ✓
Includes [Photo Albums](#photoalbum-photoalbum) Level 2 | ✓
Includes [Photo Albums](#photoalbum-photoalbum) Level 3 | ✓
Includes [Photo Albums](#photoalbum-photoalbum) Level 9 | +| `photos` | | ✓
Includes [Photos](#photoalbum-photo) Level 1 | ✓
Includes [Photos](#photoalbum-photo) Level 2 | ✓
Includes [Photos](#photoalbum-photo) Level 3 | ✓
Includes [Photos](#photoalbum-photo) Level 9 | +| `clips` | | ✓
Includes [Clips](#photoalbum-clip) Level 1 | ✓
Includes [Clips](#photoalbum-clip) Level 2 | ✓
Includes [Clips](#photoalbum-clip) Level 3 | ✓
Includes [Clips](#photoalbum-clip) Level 9 | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `photoalbums` | | ✓
Includes [Photo Albums](#photoalbum-photoalbum) Level 1 | ✓
Includes [Photo Albums](#photoalbum-photoalbum) Level 2 | ✓
Includes [Photo Albums](#photoalbum-photoalbum) Level 3 | ✓
Includes [Photo Albums](#photoalbum-photoalbum) Level 9 | +| `photos` | | ✓
Includes [Photos](#photoalbum-photo) Level 1 | ✓
Includes [Photos](#photoalbum-photo) Level 2 | ✓
Includes [Photos](#photoalbum-photo) Level 3 | ✓
Includes [Photos](#photoalbum-photo) Level 9 | +| `clips` | | ✓
Includes [Clips](#photoalbum-clip) Level 1 | ✓
Includes [Clips](#photoalbum-clip) Level 2 | ✓
Includes [Clips](#photoalbum-clip) Level 3 | ✓
Includes [Clips](#photoalbum-clip) Level 9 | +
+ + +### Photos + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `createdAtAccuracy` | | ✓ | ✓ | ✓ | ✓ | +| `createdAtTZOffset` | | ✓ | ✓ | ✓ | ✓ | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | ✓ | ✓ | ✓ | ✓ | +| `key` | | | | ✓ | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `originallyAvailableAt` | | ✓ | ✓ | ✓ | ✓ | +| `parentGuid` | | ✓ | ✓ | ✓ | ✓ | +| `parentIndex` | | ✓ | ✓ | ✓ | ✓ | +| `parentKey` | | | | ✓ | ✓ | +| `parentRatingKey` | | ✓ | ✓ | ✓ | ✓ | +| `parentThumb` | | | | ✓ | ✓ | +| `parentTitle` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `year` | | ✓ | ✓ | ✓ | ✓ | +| `fields.locked` | | | | | ✓ | +| `fields.name` | | | | | ✓ | +| `tag.id` | | | | | ✓ | +| `tag.tag` | | | ✓ | ✓ | ✓ | +| `tag.title` | | | ✓ | ✓ | ✓ | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `locations` | | ✓ | ✓ | ✓ | ✓ | +| `media.aperture` | | ✓ | ✓ | ✓ | ✓ | +| `media.aspectRatio` | | ✓ | ✓ | ✓ | ✓ | +| `media.container` | | ✓ | ✓ | ✓ | ✓ | +| `media.exposure` | | ✓ | ✓ | ✓ | ✓ | +| `media.height` | | ✓ | ✓ | ✓ | ✓ | +| `media.id` | | | | | ✓ | +| `media.iso` | | ✓ | ✓ | ✓ | ✓ | +| `media.lens` | | ✓ | ✓ | ✓ | ✓ | +| `media.make` | | ✓ | ✓ | ✓ | ✓ | +| `media.model` | | ✓ | ✓ | ✓ | ✓ | +| `media.width` | | ✓ | ✓ | ✓ | ✓ | +| `media.parts.accessible` | | | | | ✓ | +| `media.parts.container` | | | ✓ | ✓ | ✓ | +| `media.parts.exists` | | | | | ✓ | +| `media.parts.file` | | | ✓ | ✓ | ✓ | +| `media.parts.id` | | | | | ✓ | +| `media.parts.key` | | | | | ✓ | +| `media.parts.size` | | | ✓ | ✓ | ✓ | +| `media.parts.sizeHuman` | | | ✓ | ✓ | ✓ | +
+ + +### Clips + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `art` | | | | ✓ | ✓ | +| `artBlurHash` | | | | | ✓ | +| `artFile` | | | | | ✓ | +| `audienceRating` | | ✓ | ✓ | ✓ | ✓ | +| `audienceRatingImage` | | ✓ | ✓ | ✓ | ✓ | +| `chapterSource` | | | | ✓ | ✓ | +| `contentRating` | | ✓ | ✓ | ✓ | ✓ | +| `duration` | | ✓ | ✓ | ✓ | ✓ | +| `durationHuman` | | ✓ | ✓ | ✓ | ✓ | +| `grandparentArt` | | | | ✓ | ✓ | +| `grandparentGuid` | | ✓ | ✓ | ✓ | ✓ | +| `grandparentKey` | | | | ✓ | ✓ | +| `grandparentRatingKey` | | ✓ | ✓ | ✓ | ✓ | +| `grandparentTheme` | | | | ✓ | ✓ | +| `grandparentThumb` | | | | ✓ | ✓ | +| `grandparentTitle` | | ✓ | ✓ | ✓ | ✓ | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `hasIntroMarker` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | ✓ | ✓ | ✓ | ✓ | +| `key` | | | | ✓ | ✓ | +| `lastViewedAt` | | | | ✓ | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `originallyAvailableAt` | | ✓ | ✓ | ✓ | ✓ | +| `parentGuid` | | ✓ | ✓ | ✓ | ✓ | +| `parentIndex` | | ✓ | ✓ | ✓ | ✓ | +| `parentKey` | | | | ✓ | ✓ | +| `parentRatingKey` | | ✓ | ✓ | ✓ | ✓ | +| `parentThumb` | | | | ✓ | ✓ | +| `parentTitle` | | ✓ | ✓ | ✓ | ✓ | +| `rating` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `thumbBlurHash` | | | | | ✓ | +| `thumbFile` | | | | | ✓ | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `userRating` | | ✓ | ✓ | ✓ | ✓ | +| `viewCount` | | | | ✓ | ✓ | +| `viewOffset` | | | | | ✓ | +| `year` | | ✓ | ✓ | ✓ | ✓ | +| `chapters.end` | | | | ✓ | ✓ | +| `chapters.id` | | | | | ✓ | +| `chapters.index` | | | | ✓ | ✓ | +| `chapters.start` | | | | ✓ | ✓ | +| `chapters.tag` | | | | ✓ | ✓ | +| `chapters.thumb` | | | | ✓ | ✓ | +| `directors.id` | | | | | ✓ | +| `directors.tag` | | | ✓ | ✓ | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `guids.id` | | | ✓ | ✓ | ✓ | +| `markers.end` | | | ✓ | ✓ | ✓ | +| `markers.start` | | | ✓ | ✓ | ✓ | +| `markers.type` | | | ✓ | ✓ | ✓ | +| `writers.id` | | | | | ✓ | +| `writers.tag` | | | ✓ | ✓ | ✓ | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `locations` | | ✓ | ✓ | ✓ | ✓ | +| `media.aspectRatio` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioChannels` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioCodec` | | ✓ | ✓ | ✓ | ✓ | +| `media.audioProfile` | | ✓ | ✓ | ✓ | ✓ | +| `media.bitrate` | | ✓ | ✓ | ✓ | ✓ | +| `media.container` | | ✓ | ✓ | ✓ | ✓ | +| `media.duration` | | ✓ | ✓ | ✓ | ✓ | +| `media.has64bitOffsets` | | | | | ✓ | +| `media.hdr` | | ✓ | ✓ | ✓ | ✓ | +| `media.height` | | ✓ | ✓ | ✓ | ✓ | +| `media.id` | | | | | ✓ | +| `media.isOptimizedVersion` | | ✓ | ✓ | ✓ | ✓ | +| `media.optimizedForStreaming` | | | | | ✓ | +| `media.proxyType` | | | | | ✓ | +| `media.target` | | | | | ✓ | +| `media.title` | | | | | ✓ | +| `media.videoCodec` | | ✓ | ✓ | ✓ | ✓ | +| `media.videoFrameRate` | | ✓ | ✓ | ✓ | ✓ | +| `media.videoProfile` | | ✓ | ✓ | ✓ | ✓ | +| `media.videoResolution` | | ✓ | ✓ | ✓ | ✓ | +| `media.width` | | ✓ | ✓ | ✓ | ✓ | +| `media.parts.accessible` | | | | | ✓ | +| `media.parts.audioProfile` | | | ✓ | ✓ | ✓ | +| `media.parts.container` | | | ✓ | ✓ | ✓ | +| `media.parts.deepAnalysisVersion` | | | ✓ | ✓ | ✓ | +| `media.parts.duration` | | | ✓ | ✓ | ✓ | +| `media.parts.exists` | | | | | ✓ | +| `media.parts.file` | | | ✓ | ✓ | ✓ | +| `media.parts.has64bitOffsets` | | | | | ✓ | +| `media.parts.hasThumbnail` | | | | | ✓ | +| `media.parts.id` | | | | | ✓ | +| `media.parts.indexes` | | | ✓ | ✓ | ✓ | +| `media.parts.key` | | | | | ✓ | +| `media.parts.optimizedForStreaming` | | | ✓ | ✓ | ✓ | +| `media.parts.packetLength` | | | | | ✓ | +| `media.parts.requiredBandwidths` | | | | | ✓ | +| `media.parts.size` | | | ✓ | ✓ | ✓ | +| `media.parts.sizeHuman` | | | ✓ | ✓ | ✓ | +| `media.parts.syncItemId` | | | | | ✓ | +| `media.parts.syncState` | | | | | ✓ | +| `media.parts.videoProfile` | | | ✓ | ✓ | ✓ | +| `media.parts.audioStreams.audioChannelLayout` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitDepth` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitrate` | | | | ✓ | ✓ | +| `media.parts.audioStreams.bitrateMode` | | | | | ✓ | +| `media.parts.audioStreams.channels` | | | | ✓ | ✓ | +| `media.parts.audioStreams.codec` | | | | ✓ | ✓ | +| `media.parts.audioStreams.default` | | | | ✓ | ✓ | +| `media.parts.audioStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.audioStreams.duration` | | | | | ✓ | +| `media.parts.audioStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.audioStreams.id` | | | | | ✓ | +| `media.parts.audioStreams.index` | | | | | ✓ | +| `media.parts.audioStreams.key` | | | | | ✓ | +| `media.parts.audioStreams.language` | | | | ✓ | ✓ | +| `media.parts.audioStreams.languageCode` | | | | ✓ | ✓ | +| `media.parts.audioStreams.profile` | | | | ✓ | ✓ | +| `media.parts.audioStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.audioStreams.samplingRate` | | | | ✓ | ✓ | +| `media.parts.audioStreams.selected` | | | | | ✓ | +| `media.parts.audioStreams.streamIdentifier` | | | | | ✓ | +| `media.parts.audioStreams.streamType` | | | | | ✓ | +| `media.parts.audioStreams.title` | | | | ✓ | ✓ | +| `media.parts.audioStreams.type` | | | | | ✓ | +| `media.parts.subtitleStreams.codec` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.container` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.default` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.forced` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.format` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.headerCompression` | | | | | ✓ | +| `media.parts.subtitleStreams.id` | | | | | ✓ | +| `media.parts.subtitleStreams.index` | | | | | ✓ | +| `media.parts.subtitleStreams.key` | | | | | ✓ | +| `media.parts.subtitleStreams.language` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.languageCode` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.subtitleStreams.selected` | | | | | ✓ | +| `media.parts.subtitleStreams.streamType` | | | | | ✓ | +| `media.parts.subtitleStreams.title` | | | | ✓ | ✓ | +| `media.parts.subtitleStreams.transient` | | | | | ✓ | +| `media.parts.subtitleStreams.type` | | | | | ✓ | +| `media.parts.videoStreams.DOVIBLCompatID` | | | | | ✓ | +| `media.parts.videoStreams.DOVIBLPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVIELPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVILevel` | | | | | ✓ | +| `media.parts.videoStreams.DOVIPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVIProfile` | | | | | ✓ | +| `media.parts.videoStreams.DOVIRPUPresent` | | | | | ✓ | +| `media.parts.videoStreams.DOVIVersion` | | | | | ✓ | +| `media.parts.videoStreams.anamorphic` | | | | | ✓ | +| `media.parts.videoStreams.bitDepth` | | | | ✓ | ✓ | +| `media.parts.videoStreams.bitrate` | | | | ✓ | ✓ | +| `media.parts.videoStreams.cabac` | | | | | ✓ | +| `media.parts.videoStreams.chromaLocation` | | | | | ✓ | +| `media.parts.videoStreams.chromaSubsampling` | | | | | ✓ | +| `media.parts.videoStreams.codec` | | | | ✓ | ✓ | +| `media.parts.videoStreams.codecID` | | | | | ✓ | +| `media.parts.videoStreams.codedHeight` | | | | | ✓ | +| `media.parts.videoStreams.codedWidth` | | | | | ✓ | +| `media.parts.videoStreams.colorPrimaries` | | | | | ✓ | +| `media.parts.videoStreams.colorRange` | | | | | ✓ | +| `media.parts.videoStreams.colorSpace` | | | | ✓ | ✓ | +| `media.parts.videoStreams.colorTrc` | | | | | ✓ | +| `media.parts.videoStreams.default` | | | | ✓ | ✓ | +| `media.parts.videoStreams.displayTitle` | | | | ✓ | ✓ | +| `media.parts.videoStreams.duration` | | | | | ✓ | +| `media.parts.videoStreams.extendedDisplayTitle` | | | | ✓ | ✓ | +| `media.parts.videoStreams.frameRate` | | | | ✓ | ✓ | +| `media.parts.videoStreams.frameRateMode` | | | | | ✓ | +| `media.parts.videoStreams.hasScalingMatrix` | | | | | ✓ | +| `media.parts.videoStreams.hdr` | | | | ✓ | ✓ | +| `media.parts.videoStreams.height` | | | | ✓ | ✓ | +| `media.parts.videoStreams.id` | | | | | ✓ | +| `media.parts.videoStreams.index` | | | | | ✓ | +| `media.parts.videoStreams.key` | | | | | ✓ | +| `media.parts.videoStreams.language` | | | | ✓ | ✓ | +| `media.parts.videoStreams.languageCode` | | | | ✓ | ✓ | +| `media.parts.videoStreams.level` | | | | ✓ | ✓ | +| `media.parts.videoStreams.pixelAspectRatio` | | | | | ✓ | +| `media.parts.videoStreams.pixelFormat` | | | | | ✓ | +| `media.parts.videoStreams.profile` | | | | ✓ | ✓ | +| `media.parts.videoStreams.refFrames` | | | | ✓ | ✓ | +| `media.parts.videoStreams.requiredBandwidths` | | | | | ✓ | +| `media.parts.videoStreams.scanType` | | | | ✓ | ✓ | +| `media.parts.videoStreams.selected` | | | | | ✓ | +| `media.parts.videoStreams.streamIdentifier` | | | | | ✓ | +| `media.parts.videoStreams.streamType` | | | | | ✓ | +| `media.parts.videoStreams.title` | | | | ✓ | ✓ | +| `media.parts.videoStreams.type` | | | | | ✓ | +| `media.parts.videoStreams.width` | | | | ✓ | ✓ | +
+ + +### Collections + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `art` | | | | ✓ | ✓ | +| `artBlurHash` | | | | | ✓ | +| `artFile` | Refer to [Image Exports](#image-export) | | | | | +| `childCount` | | ✓ | ✓ | ✓ | ✓ | +| `collectionMode` | | ✓ | ✓ | ✓ | ✓ | +| `collectionSort` | | ✓ | ✓ | ✓ | ✓ | +| `contentRating` | | ✓ | ✓ | ✓ | ✓ | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `index` | | | | | ✓ | +| `key` | | | | ✓ | ✓ | +| `librarySectionID` | | | | | ✓ | +| `librarySectionKey` | | | | | ✓ | +| `librarySectionTitle` | | | | | ✓ | +| `maxYear` | | ✓ | ✓ | ✓ | ✓ | +| `minYear` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `subtype` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `thumb` | | | | ✓ | ✓ | +| `thumbBlurHash` | | | | | ✓ | +| `thumbFile` | Refer to [Image Exports](#image-export) | | | | | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `titleSort` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `fields.locked` | | | ✓ | ✓ | ✓ | +| `fields.name` | | | ✓ | ✓ | ✓ | +| `labels.id` | | | | | ✓ | +| `labels.tag` | | | ✓ | ✓ | ✓ | +| `items` | | ✓
Includes [Items](#collection-item) Level 1 | ✓
Includes [Items](#collection-item) Level 2 | ✓
Includes [Items](#collection-item) Level 3 | ✓
Includes [Items](#collection-item) Level 9 | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `items` | | ✓
Includes [Items](#collection-item) Level 1 | ✓
Includes [Items](#collection-item) Level 2 | ✓
Includes [Items](#collection-item) Level 3 | ✓
Includes [Items](#collection-item) Level 9 | +
+ +* **Note:** Collection `items` can be [Movies](#movie) or [Shows](#show) depending on the collection. + + +### Playlists + +
+Metadata Fields
+ +| Metadata Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `addedAt` | | ✓ | ✓ | ✓ | ✓ | +| `composite` | | | | ✓ | ✓ | +| `duration` | | ✓ | ✓ | ✓ | ✓ | +| `durationHuman` | | ✓ | ✓ | ✓ | ✓ | +| `guid` | | ✓ | ✓ | ✓ | ✓ | +| `key` | | | | ✓ | ✓ | +| `leafCount` | | | | | ✓ | +| `playlistType` | | ✓ | ✓ | ✓ | ✓ | +| `ratingKey` | | ✓ | ✓ | ✓ | ✓ | +| `smart` | | ✓ | ✓ | ✓ | ✓ | +| `summary` | | ✓ | ✓ | ✓ | ✓ | +| `title` | | ✓ | ✓ | ✓ | ✓ | +| `type` | | ✓ | ✓ | ✓ | ✓ | +| `updatedAt` | | | | ✓ | ✓ | +| `items` | | ✓
Includes [Items](#playlist-item) Level 1 | ✓
Includes [Items](#playlist-item) Level 2 | ✓
Includes [Items](#playlist-item) Level 3 | ✓
Includes [Items](#playlist-item) Level 9 | +
+ +
+Media Info Fields
+ +| Media Info Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| `items` | | ✓
Includes [Items](#playlist-item) Level 1 | ✓
Includes [Items](#playlist-item) Level 2 | ✓
Includes [Items](#playlist-item) Level 3 | ✓
Includes [Items](#playlist-item) Level 9 | +
+ +* **Note:** Playlist `items` can be [Movies](#movie), [Episodes](#episode), [Tracks](#track), or [Photos](#photo) depending on the playlist. diff --git a/docs/Frequently-Asked-Questions.md b/docs/Frequently-Asked-Questions.md new file mode 100644 index 00000000..dc5a2a08 --- /dev/null +++ b/docs/Frequently-Asked-Questions.md @@ -0,0 +1,686 @@ +**If you can't find a solution here, please ask on [Discord](https://discord.gg/tQcWEUp), [Reddit](https://www.reddit.com/r/Tautulli) or the [Plex Forums](https://forums.plex.tv/discussion/307821/tautulli-monitor-your-plex-media-server). Don't post questions on the GitHub issues tracker.** + +## General + +* [I am receiving some weird datatable warnings.](#general-q2) +* [I forgot my username and/or password!](#general-q3) +* [I can't reach the web interface!](#general-q4) +* [Tautulli is not updating, it just goes back to the homepage without updating.](#general-q5) +* [When I try to update Tautulli, it keeps telling me "Please commit your changes or stash them before you can merge."](#general-q6) +* [What does the warning "Unable to retrieve data" mean? Is this a problem?](#general-q7) +* [My libraries are duplicated! How do I remove them?](#general-q8) +* [How can I access Tautulli outside my home network?](#general-q9) +* [Why does Tautulli not work with my reverse proxy setup?](#general-q10) +* [I need to move/reinstall Tautulli. Can I keep my history and statistics?](#general-q11) +* [Help! I accidentally deleted a user/library! How can I add it back?](#general-q12) +* [Can I import my history from PlexWatch/Plexivity?](#general-q13) +* [Where can I find my Tautulli logs?](#general-q14) +* [Tautulli says "There was an error communicating with your Plex Server", and the logs say "Status code 401".](#general-q16) +* [I can't connect to my Plex server with "Use SSL" checked.](#general-q17) +* [My Tautulli database got corrupted: "DatabaseError: database disk image is malformed" or "sqlite3.OperationalError".](#general-q18) +* [Tautulli cannot read my Plex log file.](#general-q19) +* [Tautulli won't start due to a corrupted config file.](#general-q20) +* [What data is being collected using Google Analytics?](#general-q21) +* [I'm seeing an "Unable to connect to remote host because of a SSL error." message when trying to update.](#ssl-update) +* [Does Tautulli have to be installed on the same machine as my Plex Server?](#install-same-machine-plex) +* [Recently added items are not showing up on the homepage.](#recently-added-homepage) +* [My users list is not updating and I am seeing "Status code 404" in the logs.](#users-list-not-updating) +* [My media info table is not loading.](#media-info-table-not-loading) + +## Activity and History Logging + +* [What is the grey progress bar under the current activity?](#history-q2) +* [I can see the streams on the homepage, but nothing is being logged.](#history-q3) +* [Do I need to keep Tautulli running to record history?](#history-q4) +* [Can Tautulli import history from before it was installed?](#history-q5) +* [Watch history isn't showing up under "Recently Watched" on the homepage.](#history-q6) +* [After resuming a media item, it shows up as two plays in Tautulli.](#history-q7) +* [The logs keep telling me "Failed to write sessionKey XX ratingKey YY to the database. Will try again on the next pass."](#history-q8) +* [Can I see which items in my libraries are the *least watched*?](#history-q9) +* [My concurrent streams statistic is showing an insane number!](#history-q10) +* [I am seeing history entries with very long duration times.](#history-q11) +* [Why does the bandwidth show as higher than the quality?](#history-q12) +* [I moved media in Plex, now Tautulli is linking to the wrong item/showing up twice!](#move-media) +* [I'm seeing the same artist twice on the homepage!](#homepage-duplicate-artist) +* [Why are items showing up as 127.0.0.1 for the IP address?](#plex-relay) +* [Can I disable history logging for a specific user/library?](#disable-logging) + +## Live TV + +* [Why do I suddenly have a "Live TV" library?](#livetv-library) +* [Why don't I see the "Live TV" library?](#livetv-library-missing) +* [I played multiple shows on Live TV but Tautulli says I only watched one show the entire time.](#livetv-rollover) +* [How do I disable history logging for Live TV?](#livetv-disable-logging) +* [Can I view the history for an entire TV show I watched on Live TV similar to TV shows in my own library?](#livetv-show-history) +* [How do I hide Live TV on the Graphs page?](#livetv-hide-graphs) + +## Notifications + +* [I can't get Notifications working! Is there a magic trick?](#notifications-q1) +* [My tests say they are successful, but the notification isn't sent and there's nothing in the logs.](#notifications-q2) +* [Can I disable notifications for a specific user/library?](#notifications-q3) +* [Can I disable recently added notifications for TV Shows/Movies?](#notifications-q4) +* [All my recently added notifications are showing `S00E01`.](#notifications-q5) +* [Why are posters not showing up in my notifications?](#notifications-q7) +* [How do I set up Imgur for notification posters?](#imgur) +* [Facebook notifications are telling me "Insufficient permission to post to target on behalf of the viewer".](#notifications-q9) +* [Facebook notifications are telling me "Some of the aliases you requested do not exist".](#notifications-q10) +* [I'm seeing a "The PyCryptodome library is missing." message!](#notifications-pycryptodome) +* [Notifications are sending the wrong text/sending the default text.](#notifications-text-ignored) +* [How do I override the Python version in a script?](#notifications-override-python) +* [My recently added notifications are not sending and the logs say "Not notifying again".](#notifications-not-notifying-again) +* [My playback stop notifications are not working.](#stop-notifications) + +## Newsletters + +* [I enabled a library but it's not showing in the newsletter!](#newsletter-recently-added-library) +* [Gmail is giving me a "Message clipped" message!](#message-clipped) +* [How do I edit the date format?](#newsletter-date-format) +* [Images are not showing up in my newsletter emails.](#newsletter-missing-images) +* [I want to customize the newsletter.](#newsletter-custom-template) + +## Windows + +* [I enabled HTTPS but received a warning that the pyOpenSSL module is missing. How do I fix this?](#windows-q1) +* [Tautulli keeps telling me "You're running an unknown version of Tautulli."](#windows-q2) +* [When trying to update, the logs say "Invalid update data, update failed."](#windows-q3) +* [I am getting a "DatabaseError: file is encrypted or is not a database"!](#windows-q4) +* [How can I run Tautulli without the command prompt staying open?](#windows-q5) +* [The command prompt just flashes open then closes immediately when starting Tautulli.](#windows-q6) + +## OSX + +* [When trying to update, the logs say "Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo."](#osx-q1) +* [I'm getting a `ValueError: unknown locale: UTF-8` message](#osx-unknown-locale) +* [How do I get rid of the Python rocket icon in my dock?](#osx-python-dock) + +## QNAP + +* [How do I set the Plex Logs Folder on QNAP?](#qnap-q1) + +--- + +### General + +#### Q: I am receiving some weird datatable warnings. +**A:** Most datatable warnings can be solved by doing a force refresh in your browser (CTRL+F5 or OPTION+Reload on Mac/Safari). If that doesn't work, try clearing your browser's cache. + +#### Q: I forgot my username and/or password! +**A:** Follow these steps to get back in: +1. **Shut down** Tautulli so your changes will apply. +2. Open the Tautulli `config.ini` file with your preferred text editor. +3. Search for `http_username` and `http_password` and the values after the equal signs are the username and password. You can also delete both lines from the file to disable authentication. + +_Note: If your password is encrypted in the config file, you will have to delete the entire line to disable authentication and reset your password in the Tautulli settings._ + +#### Q: I can't reach the web interface! +**A:** Shut down Tautulli and open the Tautulli `config.ini` file with your preferred text editor, search for the lines that begin with `http_host`, `http_port`, and `http_root` and remove the entire line. You should also remove the line for `enable_https` from the file. After you have removed these lines from `config.ini`, go ahead and start Tautulli. It will listen on the default IP address and port (`http://localhost:8181`). + +#### Q: Tautulli is not updating, it just goes back to the homepage without updating. +**A:** When you try you Tautulli and you get the message "A newer version (vX.Y.ZZ) is available", but updating doesn't actually update Tautulli there are two ways you can solve the problem, depending on how you installed Tautulli. + +##### Git based installation + +If you installed Tautulli by cloning the `git` repository, it's possible your local `git` repository has gotten out of sync in a manner that Tautulli can't automatically update from. + +If you are running Tautulli v2.2.0 or newer you can have Tautulli attempt to fix this itself by going to Settings -> General -> [Show Advanced] -> Repair Git Install -> Reset. This will attempt to automatically run the commands described below for you, cleaning up some common issues. + +If you are running an older version of Tautulli, or the above didn't work, you will need to manually fix this. First **Shutdown Tautulli**, then run the following commands from the command line/shell in the Tautulli folder. +```sh +git remote set-url origin https://github.com/Tautulli/Tautulli.git +git fetch origin +git checkout master +git branch -u origin/master +git reset --hard origin/master +git pull +``` + +If you are running Tautulli as a dedicated user as is recommended in the [Daemon instructions](Install-as-a-daemon), it's likely the permissions on files will need to be fixed after running the above commands: +```sh +sudo chown -R tautulli:tautulli /path/to/Tautulli +``` + +##### ZIP install + +If you instead installed Tautulli by simply downloading the current release archive, the steps are simpler: +1. Download the [current release](https://github.com/Tautulli/Tautulli/zipball/master) +2. Shut down Tautulli +3. Extract the current release to the same location where you previously extracted it + * Note: You should be _replacing_ the existing files, if you are prompted about this please select to replace the files! +4. If needed, ensure the permissions are correct + * For example: `sudo chown -R tautulli:tautulli /path/to/Tautulli` +5. Start Tautulli + +#### Q: When I try to update Tautulli, it keeps telling me "Please commit your changes or stash them before you can merge." +**A:** See the answer to the previous question. + +#### Q: What does the warning "Unable to retrieve data" mean? Is this a problem? +**A:** No, not necessarily. It means that you requested data that is not available, for example when you view the profile of a user who hasn't watched anything yet or view synced items when there is nothing synced. + +#### Q: My libraries are duplicated! How do I remove them? +**A:** This usually happens when you try to reinstall or switch your Plex Media Server. You can visit the following URL to remove all libraries not associated with the current Plex server connected to Tautulli. + +``` +http://localhost:8181/delete_duplicate_libraries +``` + +If the libraries are duplicated on the homepage, toggle the Library Statistic cards under Settings > Homepage and click Save. + +#### Q: How can I access Tautulli outside my home network? +**A:** **WARNING:** Before you follow any of these methods make sure you have enabled authentication in Tautulli under Settings -> Web Interface by setting a HTTP Username and Password. If you load Tautulli in an Incognito window you should get a login prompt! + +The easy and least secure method is to forward an external port (`8181`) on your router to the internal port used by Tautulli (default is TCP `8181`). Visit [Port Forward](http://portforward.com/) for instructions for your particular router. You will then be able to access Tautulli via `http://EXTERNAL-IP-ADDRESS:8181`. + +The more advanced and most preferred method (and more secure if you use SSL) is to set up a web server with NGINX/Apache, and use a reverse proxy to access Tautulli. You can lookup many guides on the internet to find out how to do this. + +The most secure method, but also the most inconvenient, is to set up a VPN tunnel to your home server, then you can access Tautulli as if it is on a local network via `http://LOCAL-IP-ADDRESS:8181`. + +#### Q: Why does Tautulli not work with my reverse proxy setup? +**A:** Tautulli uses CherryPy as it's web server, and it includes support for reverse proxies. You must ensure that your proxy web server (e.g. NGINX or Apache) is sending the standard `X-` headers to CherryPy. For **NGINX**, the configuration would look like this: + +```nginx +# Standard proxying headers +proxy_set_header Host $host; +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header X-Forwarded-Host $server_name; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +``` + +If you have SSL enabled on your webserver (e.g. `Internet --> https://nginx --> http://tautulli`), make sure HTTP Proxy is checked under Settings > Show Advanced button > Web Interface. Then ensure that your proxy web server is also including these two SSL specific `X-` headers: + +```nginx +# SSL proxying headers +proxy_set_header X-Forwarded-Proto $scheme; +proxy_set_header X-Forwarded-Ssl on; +``` + +As an alternative, the following configuration will automatically work for both HTTP and HTTPS. +```nginx +location /tautulli/ { + proxy_pass http://127.0.0.1:8181; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Host $server_name; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_read_timeout 90; + proxy_set_header X-Forwarded-Proto $scheme; + set $xforwardedssl "off"; + if ($scheme = https) { + set $xforwardedssl "on"; + } + proxy_set_header X-Forwarded-Ssl $xforwardedssl; + proxy_redirect ~^(http(?:s)?://)([^:/]+)(?::\d+)?(/.*)?$ $1$2:$server_port$3; +} +``` + +Don't forget to clear your web browser's cache *every* time you update your web server configuration. + +#### Q: I need to move/reinstall Tautulli. Can I keep my history and statistics? +**A:** Yes, all you need to do is download a copy your `tautulli.db` database file and `config.ini` configuration file by clicking on the "Database File" and "Configuration File" links on the Settings > Help & Info page. Then after reinstalling and completing the setup wizard, go to the Settings > Import & Backup page to import the old `tautulli.db` database and `config.ini` configuration files. This will work between any OS. + +**WARNING**: If you are re-installing Plex as well please follow [their guide to Move an Install to Another System](https://support.plex.tv/articles/201370363-move-an-install-to-another-system/). If you are starting from scratch again with Plex, or forgot to do this step, then you **MUST** run the script from [this FAQ entry](#move-media), or your Tautulli database will link to the wrong items! + +#### Q: Help! I accidentally deleted a user/library! How can I add it back? +**A:** If you have deleted a user or library in Tautulli and would like to bring them back the best method is to immediately restore a backup as the related history for these are removed when they are deleted. If you no longer have a backup containing the history, or don't want to bother with recovering it, you can simply tell Tautulli to allow them back in by "undeleting" them with the following instructions. + +##### Undeleting a user +If you are trying to undelete a user first you will need to find their `user_id`. You can get this by following the "More XML Shortcuts" instructions [here](Debugging#more-xml-shortcuts) for "All Users". + +You will see a list of items, find the entry that corresponds to the user you want to undelete, the `user_id` is in the `id="12345"` part. So for example in this entry the `user_id` would be `8367478`: +```xml + + + +``` + +Once you have the ID you need to go to `/undelete_user?user_id=` on your Tautulli instance. For example for the above ID on a Tautulli instance on the same machine you would go to: +``` +http://localhost:8181/undelete_user?user_id=8367478 +``` + +If you are unable to find the `user_id`, you may try using the username (`/undelete_user?username=`) or their email address (`/undelete_user?username=`), but these are less accurate and may not work. Example usage of these for a Tautulli instance running on the same computer would be: +``` +http://localhost:8181/undelete_user?username=exampleuser +http://localhost:8181/undelete_user?username=example@domain.com +``` + +##### Undeleting a library + +If you are trying to undelete a library you will need to find the `section_id`. You can get this by following the "More XML Shortcuts" instructions [here](Debugging#more-xml-shortcuts) for "All Libraries". + +You will see a list of items, find the entry that corresponds to the library you want to undelete, the `section_id` is in the `key="2"` part. So for example in this entry the `section_id` would be `3`: +```xml + + + +``` + +Once you have the section ID you need to go to `/undelete_library?section_id=` on your Tautulli instance. For example for the above ID on a Tautulli instance on the same machine you would go to: +``` +http://localhost:8181/undelete_library?section_id=3 +``` + +If you are unable to find the `section_id`, you may try using the library name (`/undelete_library?section_name=`), but this is less accurate and may not work. Example usage for a Tautulli instance running on the same computer would be: +``` +http://localhost:8181/undelete_library?section_name=Anime +``` + +#### Q: Can I import my history from PlexWatch/Plexivity? +**A:** You can import your PlexWatch/Plexivity history into Tautulli by going to Settings > Import & Backups. + +#### Q: Where can I find my Tautulli logs? +**A:** You can view the Tautulli logs from the web interface by clicking on "View Logs" in the settings menu. Clicking on the "Download logs" button on this page will allow you to save a copy of the log file. The location of the log file is also listed on the Settings > Help & Info page. + +If Tautulli is unable to start, then the log file is located in the following locations: +* Git or zip based installation: `/logs/tautulli.log` +* Windows exe installation: `%LOCALAPPDATA%\Tautulli\logs\tautulli.log` +* macOS pkg installations: `~/Library/Application Support/Tautulli/logs/tautulli.log` + +When reporting an issue, please provide a link to this log file by pasting it on [Gist](http://gist.github.com), *do not* upload the file as an attachment. + +#### Q: Tautulli says "There was an error communicating with your Plex Server", and the logs say "Status code 401". +**A:** Go into the Tautulli Settings > Plex Media Server and fetch a new Plex.tv token. + +#### Q: Tautulli can't connect to my Plex server locally with "Use SSL" checked. +**A:** First check that you can access your server locally with SSL. Open your Tautulli settings, go to the Plex Media Server section and copy the "Plex Server URL" URL into a new browser tab to attempt to load your server's interface directly. + +If you cannot load the Plex Web interface, then you may have a DNS rebinding issue for `*.plex.direct` addresses. Try changing your system to use a public DNS server, such as [Cloudflare DNS](https://developers.cloudflare.com/1.1.1.1/setting-up-1.1.1.1/) or [Google Public DNS](https://developers.google.com/speed/public-dns/docs/using). If you are using a custom DNS server such as on a pfSense firewall, see the "DNS Rebinding" section of this Plex support article on [How to use Secure Server Connections](https://support.plex.tv/articles/206225077-how-to-use-secure-server-connections/). + +Otherwise, you may have to set secure connections to "Preferred" in your Plex server settings and uncheck the "Use SSL" box in the Tautulli settings. Tautulli will then connect to your Plex server directly without SSL using the address `http://LOCAL-IP-ADDRESS:32400`. + +#### Q: My Tautulli database got corrupted: "DatabaseError: database disk image is malformed" or "sqlite3.OperationalError". +**A:** There are two ways to fix Tautulli when you get this message: +##### The Easy Way + +The easiest way to fix this is to just restore an older version of the database from the backup directory. To do this: + +1. Shutdown Tautulli if it is running. +2. Move or rename the current `tautulli.db`. +3. Copy the latest `backups/tautulli.backup-YYYYMMDDHHMMSS.sched.db` file to the main folder as `tautulli.db`. +4. Start Tautulli back up. + +##### The Long Way + +If restoring a backup won't work for you, or you want to retain as much history from your current database as possible, then the other alternative is to attempt to repair the database that you currently have. If you are using Windows or Mac OS, then you can try the steps below. Alternatively, you can try using the [SQLite command line instructions here](http://froebe.net/blog/2015/05/27/error-sqlite-database-is-malformed-solved/). + +1. Backup your Tautulli database (`tautulli.db`) by making a copy and saving it somewhere safe. +2. Open your database with [DB Browser for SQLite](http://sqlitebrowser.org/). +3. Go to "Tools > Integrity Check", then click "OK" to run `PRAGMA pragma integrity_check;` ([screenshot](./images/pragma_integrity_check.png)). If it does not say "ok" then you need to repair your database. +4. Go to "File > Export > Database to SQL file..." +5. Make sure the box that says "Multiple rows (VALUES) per INSERT statement" is checked ([screenshot](./images/multiple_rows_per_insert.png)). +6. Click "OK" and save the `.sql` file on your computer. +7. Go to "File > Close Database". +8. Go to "File > Import > Database from SQL file..." +9. Select the `.sql` file you saved from step 4, and save the new file as `tautulli.db`. Do not overwrite your original file! + * If you run into an error during the above step see the note below! +10. Save the changes to the database when prompted +10. _(Optional)_ Go to the "Execute SQL" tab and run `pragma integrity_check;` and it should say "ok". +11. Go to "File > Close Database". +12. Replace your Tautulli database (`tautulli.db`) file with this new one. + +_Note:_ +If you run into issues during step 9 above when building a new database from your exported SQL file the first thing to try would be a minimal export that _only_ saves your history and settings. To do this: +1. Follow the steps above, however during step 5 instead of selecting all tables you will want to change that to only export the following tables: + * mobile_devices + * newsletters + * notifiers + * session_history + * session_history_media_info + * session_history_metadata + +2. Continue running through the steps above. If you run into issues again with the minimal table list it's still possible to recover data, but the process is very involved so we ask that you contact [support in Discord](https://tautulli.com/discord) in order to proceed. + +#### Q: Tautulli cannot read my Plex log file. +**A:** Tautulli does not require your Plex logs to function. You can add your Plex logs folder to Tautulli in order to use it as a convenient log viewer. If you are installing Tautulli in a Docker container or jail, then you will need to mount/share the Plex log folder into the Tautulli container. You must also specify the full path to the Plex logs folder (shortcuts will not work). + +#### Q: Tautulli won't start due to a corrupted config file +**A:** Your `config.ini` file is corrupted. Either delete the file (you will have to reconfigure your Tautulli settings) or try restoring a config file from the backups folder. + +#### Q: What data is being collected using Google Analytics? +**A:** Only basic data is being collected, and it is not user identifiable. Here is a sample of the data being collected: + +``` +Data Source: server +App Name: Tautulli +App Version: v2.0.22 +Install Method: git +Git Branch: master +Platform: Windows 10 +Language: en-US +Encoding: UTF-8 +Country: Canada # Collected by Google Analytics by default +City: Vancouver # Collected by Google Analytics by default +``` + +If you would like to opt-out of data collection, you can set `system_analytics = 0` in the `config.ini` file. Tautulli must be shut down when editing the file. + + +#### Q: I'm seeing an "Unable to connect to remote host because of a SSL error." message when trying to update. +**A:** This is being caused by a combination of several different things. The initial cause is that GitHub has [disabled weak cryptographic standards](https://githubengineering.com/crypto-deprecation-notice/), preventing clients using these standards from accessing their site. This has caused many different aspects of older systems to run into issues when working on updates. + +If you are on macOS, first try updating to at least 10.13.4. + +The solution to most of these problems is to simply ensure you are on the latest v3 release of [Python](https://www.python.org/downloads/). If that doesn't work for you, the next thing to try is installing the latest version of [`pyOpenSSL`](https://pypi.python.org/pypi/pyOpenSSL), instructions for Windows can be found [here](#windows-q1). That should allow Tautulli to talk to GitHub again and check for updates. + +If you are on a `git` based installation and `git` itself runs into problems when trying to download the updates, you should make sure you are on the current version of `git` for your platform. + +If after performing all of the above steps have not solved your issue please join the `#support` channel of our [Discord server](https://discord.gg/tQcWEUp) as there can be _many_ platform specific issues related to this. + +#### Q: Does Tautulli have to be installed on the same machine as my Plex Server? +**A:** No, Tautulli can be installed anywhere as long as it has network access to the Plex server whether that be on a local network or even a remote network. + +#### Q: Recently added items are not showing up on the homepage. +**A:** The recently added section on the homepage is pulled directly from your Plex dashboard. The [Edit Library > Advanced > Include in dashboard](https://i.imgur.com/wiyT30F.png) setting must be enabled for the libraries on your Plex server. + +#### Q: My users list is not updating and I am seeing "Status code 404" in the logs. +**A:** Your Plex Server Identifier in the Tautulli settings is mismatched with your Plex server. Please verify your server in the settings and make sure the identifier matches with the one shown by visiting `http://SERVER-IP:32400/identity`. + +#### Q: My media info table is not loading. +**A:** Clear the media info table cache by going to the following URL, where `XX` is the ID number for the library. + +``` +http://localhost:8181/delete_media_info_cache?section_id=XX +``` + +--- + +### Activity and History Logging + +#### Q: What is the grey progress bar under the current activity? +**A:** The yellow progress bar is the current stream progress, and the grey bar is the current transcoder progress (not the available buffer on the client device). + +#### Q: I can see the streams on the homepage, but nothing is being logged. +**A:** History is only logged if all those following conditions are satisfied: + +* After the stream is stopped. +* If the total stream duration is longer than the "Ignore interval" you set (Settings > General > Show Advanced). +* If "Keep History" for the user is enabled (Users > Edit Mode > Toggle Keep History). +* If "Keep History" for the library is enabled (Libraries > Edit Mode > Toggle History). + +If you have satisfied all the above requirements, but nothing is still being logged, then the sessions might be stuck inside the database. Go to Settings > General > Show Advanced button at the top > Flush Temporary Sessions > Flush to flush the database, and history logging should be working again. + +_Note:_ If you are experiencing errors in the log, such as the [`DatabaseError: database disk image is malformed`](#general-q18) error, you should fix those first _before_ attempting to flush sessions above. + +#### Q: Do I need to keep Tautulli running to record history? +**A:** Yes. Tautulli cannot "see" your Plex activity if it isn't running, or retroactively import old history. + +#### Q: Can Tautulli import history from before it was installed? +**A:** No, unless you had PlexWatch or Plexivity installed previously and import the database, Tautulli can only start logging history after it is installed. + +Although Plex _does_ keep some information in their database, it is nowhere near detailed enough to build the level of history that Tautulli keeps, the above tools keep enough information to build partial records from. + +#### Q: Watch history isn't showing up under "Recently Watched" on the homepage. +**A:** "Recently Watched" only shows history that is considered as "watched" (exceed the watched percent that you specify in the settings). + +#### Q: After resuming a media item, it shows up as two plays in Tautulli. +**A:** Re-Enable "Group Successive Play History" in Settings > General > Show Advanced button. + +#### Q: The logs keep telling me "Failed to write sessionKey XX ratingKey YY to the database. Will try again on the next pass." +**A:** Tautulli can't find your library item `YY`. You can double check if that item exists by using Tautulli and going to + +``` +http://localhost:8181/info?rating_key=YY +``` + +If the item can't be found then you can flush the temporary sessions database in Settings > General > Show Advanced button at the top > Flush Temporary Sessions > Flush. + +#### Q: Can I see which items in my libraries are the *least watched*? +**A:** You can find out which items have not been watched by viewing the Media Info table for the library. + +#### Q: My concurrent streams statistic is showing an insane number! +**A:** You can try fixing your database by following the steps below: + +1. Create a backup of your Tautulli database (`tautulli.db`) by going to Settings > Import & Backups > Backup Database +2. Shutdown Tautulli. +3. Open your database with [DB Browser for SQLite](http://sqlitebrowser.org/). +4. Go to the "Execute SQL" tab and run the following SQL: + + DELETE FROM session_history WHERE id NOT IN (SELECT id FROM session_history_metadata); + DELETE FROM session_history_media_info WHERE id NOT IN (SELECT id FROM session_history_metadata); + +5. Go to "File > Write Changes" and "File > Close Database". +6. Restart Tautulli. + +#### Q: I am seeing history entries with very long duration times. +**A:** There's a websocket bug in the recent PMS versions where streams don't send a "stop" event. Once you restart Tautulli, a stop event is triggered, and the duration is calculated from when the stream started to when Tautulli was restarted. + +The only solution at the moment is to manually delete those history entries from the History tab. + +#### Q: Why does the bandwidth show as higher than the quality? +**A:** The bandwidth shown at the bottom of an activity item is Plex's Streaming Brain _estimate_ of required bandwidth to stream the item. This is not necessarily the same as how much bandwidth will actually be _used_, but instead is the maximum required at the user's chosen bitrate. This can get quite a bit higher than the average bandwidth of the entire item due to the way that video compression works. You can read more detail on the subject and how Plex handles it in the _Bitrates and How They Matter_ section of [this support article](https://support.plex.tv/articles/227715247-server-settings-bandwidth-and-transcoding-limits/). + +#### Q: I moved media in Plex, now Tautulli is linking to the wrong item/showing up twice! +**A:** When you remove something from Plex and then later re-add it, including when you move it between libraries or recreate an entire library it can start showing up multiple times in Tautulli. This is because Tautulli bases it's history recording on the `ratingKey` provided by Plex, a unique identifier for each item in the library. When you recreate items Plex generates a new `ratingKey` for the new item... but Tautulli is still referencing the old `ratingKey` for the history it has recorded! + +_Okay, so how do I fix it?_ + +This depends on how many items in your history you need to update to their new `ratingKey`. If you've just moved a single movie, or re-added a TV show then the simplest method is to search Tautulli's history for the old item (either the movie, or an episode from the show). Once you've found the item, open up the `/info` page for it and hit the Fix Match button. This will bring up a screen allowing you to search your Plex library for where the item is currently. Once you find it's new location and tell Tautulli about it, it will update all history items to the new `ratingKey`. For TV shows it will update _all_ episodes, so you just need to fix one. + +If you instead recreated an entire library, you might find it easier to setup and use the [update_all_metadata.py](https://gist.github.com/JonnyWong16/f554f407832076919dc6864a78432db2) script, which will automate the above task for everything in your library. Note that you will likely need to manually fix some items using the above method after running this, it will print warnings about the items it was unable to match automatically. + +#### Q: I'm seeing the same artist twice on the homepage! +**A:** This is happening because the lists on the homepage display the _Track_ Artist, but uses the _Album_ Artist for grouping. Plex doesn't provide a linking between track artists and the "real" artist for Tautulli to follow to merge these entries. This means that if you have an artist individually in your library, _and_ they show up in an album of various artists, they will show twice if both are played. + +#### Q: Why are items showing up as 127.0.0.1 for the IP address? +**A:** If a user is unable to get a direct connection to your Plex server for whatever reason, Plex has a component called "Plex Relay" that will relay their traffic through Plex's servers, allowing them to still connect to your server. Unfortunately since they are not connecting directly, the "address" they are connecting from is the local (`127.0.0.1`) connection of the Plex Relay service. + +For more information on this, and several potential solutions to fixing the connection issues and enabling direct access to your server, please refer to the [Accessing a Server through Relay](https://support.plex.tv/articles/216766168-accessing-a-server-through-relay/) support article from Plex. + +#### Q: My playback stop notifications are not working. +**A:** By default Tautulli filters out playback stop notifications after the watched percentage is exceeded. This is to prevent double notifications (both watched and stopped) when a stream finishes. To disable this filtering, allowing all events to always go through, you need to enable the _Notifications & Newsletters -> Show Advanced -> Allow Playback Stop Notifications Exceeding Watched Percent_ setting. + +#### Q: Can I disable history logging for a specific user/library? +**A:** You can control which users/libraries will get logged by going to the Users or Libraries page, going into "Edit mode" and clicking on the "Toggle History" icon beside each user or library you want to enable or disable. + +--- + +### Live TV + +#### Q: Why do I suddenly have a "Live TV" library? +**A:** This "fake" library is used to collect all the Live TV history together. If you don't want to see this then you can go to the Libraries page, click on the "Edit Mode" button, delete the library, and it will not reappear again. If in the future you want to re-enable the library, then you will need to [undelete](#general-q12) the library (`section_id=999999`). Note that, just like any other library, deleting the Live TV library will prevent history from being recorded while it is deleted. + +#### Q: Why don't I see the "Live TV" library? +**A:** The "Live TV" library will only show up the first time you play Live TV in Plex. If you deleted the library, then see the previous answer to add it back. + +#### Q: I played multiple shows on Live TV but Tautulli says I only watched one show the entire time. +**A:** This depends on the client you were using to watch Live TV. Some Plex clients (e.g. Plex Web) will update your Plex Media Server's API when Live TV rolls over into the next show. In this case Tautulli will correctly split the history into separate shows. However, some Plex clients (e.g. Apple TV) do not update your Plex Media Server's API so there is no way for Tautulli to know the show changed. Once this is fixed by Plex, it will automatically work correctly in Tautulli. + +#### Q: How do I disable history logging for Live TV? +**A:** History logging can be disabled like any other library. Go to the Libraries page, click on the "Edit Mode" button, and click on the "Toggle History" icon for the libraries you wish to disable history logging. + +#### Q: Can I view the history for an entire TV show I watched on Live TV similar to TV shows in my own library? +**A:** No, this is currently not possible. You can only view history for a single episode at a time on the info pages. + +#### Q: How do I hide Live TV on the Graphs page? +**A:** Click on the graph legends to hide the series from the graphs. The graph series visibility is stored in your browser so this will need to be done for each browser that you use. + +--- + +### Notifications + +#### Q: I can't get Notifications working! Is there a magic trick? +**A:** To be honest: Yes. To be very honest: No. You probably forgot to enable any triggers for your notification agents. If they show with a gray bell in the list then they have no active triggers. Click on the gray bell icon next to the Notification Agent, go to the Triggers tab, and enable any desired triggers for that agent. After you checked at least one trigger and clicked on Save the bell turns satisfying orange-ish. + +#### Q: My tests say they are successful, but the notification isn't sent and there's nothing in the logs. +**A:** Sometimes the browser cache will cause problems with the test notifications. Do a force refresh on the settings page (CTRL+F5 or OPTION+Reload on Mac/Safari), then try sending a test notification again. + +#### Q: Can I disable notifications for a specific user/library? +**A:** You can control which users/libraries will send a notification by setting up a [[custom condition|Custom Notification Conditions]] in your notification agent settings. + +#### Q: Can I disable recently added notifications for TV Shows/Movies? +**A:** See previous answer. + +#### Q: All my recently added notifications are showing `S00E01`. +**A:** You probably have "Group notifications for recently added TV Shows or Music" checked in the notification settings. No Season/Episode or Album/Track metadata will be available with this setting enabled. + +#### Q: Why are posters not showing up in my notifications? +**A:** Posters are only available for notification agents which have the "[Include Poster Image](./images/include_poster_image.png)" or "[Include Rich Metadata Info](./images/include_rich_metadata_info.png)" options in the settings, with the exception of Email. If you are using any of those agents, make sure you have Imgur upload setup (see the next question), and the poster will automatically be included with notification. For Email, make sure you have "[Enable HTML Support](./images/enable_html_support.png)" checked in the Email settings, then you may use an HTML image tag to add the poster to body of your notification, for example: `` + +#### Q: How do I set up Imgur for notification posters? +**A:** First you must create an [Imgur account](https://imgur.com/register), then register a new application [here](https://api.imgur.com/oauth2/addclient). Enter an Application Name, Email, and Description, and select the option "OAuth 2 authorization without a callback URL". You will receive a new `client_id` for your application. Enter this value for the "Imgur Client ID" in the Tautulli settings. + +#### Q: Facebook notifications are telling me "Insufficient permission to post to target on behalf of the viewer". +**A:** When allowing Tautulli to access your Facebook account, you must select `Public` or `Friends` for the app visibility permissions. Selecting `Only Me` will not work. + +#### Q: Facebook notifications are telling me "Some of the aliases you requested do not exist". +**A:** Your Facebook Group ID is incorrect. If your group has a named URL, you'll need to find the ID number using a tool like [lookup-id.com](https://lookup-id.com). Your group will need to be open in order for that tool to work. You can change the group back to closed/secret once you have the group ID number. + +#### Q: I'm seeing a "The PyCryptodome library is missing." message! +**A:** The PyCryptodome library is required to encrypt notifications sent to your Remote Android App. Installation instructions can be found in [their documentation](http://pycryptodome.readthedocs.io/en/latest/src/installation.html#installation). + +#### Q: Notifications are sending the wrong text/sending the default text. +**A:** When Tautulli encounters custom notification text that it fails to parse, it will fall back to the default text so the notification can still be sent out. Generally this is due to using an invalid `{parameter}` in the text that doesn't exist in Tautulli, or doesn't exist for the specific media item. The error logs will tell you the exact reason your custom text failed to parse, allowing you to correct the mistake. + +For example: +``` +Tautulli NotificationHandler :: Unable to parse parameter u'foobar' in notification body. Using fallback. +``` + +#### Q: How do I override the Python version in a script? +**A:** There are two aspects you might want to change: + 1. The `PYTHONPATH` environment variable + * Tautulli will enhance the `PYTHONPATH` variable with the path of its own bundled libraries, allowing scripts to use any of the bundled libraries without the user needing to have installed them system wide. However, this means that the bundled versions take priority. If you want to disable this feature simply prepend `nopythonpath` to the script arguments. + + 1. The `python` interpreter used. + * Normally scripts ending in `.py` are executed with `python`. If you want to change this you can prepend the interpreter in front of the script arguments. Currently allowed overrides: `python2`, `python3`, `python`, `pythonw`, `php`, `ruby`, `perl`. + +Examples: + * If you wanted to run a Python 3 script, _without_ the `PYTHONPATH` changes from Tautulli you would set the arguments to `nopythonpath python3 the other arguments`. + + * If you wanted to run a Python 2 script with python2 instead of python and _use_ the bundled libraries from Tautulli, you would set the arguments to `python2 the other arguments`. + +#### Q: My recently added notifications are not sending and the logs say "Not notifying again". +**A:** Same as the FAQ answer [here](#move-media). + +--- + +### Newsletters + +#### Q: I enabled a library but it's not showing in the newsletter! +**A:** Newsletters use Plex's Recently Added list in order to generate the content for the Newsletter, as such if you have unchecked ["Include in dashboard"](./images/include_in_dashboard.png) in the libraries Advanced settings *in Plex*, then it won't show in the Newsletter. + +#### Q: Gmail is giving me a "Message clipped" message! +**A:** When an email message exceeds a certain size in Gmail it is automatically clipped, requiring you to click a "View entire message" link in order to see the full contents. In order to get the Newsletters to render properly in mail clients they have to be rather complex, leading to this check triggering. Unfortunately there is nothing that can be done about this as reducing the complexity leads to issues with mail clients breaking the rendering of the Newsletter. If you have enabled Self Hosted newsletters a link to view the full message is always the first thing in the message and should be visible no matter what. + +#### Q: How do I edit the date format? +**A:** Newsletters follow the date format specified under Settings -> General -> Date Format. + +#### Q: Images are not showing up in my newsletter emails. +**A:** The first thing to check is that your image hosting settings are correct. There should be **no** orange warning text under any of the related settings. + +If you have enabled self hosted newsletters, or are using self-hosted images, ensure that your Public Tautulli Domain setting under Web Interface is correct. + +If you are using Imgur as your image hosting you will likely run into API limits and some images may be missing. It is recommended to use Cloudinary if you are using an external image hosting service. + +If you have checked the above and images in the newsletter are working for some users but not others, we have found that some email clients are buggy and do not display the images in the newsletter. Tautulli doesn't support clients that exhibit these issues, if you are interested in supporting these clients please use the [Custom Template](#newsletter-custom-template) functionality. Known problematic clients are the default Mail.app on iOS and some Microsoft Outlook versions. + +#### Q: I want to customize the newsletter. +**A:** If you want to change something about how the Newsletters look, such as a custom logo, or changing the text, you need to create a folder containing your templates and point Tautulli at it. + +It's recommended to copy the current template to start off with. Download [recently_added.html](https://github.com/Tautulli/Tautulli/raw/master/data/interfaces/newsletters/recently_added.html) to a folder of your choice. You can then edit the `recently_added.html` file to match what you would like the newsletters to look like. The templating language in use here is [Mako](http://www.makotemplates.org/). + +_Note: Your folder can be located anywhere Tautulli has access to, but the file **must** be named `recently_added.html`._ + +After you have that set up, you need to tell Tautulli to use the new template. Do this by filling in the **full** path to the folder you created above in the Settings > Notifications & Newsletters > Show Advanced button > [Custom Newsletter Template Folder](./images/newsletter_custom_template_folder.png) option. + +You can view all the raw JSON data available to be used in the newsletter template by adding `&raw=true` to the newsletter preview URL. For example: + + http://localhost:8181/newsletter_preview?newsletter_id=1&raw=true + +--- + +### Windows + +#### Q: I enabled HTTPS but received a warning that the pyOpenSSL module is missing. How do I fix this? +**A:** The pyOpenSSL module is not bundled with Python. Run the following in the command line to install it. + +``` +python -m pip install pyopenssl +``` + +If that doesn't work: + +1. Download the latest version of pyOpenSSL [here](https://pypi.python.org/pypi/pyOpenSSL#downloads) (the source `.tar.gz` file) and save it to `C:\`. +2. Run `python -m pip install C:\pyOpenSSL-17.5.0.tar.gz` + +If you have installed Python into a different directory or saved pyOpenSSL to somewhere else, you have to modify the above command in step 2 accordingly. + +#### Q: Tautulli keeps telling me "You're running an unknown version of Tautulli." +**A:** You most likely forgot the following step when installing Git for Windows. Run the Git installer again, making sure you include the step below. + +> Run the installer, select all the defaults except for the section called "Adjusting your PATH environment" - here select **"Git from the command line and also from 3rd-party software"**. + +_Note: If you are seeing this and aren't running Windows, it's likely you are hitting the [SSL error](#ssl-update) FAQ entry!_ + +#### Q: When trying to update, the logs say "Invalid update data, update failed." +**A:** Delete the `update` folder inside the Tautulli directory and try updating again. + +#### Q: I am getting a "DatabaseError: file is encrypted or is not a database"! +**A:** This seems to be a version mismatch with the packaged Python sqlite3 libraries. Download the latest "Precompiled Binaries for Windows" from [here](https://www.sqlite.org/download.html) and place the extracted `sqlite3.dll`s file in `C:\Python27\DLLs`. + +#### Q: How can I run Tautulli without the command prompt staying open? +**A:** Please refer to the instructions under the [Install as a daemon](Install-as-a-daemon#windows) wiki. + +#### Q: The command prompt just flashes open then closes immediately when starting Tautulli. +**A:** Start Tautulli manually from the command prompt to view the error. Open the Windows command prompt then running the following command. Fill in `C:\path\to\tautulli` to match the path where Tautulli is installed. + +```batch +& 'C:\Program Files\Python38\python.exe' "C:\path\to\tautulli\Tautulli.py" +``` + +Then refer to [this FAQ](#general-q1) above. + + +--- + +### OSX + +#### Q: When trying to update, the logs say "Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo." +**A:** Run the following command in the terminal (according to this [Stackoverflow answer](http://stackoverflow.com/a/26772631)): + +``` +sudo xcode-select --install +``` + +#### Q: I'm getting a `ValueError: unknown locale: UTF-8` message +**A:** If you are seeing this error when trying to start Tautulli the simple fix is to add these lines to your `~/.bash_profile` file: + +```sh +export LC_ALL=en_US.UTF-8 +export LANG=en_US.UTF-8 +``` + +To make this change active you can either restart Terminal, or run the following: +```sh +source ~/.bash_profile +``` + +#### Q: How do I get rid of the Python rocket icon in my dock? +**A:** Unfortunately, the Python dock icon is required when the menu bar icon is enabled and you are running Tautulli using Python directly. You can either disable the menu bar icon, or reinstall Tautulli using the macOS pkg instead (refer to this [[wiki page|Upgrading to Python 3 (Tautulli v2.5)#windows--macos]] for details). The pkg install will not show any dock icons regardless if the menu bar icon is enabled or disabled. + + +--- + +### QNAP + +#### Q: How do I set the Plex Logs Folder on QNAP? +**A:** When running a Plex Media Server on a QNAP, Plex writes logs into a non-shared location with the `/share/.qpkg` path. Tautulli cannot be pointed to this location and you need to create a symbolic link. + +1. SSH into your QNAP device. +2. Create a directory in a shared folder that will be accessible: + + ``` + mkdir /share/MD0_DATA/PATH/TO/VALID/SHARE/FOLDER/PlexLogs + ``` + +3. Create symbolic link between unshared log folder and new shared folder: + + ``` + ln -s "/share/MD0_DATA/.qpkg/PlexMediaServer/Library/Plex Media Server/Logs/" "/share/MD0_DATA/PATH/TO/VALID/SHARE/FOLDER/PlexLogs" + ``` + +4. Your new location is now usable in Settings > Plex Media Server > Show Advanced button > Logs Folder: + + ``` + \\\PATH\TO\VALID\SHARE\FOLDER\PlexLogs + ``` diff --git a/docs/Installation.md b/docs/Installation.md new file mode 100644 index 00000000..7020542b --- /dev/null +++ b/docs/Installation.md @@ -0,0 +1,319 @@ +### Operating Systems: + +* [Windows](#windows) +* [macOS](#macos) +* [Linux](#linux) +* [FreeBSD / FreeNAS](#freebsd--freenas) +* [Docker](#docker) +* [Synology](#synology) +* [Western Digital](#western-digital) (Third party) +* [QNAP](#qnap) (Third party) +* [ReadyNAS](#readynas) (Third party) +* [Thecus NAS](#thecus-nas) (Third party) +* [ArchLinux](#archlinux) (Third party) + +---- + +## Windows + +Download and run the latest Windows `.exe` installer from the [GitHub Releases page](https://github.com/Tautulli/Tautulli/releases/latest). + +
+Alternate installation instructions + +* Download the latest version of [Python](https://www.python.org/downloads/) and complete the installation with all the default options. + +* Option 1 (easy): + * Download Tautulli from GitHub: https://github.com/Tautulli/Tautulli/zipball/master + * Extract the ZIP file. + * Double click `start.bat` to run Tautulli. + * Tautulli will be loaded in your browser or listening on http://localhost:8181. + +* Option 2 (preferred): + > **NOTE**: This will install extra shell extensions and make adjustments to your path environment. + + * Go to https://gitforwindows.org/ and download `git`. + * Run the installer, select all the defaults except for the section called "Adjusting your PATH environment" - here select **"Git from the command line and also from 3rd-party software"**. + * Complete the rest of the installation with the default options. + * Right click on your desktop and select "Git Gui". + * Select "Clone Existing Repository". + * In the "Source Location" enter: `https://github.com/Tautulli/Tautulli.git` + * In the "Target Directory" enter a new folder where you want to install Tautulli to (e.g. `C:\Tautulli`). + * Click "Clone". + * When it's finished a Git Gui windows will appear, just close this Window. + * Browse to where you cloned the Tautulli repository (e.g. `C:\Tautulli`) in Windows Explorer. + * Double click `start.bat` to run Tautulli. + * Tautulli will be loaded in your browser or listening on http://localhost:8181. +
+ +## macOS + +Download and run the latest macOS `.pkg` installer from the [GitHub Releases page](https://github.com/Tautulli/Tautulli/releases/latest). + +* Note: The `.pkg` installer requires macOS 10.14 (Mojave) or newer. For macOS 10.13 (High Sierra) and older please use the alternate installation instructions below. + +
+Alternate installation instructions + +Tautulli will be installed to `/Applications/Tautulli` + +* Option 1 (easy): + * Download Tautulli from GitHub: https://github.com/Tautulli/Tautulli/zipball/master + * Extract the zip to `/Applications/Tautulli`. Make sure you extract the files directly in the root. + * Open a terminal + * Type: `cd /Applications/Tautulli` +* Option 2 (preferred): + * Open a terminal + * Install Git. This can be done via `xcode-select --install` + * Type: `cd /Applications/` + * Type: `git clone https://github.com/Tautulli/Tautulli.git` + * Type: `cd Tautulli` +* Type: `./start.sh` to run Tautulli. +* Tautulli will be loaded in your browser or listening on http://localhost:8181. +
+ +## Linux + +Tautulli can be installed on most Linux distribution using a Snap. + +1. Select your Linux distribution at the bottom of the [Tautulli Snapcraft page](https://snapcraft.io/tautulli) to install `snapd`. + * If your Linux distribution is not listed, additional instructions can be found [here](https://snapcraft.io/docs/installing-snapd). +1. Install Tautulli: `sudo snap install tautulli` +1. Tautulli will be loaded in your browser or listening on http://localhost:8181/ + +
+Alternate installation instructions + +Tautulli will be installed to `/opt/Tautulli`. + +1. Open a terminal. +1. Install prerequisites: + * Ubuntu/Debian: `sudo apt-get install git python3.7 python3-setuptools` + * Fedora: `sudo yum install git python3 python3-setuptools` +1. Change directory: `cd /opt` +1. Clone Tautulli: `sudo git clone https://github.com/Tautulli/Tautulli.git` +1. Add the Tautulli user: + * Ubuntu/Debian: `sudo addgroup tautulli && sudo adduser --system --no-create-home tautulli --ingroup tautulli` + * CentOS/Fedora: `sudo adduser --system --no-create-home tautulli` +1. Change ownership: `sudo chown -R tautulli:tautulli /opt/Tautulli` +1. Copy the service script: `sudo cp /opt/Tautulli/init-scripts/init.systemd /lib/systemd/system/tautulli.service` +1. Enable the service: `sudo systemctl daemon-reload && sudo systemctl enable tautulli.service` +1. Start Tautulli: `sudo systemctl start tautulli.service` +1. Tautulli will be loaded in your browser or listening on http://localhost:8181 + +#### Note: + +* Refer to the instructions in the service file to run Tautulli using a different user or move your Tautulli data to a different location: + * https://github.com/Tautulli/Tautulli/blob/master/init-scripts/init.systemd +
+ + +## FreeBSD / FreeNAS + +Tautulli will be installed to `/usr/local/share/Tautulli`. + +1. Create a new jail for Tautulli and open a terminal for the jail. +1. Install prerequisites: +`pkg install python py37-setuptools py37-sqlite3 py37-openssl py37-pycryptodomex security/ca_root_nss git-lite` +1. Change directory: `cd /usr/local/share` +1. Clone Tautulli: `git clone https://github.com/Tautulli/Tautulli.git` +1. Add the Tautulli user: `pw useradd -n tautulli -c "Tautulli" -s /sbin/nologin -w no` +1. Change ownership: `chown -R tautulli:tautulli Tautulli` +1. Copy the service script: `mkdir -p /usr/local/etc/rc.d && cp /usr/local/share/Tautulli/init-scripts/init.freenas /usr/local/etc/rc.d/tautulli` +1. Enable the service: `sysrc -f /etc/rc.conf tautulli_user="tautulli" && sysrc -f /etc/rc.conf tautulli_enable="YES"` +1. Start Tautulli: `service tautulli start` +1. Tautulli will be loaded in your browser or listening on http://localhost:8181 + +#### Note: + +* Refer to the instructions in the service file to run Tautulli using a different user or move your Tautulli data to a different location: + * https://github.com/Tautulli/Tautulli/blob/master/init-scripts/init.freebsd + + +## Docker + +### Using `docker run` + +Create and run the container (substitute your ``): +```sh +docker run -d \ + --name=tautulli \ + --restart=unless-stopped + -v :/config \ + -e PUID= \ + -e PGID= \ + -e TZ= \ + -p 8181:8181 \ + tautulli/tautulli +``` + +To update the container it must be removed and recreated: +```sh +# Stop the Tautulli container +docker stop tautulli +# Remove the Tautulli container +docker rm tautulli +# Pull the latest update +docker pull tautulli/tautulli +# Run the Tautulli container with the same parameters as before +docker run -d ... +``` + +### Using `docker-compose` + +Create a `docker-compose.yml` file with the following contents (substitute your ``): +```yml +version: '3' +services: + tautulli: + image: tautulli/tautulli + container_name: tautulli + restart: unless-stopped + volumes: + - :/config + environment: + - PUID= + - PGID= + - TZ= + ports: + - 8181:8181 +``` + +Create and start the container (run the command from the same folder as your `docker-compose.yml` file): +```sh +docker-compose up -d +``` + +To update the container: +```sh +# Pull the latest update +docker-compose pull +# Update and restart the container +docker-compose up -d +``` + +### Parameters + +You *must* substitute the `` with your own settings. + +Parameters are split into two halves separated by a colon. The left side represents the host and the right side the container. + +**Example**: `-p external:internal` - This shows the port mapping from internal to external of the container. +So `-p 8181:8181` would expose port `8181` from inside the container to be accessible from the host's IP on port `8181` (e.g. `http://:8181`). The internal port *must be* `8181`, but the external port may be changed (e.g. `-p 8080:8181`). + +| Parameter | Function | Required / Optional | +| :---: | --- | :---: | +| `-p 8181:8181` | Port for web UI | Required | +| `-v :/config` | Contains Tautulli config and database | Required | +| `-e PUID=` | User ID (see below) | Optional | +| `-e PGID=` | Group ID (see below) | Optional | +| `-e TZ=` | Lookup `TZ` value [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (e.g. America/Toronto) | Required | + +### User / Group Identifiers: + +When using data volumes (`-v` flags) permissions issues can arise between the host OS and the container. To avoid this issue you can specify the user `PUID` and group `PGID`. Ensure the data volume directory on the host is owned by the same user you specify. + +In this instance `PUID=1001` and `PGID=1001`. To find yours use `id user` as below: + +``` +$ id dockeruser +uid=1001(dockeruser) gid=1001(dockergroup) groups=1001(dockergroup) +``` + + +## Synology + +You can easily install *Tautulli* on Synology devices using [Docker](#docker). Depending on your Synology device you may or may not have Docker pre-installed. If your device is 'unsupported' (i.e. Docker is not pre-installed or downloadable through the Synology *Package Center*), follow the guide [here](https://web.archive.org/web/20190730155552/https://tylermade.net/2017/09/28/how-to-install-docker-on-an-unsupported-synology-nas/) and newer versions of the Docker spk found [here](https://archive.synology.com/download/Package/Docker) to install it. + +Once you have Docker on your Synology, add the [official image](https://hub.docker.com/r/tautulli/tautulli/) for Tautulli. This is done by opening the Docker program and searching the **Registry** tab for Tautulli. At the time of this write-up, the interface looked like [this](https://imgur.com/EqxJT91). The official image is named `tautulli/tautulli` and it may not be the first option listed. Double-click the image entry to download it. Once downloaded you will see the image show up under your **Image** tab. Before installing the image you will need some additional user information. + +Depending on your preference, you can create a unique user on your system for Tautulli, or you can use the default admin user created during your first start-up. You will need the UID and GID of whatever user you have chosen. The steps to obtain these are as follows: + +1. SSH into your system using [PuTTy](https://www.putty.org/) (if on Windows) or through Terminal (if on Linux or Mac). Be sure to use the appropriate username when logging in. + - If you're having trouble with this, make sure that [SSH is enabled](http://richardsumilang.com/server/synology/diskstation/enable-ssh-access-to-synology-diskstation/) in your *Terminal and SNMP* settings in your Synology *Control Panel*. +2. Type `id` +3. This will return a line with the `uid` of that user and their primary group `gid`. + ``` + [user@nas ~]$ id + uid=1001(user) gid=1001(user) groups=1001(user) + ``` + +Next, you will want to make sure that you have the prerequisite folders for Tautulli to save config files to. Here's an example general/simplified setup: + +``` +/root + └──/docker + └──/tautulli + └──/config +``` + +Obviously, the important folder here is `/root/docker/tautulli/config`. You should ensure that the permissions on this folder allows the user you picked earlier, and will set later, has _full_ rights to the folder. You can fix the permissions by right-clicking on your folders and going to `Properties` and then the `Permission` tab. Assign the appropriate user/group Full Control and if necessary Enable the option *Apply to this folder, sub-folders and files*. + +You may need to restart your DiskStation for the change to take effect. + +Next, back in the Docker window, double click your `tautulli/tautulli:latest` image to open the *Create Container* window. On the first menu, name your container whatever you want as long as it is identifiable to you. Next, click *Advanced Settings* to open a new window. Next, follow the instructions for the following tabs: + +- **Advanced Settings**: + - Enable *Enable auto-restart* + - If you wish, create a shortcut on the desktop +- **Volume**: + - Click *Add Folder* and add the following paths and corresponding Mount Paths. + +| File/Folder | Mount Path | +| :---- | :---- | +| `docker/tautulli/config` | `/config` | + +- **Port Settings**: + - Change the *Local Port* to `8181` to match the *Container Port*. For some reason the default vale of `Auto` almost never works. + - You may choose a different *Local Port* if port `8181` is already in use, but you cannot change the *Container Port*. + +| Local Port | Container Port | Type | +| :---- | :---- | :---- | +| `8181` | `8181` | `TCP` | + +- **Environment**: + - Add the following *variables* and their respective *value* + +| variable | value | +| :---- | :---- | +| `PUID` | `uid` from your ssh session, eg. `1001` | +| `PGID` | `gid` from your ssh session, eg. `1001` | +| `TZ` | Lookup `TZ` value [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (eg. `America/Los_Angeles`) | + +Finalize the container by applying the *advanced settings* and then following the remaining prompts. + +If your container doesn't immediately run, launch it from the Docker window and give it a few dozen seconds to start completely. Your *Tautulli* installation should now be accessible via port `8181` (or your other *Local Port*) on your DiskStation's local IP address. You can find this under Control Panel -> Network -> Network Interface under `LAN1` or `LAN2`. For example if it shows `192.168.0.5`, then Tautulli can be found at `http://192.168.0.5:8181/`. + +### How to update the container + +* See [here](https://mendesconsulting.net/2018/03/26/updating-docker-containers-on-synology/) for instructions on updating a Docker container on Synology. + +--- + +### The packages below are created and maintained by a third party. For support, please contact the creator. + +## Western Digital + +You can install Tautulli on Western Digital devices using the [WD package by Tfl](https://community.wd.com/t/package-tautulli-plexpy-adds-monitoring-analytics-and-notifications-for-your-plex-server/217773). + + +## QNAP + +You can install Tautulli on QNAP devices using the `.qpkg` by QNAP_Stephane: +* [QNAP Club](https://qnapclub.eu/en/qpkg/557) +* [QNAP forum thread](https://forum.qnap.com/viewtopic.php?f=320&t=139879) + + +## ReadyNAS + +You can install Tautulli on ReadyNAS devices using the [ReadyNAS app by Mhynlo](http://apps.readynas.com/pages/?page_id=9). + + +## Thecus NAS + +You can install Tautulli on Thecus devices using the [Thecus app by outkastm](https://forum.thecus.com/showthread.php?tid=12768&pid=70628#pid70628). + + +## ArchLinux + +You can install Tautulli on ArchLinux using the [AUR package by fryfrog/Sonic-Y3k](https://aur.archlinux.org/packages/tautulli/). diff --git a/docs/Notification-Agents-Guide.md b/docs/Notification-Agents-Guide.md new file mode 100644 index 00000000..974e2a1c --- /dev/null +++ b/docs/Notification-Agents-Guide.md @@ -0,0 +1,323 @@ +### Notification Agents: + +* [Boxcar](#boxcar) +* [Browser](#browser) +* [Discord](#discord) +* [Email](#email) +* [Facebook](#facebook) +* [GroupMe](#groupme) +* [Growl](#growl) +* [Hipchat](#hipchat) +* [IFTTT](#ifttt) +* [Join](#join) +* [Kodi](#xbmc) +* [macOS Notification Center](#osx) +* [MQTT](#mqtt) +* [Notify My Android](#nma) +* [Plex Home Theater](#plex) +* [Plex Android / iOS App](#plexmobileapp) +* [Prowl](#prowl) +* [Pushbullet](#pushbullet) +* [Pushover](#pushover) +* [Script](#scripts) +* [Slack](#slack) +* [Tautulli Remote Android App](#androidapp) +* [Telegram](#telegram) +* [Twitter](#twitter) +* [Webhook](#webhook) +* [Zapier](#zapier) + +--- + +### Browser + +1. Click on `Allow Notifications` and give permission for Tautulli to send notifications through your browser. + +--- + +### Boxcar + +1. Go to the Settings page in your Boxcar app. +1. Copy the **Access Token** and fill in the Tautulli setting. + +--- + +### Discord + +1. Go to Discord, and click on **Edit Channel** for the channel where you want the notifications to be sent. +1. Go to the **Webhooks** tab and click on **Create Webhook**. +1. Give your webhook bot a **Name** and **Icon**. This can be changed in the Tautulli settings instead if you wish. +1. Copy the **Webhook URL** and fill in the Tautulli setting. + +--- + +### Email + +* **Note:** Some anti-virus software have "Email protection" which may prevent sending emails via SMTP from a script. This will either need to be disabled or add an exception for Tautulli to send emails. + +#### Gmail + +* **Note:** If you use 2-factor authentication, then you will need to generate an app password [here](https://security.google.com/settings/security/apppasswords). +* **Note:** If you don't use 2-factor authentication, you may need to allow less secure apps to access your account. See Option 2 [here](https://support.google.com/accounts/answer/6010255?hl=en&ref_topic=2401957). + +``` +SMTP Server: smtp.gmail.com +SMTP Port: 587 or 465 +SMTP User: YourEmail@gmail.com or Username +SMTP Password: Your Gmail password or app password +Encryption: TLS/STARTTLS (587) or SSL/TLS (465) +``` + +#### Outlook.com + +* **Note:** If you use 2-factor authentication, then you will need to generate an app password [here](https://account.live.com/proofs/AppPassword). + +``` +SMTP Server: smtp.office365.com +SMTP Port: 587 +SMTP User: YourEmail@outlook.com +SMTP Password: Your Outlook password or app password +Encryption: TLS/STARTTLS (587) +``` + +--- + +### Facebook + +Facebook has blocked all non-approved applications from posting to a group programmatically. Although Tautulli shouldn't be against their terms, they are refusing to approve any app that can do this. + +There only currently known workaround is that Zapier also allows posting to Facebook, see [their agent guide](Notification-Agents-Guide#zapier) for how to set this up. See [here](https://i.imgur.com/rcWtoZk.png) for an example Facebook configuration within Zapier. + +
+Old, non-working instructions + +[This script](https://gist.github.com/spuniun/56624e1464c621c91e52f88e03321582) by [@spuniun](https://github.com/spuniun) could be used to post directly, however, Facebook has started banning accounts using it so it has been removed from the recommended methods. See the [Custom Scripts](Custom-Scripts) page for help setting it up. + +**Note:** Facebook has [redone their app approval process](https://developers.facebook.com/blog/post/2018/05/01/enhanced-developer-app-review-and-graph-api-3.0-now-live/), as such **all** apps _must_ go through the approval process fully before they will work again. To work around this you can send notifications via email to the group's secret email address from an account that is in the group. + +**Note:** As of March 2018, all new Facebook apps require HTTPS for authorization. If Tautulli is not running with HTTPS, the easiest method would be to check "Enable HTTPS" under the Web Interface tab (show advanced). This can be disabled after authorizing with Facebook. + +1. Go to [Facebook Developers](https://developers.facebook.com/apps) and click `Add a New App`. +1. Click Add Product on the left, then click `Set Up` for Facebook Login. +1. Skip the Quickstart and go to Facebook Login > Settings on the left, and fill in the **Valid OAuth redirect URIs** with the one provided by Tautulli. +1. Go to Settings > Basic on the left, and fill in a **Privacy Policy URL**. +1. On the same page, get your **App ID** and **App Secret** and fill in the respective Tautulli settings. +1. Go to App Review on the left, and toggle your app to toggle "Make Public" to `Yes`. +1. Click the `Request Authorization` button in Tautulli to allow it to access your Facebook account. Make sure the app visibility is set to `Public` or `Friends` (`Only Me` will not work). +1. Copy the **Access Token** and fill in the Tautulli setting if it is not filled in automatically. +1. Get your **Group ID** from the URL of your group page (e.g. `https://www.facebook.com/groups/`) and fill in the Tautulli setting. If you have customized the URL and no longer have easy access to the Group ID, see [this answer](https://stackoverflow.com/questions/8957340/how-do-i-find-my-facebook-group-id) for how to obtain it. _Note:_ You should _only_ put the ID in the setting for Tautulli, not the full URL. +
+ +--- + +### GroupMe + +1. Go to [GroupMe Developers](https://dev.groupme.com) and click **Access Token** at the top. Copy the token and fill in the Tautulli setting. +1. Go to the **Bots** tab at the top and click **Create Bot**. +1. Select the group chat where you want the notifications to be sent, give your bot a **Name** and **Avatar**, and click `Submit`. All other fields can be left at their default values. +1. Copy the **Bot ID** and fill in the Tautulli setting. + +--- + +### Growl + +1. Open Growl and go to the General tab to make sure Growl is turned `On` and running. +1. Optional: Go to the Security tab to set up a **Password**. Check "Allow network notifications" if Growl is running on a separate machine than Tautulli. +1. Fill in the **Host** for the machine running Growl (e.g. `localhost` or `192.168.0.100`) in the Tautulli settings. +1. Fill in the **Password**, if required, in the Tautulli settings. + +--- + +### Hipchat + +1. Go to [Hipchat Integrations](https://www.hipchat.com/addons/), select the room where you want the notifications to be sent, and click **Build your own integration**. +1. Give your integration a **Name** and click `Create`. +1. Copy the **Integration URL** and fill in the Tautulli setting. + +--- + +### IFTTT + +1. Go to IFTTT and set up your [Webhooks](https://ifttt.com/maker_webhooks) service. +1. Click on **Documentation** to get your **Webhook Key** and fill in the Tautulli setting. +1. Create a [New Applet](https://ifttt.com/create), with "this" as "Webhooks", and the trigger "Receive a web request". +1. Fill in the **Event Name** with the one that matches the Tautulli setting. + * **Tip:** You can create different IFTTT events (e.g. `tautulli_play`, `tautulli_stop`, `tautulli_created`, etc.) by adding `{action}` to the Event Name in Tautulli (e.g. `tautulli_{action}`). +1. Select "that" as whichever service you want. +1. Fill in the settings of your service by adding the ingredients `Value1`, `Value2`, and `Value3`. + * `Value1` will be the subject line in your notification text settings. + * `Value2` will be the body text in your notification text settings. + * (Optional) `Value3` can be anything you select (e.g. Poster URL). + +--- + +### Join + +1. Go to [Join App](https://joinjoaomgcd.appspot.com), and click on `Join API`, then `Show`. +1. Copy the **API Key** and fill in the Tautulli setting. + +--- + +### Kodi + +1. From within Kodi, go to Settings > Service settings > Control, and make sure "Allow remote control via HTTP" is checked. +1. Optional: Set the **Port**, **Username**, and **Password** for the Kodi Webserver. The default port is `8080`. +1. Enter in the **Host Address** for the machine running Kodi (e.g. `http://localhost:8080`) in the Tautulli settings. +1. Fill in the **Username** and **Password**, if required, in the Tautulli settings. + +--- + +### macOS Notification Center + +**Note:** macOS Notification Center notifications will only work on the machine where Tautulli is installed. + +1. Fill in the path to your Tautulli application. The default is `/Applications/Tautulli`. +1. Click the `Register App` button to register Tautulli with the Notification Center. + +--- + +### MQTT + +1. Fill in the settings from your MQTT broker. + +--- + +### Notify My Android + +1. Go to [Notify My Android](https://notifymyandroid.appspot.com/account.jsp) and click `Generate New Key`. +2. Copy the **API Key** and fill in the Tautulli setting. + +--- + +### Plex Home Theater + +**Note:** Plex Home Theater notifications only work with [OpenPHT](https://forums.plex.tv/discussion/264209/release-openpht-1-8-0/p1) or [RasPlex](https://forums.plex.tv/discussion/264208/release-rasplex-1-8-0/p1). + +1. From within OpenPHT/RasPlex, go to Preferences > System > Services, and make sure "Allow remote control via HTTP" is checked. +1. Enter in the **Host Address** for the machine running OpenPHT or RasPlex with the port `3005` (e.g. `http://localhost:3005`). +1. Fill in the **Username** and **Password**, if required, in the Tautulli settings. + +--- + +### Plex Android / iOS App + +**Note:** Plex Pass is required to send notifications to the Plex mobile apps. + +1. Open the Plex Android or iOS app, go to Settings > Notifications and enable the following notifications matching the triggers in the Tautulli notification agent: + 1. **New Content Added to Library** - Tautulli trigger: Recently Added + * Note: Make sure to *uncheck* all libraries for the server connected to Tautulli. + 1. **Playback Started** - Tautulli trigger: Playback Start + * Note: Make sure to *uncheck* the server and all users connected to Tautulli. + 1. **New Devices** - Tautulli trigger: User New Device + * Note: Make sure to *uncheck* the server connected to Tautulli. +1. Send a Test Notification from Tautulli and you should receive one test notification *for each notification* you have enabled in the Plex App. + +**Note:** The user(s) receiving the notifications must have notifications enabled for the matching Tautulli triggers in their Plex mobile app. + +**Note:** The user(s) must *uncheck* all the servers, libraries, and users connected to Tautulli in the Plex mobile app settings otherwise they may receive duplicate notifications from Plex and Tautulli. Use the [custom notification agent conditions](Custom-Notification-Conditions) in Tautulli to filter the notifications instead. + +**Note:** Push notifications do not need to be enabled in your Plex server Settings > General page. However, you may leave it enabled to receive the other notifications types from Plex (new server shared with you, new item on deck, database corruption detected, database backed up, etc.). + +--- + +### Prowl + +1. Go to [Prowl](https://www.prowlapp.com/api_settings.php), and generate a new API key by clicking `Generate Key`. +1. Copy the **API Key** and fill in the Tautulli Setting. + +--- + +### Pushbullet + +1. Go to [Pushbullet Account Settings](https://www.pushbullet.com/#settings/account), and click `Create Access Token`. +1. Copy the **Access Token** and fill in the Tautulli Setting. + +--- + +### Pushover + +1. Go to Pushover, and [Create a New Application](https://pushover.net/apps/build). +1. Give your application a **Name** and **Icon**, and click `Create Application`. +1. Copy the **API Token** and fill in the Tautulli Setting. +1. Go back to the [Pushover homepage](https://pushover.net). + * If you want to send notifications to yourself, copy your **User Key** and fill in the Tautulli setting. + * If you want to send notifications to a group, go to [Create a New Group](https://pushover.net/groups/build). Copy the **Group Key** and fill in the Tautulli setting. + +--- + +### Script + +* Please see the [[Custom Scripts Wiki Page|Custom Scripts]]. + +--- + +### Slack + +1. Go to Slack, and create a new [Incoming Webhook](https://my.slack.com/services/new/incoming-webhook). +1. Select the slack channel where you want the notifications to be sent, and click `Add Incoming Webhooks integration. +1. Copy your **Webhook URL** and fill in the Tautulli setting. +1. Scroll down to Integration Settings, and give your integration a **Name** and **Icon**. This can be changed in the Tautulli settings instead if you wish. + +--- + +### Tautulli Remote Android App + +* Please see the [Tautulli Remote Wiki](https://github.com/Tautulli/Tautulli-Remote/wiki/Registering-a-Tautulli-server) on how to register your [Tautulli Remote Android App](https://play.google.com/store/apps/details?id=com.tautulli.tautulli_remote). + +--- + +### Telegram + +1. Message [`@BotFather`](https://telegram.me/BotFather) on Telegram with the command `/newbot` to create a new bot. +1. Follow the instructions to give your bot a display name and a bot username. +1. Copy the **Bot Token** and fill in the Tautulli setting. + +**Sending Messages to Yourself** + +1. Create a new chat with your bot. +1. Message [`@IDBot`](https://telegram.me/myidbot) on Telegram with the command `/getid` to get your **Chat ID**. +1. Copy the **Chat ID** and fill in the Tautulli setting. + +**Sending Messages to a Group** + +1. Create a new group chat with your bot and [`@IDBot`](https://telegram.me/myidbot). +1. Message [`@IDBot`](https://telegram.me/myidbot) in the group with the command `/getgroupid` to get your **Group ID**. +1. Copy the **Group ID** and fill in the Tautulli setting. Don't forget the hyphen (`-`) in the Group ID. + +**Sending Messages to a Channel** + +1. Create a new Public Channel in Telegram. +1. Go to Manage Channel and add your bot to the Administrators. +1. Add a "Link" to your channel. This is your channel username (e.g. `t.me/`). +1. Copy the **Channel Username** and fill in the Tautulli setting. Don't forget the at sign (`@`) in the Channel Username. + +--- + +### Twitter + +1. Go to [Twitter Apps](https://apps.twitter.com) and click `Create New App`. +1. Give your app a **Name**, **Description**, and **Website**. A valid website is not required. +1. Go to the "Keys and Access Tokens" tab to get your **Consumer Key** and **Consumer Secret**, and fill in the respective Tautulli settings. +1. Click on `Create my access token` to get your **Access Token** and **Access Token Secret**, and fill in the respective Tautulli settings. + +--- + +### Webhook + +1. Find the **Webhook URL** for the service you are going to be using and fill in the Tautulli setting. Some examples: + * Discord: [Intro to Webhooks](https://support.discordapp.com/hc/en-us/articles/228383668-Intro-to-Webhooks) + * Slack: [Incoming Webhooks](https://api.slack.com/incoming-webhooks) +1. Pick the appropriate HTTP request method for your **Webhook Method**. Generally, you want to select `POST` here. +1. Customize the raw **JSON Data** sent to the webhook on the **Data** tab. + +--- + +### Zapier + +1. Go to Zapier and [`Make a Zap`](https://zapier.com/app/editor). +1. For "When this happens...", Choose App as "Webhooks by Zapier", and Choose Trigger as "Catch Hook", then click `Continue`. +1. Copy the **Custom Webhook URL** and fill in the Tautulli setting, then click `Continue` in Zapier. +1. Click `Test & Review` in Zapier, then click the `Send Test Data` button in Tautulli. A new hook will show up in Zapier with test data from Tautulli. Once everything is okay, click `Done Editing`. +1. For "Do this...", Choose App as whichever service you want, and follow the instructions to connect the service. +1. Set Up Template using the values `Body`, `Subject`, `Action`, `Provider Name`, `Provider Link`, `Plex URL`, and `Poster URL`. These values will all be filled in by Tatutulli. +1. Make sure your Zap is turned `on` in the top right. diff --git a/README.md b/docs/README.md similarity index 100% rename from README.md rename to docs/README.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 00000000..27cc42c7 --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,26 @@ +# Table of Contents + +- [Introduction](README.md) + +## Getting Started + +- [Installation](Installation.md) +- [Upgrading to Python 3](Upgrading-to-Python-3.md) + +## Using Tautulli + +- [Notifications Agents Guide](Notification-Agents-Guide.md) +- [Custom Notification Conditions](Custom-Notification-Conditions.md) +- [Exporter Guide](Exporter-Guide.md) +- [3rd Party APIs Guide](3rd-Party-APIs-Guide.md) + +## Support + +- [Asking for Support](Asking-for-Support.md) +- [Frequently Asked Questions (FAQ)](Frequently-Asked-Questions.md) +- [Debugging Tautulli](Debugging.md) + +## Extending Tautulli + +- [Custom Scripts](Custom-Scripts.md) +- [API Reference](API-Reference.md) diff --git a/docs/Upgrading-to-Python-3.md b/docs/Upgrading-to-Python-3.md new file mode 100644 index 00000000..e96e4028 --- /dev/null +++ b/docs/Upgrading-to-Python-3.md @@ -0,0 +1,114 @@ +### Operating Systems: + +* [Windows / macOS](#windows--macos) +* [Linux](#linux) +* [FreeBSD / FreeNAS](#freebsd--freenas) + +---- + +## Windows / macOS + +### Important changes + +Running Tautulli in the background on startup can be enabled by checking Tautulli Settings > Web Interface > Launch at System Startup. + * **Warning**: Make sure to remove any previous Tautulli shortcut from your startup folder or task in Windows Task Scheduler on Windows, or `.plist` files in your `LaunchAgents` folder on macOS, to prevent conflicts with the Tautulli setting! Refer to the deprecated instructions in the [[Install as a Daemon]] page. + +### Reinstalling Tautulli using the app installer (recommended) + +* Tautulli v2.5 and above can be installed on Windows or macOS (10.14 or newer) _without_ needing to install Python. You can download the new Windows `.exe` or macOS `.pkg` installer from the [GitHub Releases page](https://github.com/Tautulli/Tautulli/releases/latest). + +#### Instructions: + +1. Go to the Tautulli Settings > Help & Info page. +1. Click on the "Database File" link to download a copy of your Tautulli database. +1. Click on the "Configuration File" link to download a copy of your Tautulli configuration. +1. Shutdown Tautulli. +1. Install Tautulli using the Windows `.exe` or macOS `.pkg` installer. +1. Start Tautulli and complete the setup wizard. +1. Go to the Tautulli Settings > Import & Backup page and re-import the database file (using the "Overwrite" method) and configuration file that you saved in the steps above. +1. Once you have the database imported and Tautulli successfully configured, you may uninstall the previous version of Tautulli by deleting the old folder (Windows: `C:\Tautulli` or macOS: `/Applications/Tautulli`). + +#### Notes: + +* Python still needs to be installed if you are running Python script notifications. +* To update Tautulli using the app installer, just download and run the new installer when a new update is available. + + +## Linux + +### Reinstalling Tautulli using the Snap package (recommended) + +* Tautulli v2.6.3 and above can be installed on most Linux distributions using the Snap package _without_ needing to install Python. + +#### Instructions: + +1. Go to the Tautulli Settings > Help & Info page. +1. Click on the "Database File" link to download a copy of your Tautulli database. +1. Click on the "Configuration File" link to download a copy of your Tautulli configuration. +1. Shutdown Tautulli. +1. Install Tautulli using `snap` by following the [[Installation | Installation#linux]] instructions. +1. Start Tautulli and complete the setup wizard. +1. Go to the Tautulli Settings > Import & Backup page and re-import the database file (using the "Overwrite" method) and configuration file that you saved in the steps above. +1. Once you have the database imported and Tautulli successfully configured, you may uninstall the previous version of Tautulli by deleting the old folder (`/opt/Tautulli`) and the old service file (`/lib/systemd/system/tautulli.service`). + +#### Notes: + +* Python still needs to be installed if you are running Python script notifications. +* Snap packages update automatically outside of Tautulli. + +### Modifying an existing Tautulli install (alternative) + +* This will update an existing Tautulli systemd service script that is using Python 2 to Python 3. + +#### Instructions: + +1. Make sure Tautulli is shutdown or run `sudo systemctl stop tautulli.service`. +1. Get the path to your `python3` interpreter using `command -v python3`. + * Note: You may need to replace `python3` with the correct value for your system (e.g. `python3.7`). +1. Edit `/lib/systemd/system/tautulli.service`. +1. Add the path to your `python3` interpreter from step 1 to the start of the `ExecStart=` command (e.g. `/usr/bin/python3`). + * Example: + ``` + ExecStart=/usr/bin/python3 /opt/Tautulli/Tautulli.py --config /opt/Tautulli/config.ini --datadir /opt/Tautulli --quiet --daemon --nolaunch + ``` +1. Start Tautulli with `sudo systemctl daemon-reload && sudo systemctl start tautulli.service`. + +#### Notes: + +* If Tautulli will not start with the error `ImportError: bad magic number in 'pkg_resources'`, run the `clean_pyc.sh` file inside the Tautulli `contrib` folder. + ``` + cd /opt/Tautulli/contrib + ./clean_pyc.sh + ``` + + +## FreeBSD / FreeNAS + +### Modifying an existing Tautulli install + +* This will update an existing Tautulli service script that is using Python 2 to Python 3. + +#### Instructions: + +1. Make sure Tautulli is shutdown or run `service tautulli stop`. +1. Install all the prerequisites from the [[Installation | Installation#freebsd--freenas]] instructions. +1. Remove the old symbolic link to Python 2 with `rm /usr/local/bin/python`. +1. Create a new symbolic link to Python 3 with `ln -s /usr/local/bin/python3 /usr/local/bin/python`. +1. Check the python version with `python -V` and it should say Python 3.7.x. +1. Edit `/usr/local/etc/rc.d/tautulli`. +1. Add `command_interpreter="python"` above the `command` line (line 41). + * Example: + ``` + command_interpreter="python" + command="${tautulli_dir}/Tautulli.py" + command_args="--daemon --pidfile ${tautulli_pid} --quiet --nolaunch ${tautulli_flags}" + ``` +1. Start Tautulli with `service tautulli start`. + +#### Notes: + +* If Tautulli will not start with the error `ImportError: bad magic number in 'pkg_resources'`, run the `clean_pyc.sh` file inside the Tautulli `contrib` folder. + ``` + cd /usr/local/share/Tautulli/contrib + ./clean_pyc.sh + ``` \ No newline at end of file diff --git a/docs/images/click_run_on_right.png b/docs/images/click_run_on_right.png new file mode 100644 index 00000000..0b802f29 Binary files /dev/null and b/docs/images/click_run_on_right.png differ diff --git a/docs/images/create_task_actions.png b/docs/images/create_task_actions.png new file mode 100644 index 00000000..b3808915 Binary files /dev/null and b/docs/images/create_task_actions.png differ diff --git a/docs/images/create_task_general.png b/docs/images/create_task_general.png new file mode 100644 index 00000000..f84b9dc0 Binary files /dev/null and b/docs/images/create_task_general.png differ diff --git a/docs/images/create_task_settings.png b/docs/images/create_task_settings.png new file mode 100644 index 00000000..2fa99fce Binary files /dev/null and b/docs/images/create_task_settings.png differ diff --git a/docs/images/create_task_triggers.png b/docs/images/create_task_triggers.png new file mode 100644 index 00000000..466a7d22 Binary files /dev/null and b/docs/images/create_task_triggers.png differ diff --git a/docs/images/enable_html_support.png b/docs/images/enable_html_support.png new file mode 100644 index 00000000..99164361 Binary files /dev/null and b/docs/images/enable_html_support.png differ diff --git a/docs/images/excluding_specific_library.png b/docs/images/excluding_specific_library.png new file mode 100644 index 00000000..21a8ae5b Binary files /dev/null and b/docs/images/excluding_specific_library.png differ diff --git a/docs/images/excluding_specific_user.png b/docs/images/excluding_specific_user.png new file mode 100644 index 00000000..892252f6 Binary files /dev/null and b/docs/images/excluding_specific_user.png differ diff --git a/docs/images/exporter_custom_fields.png b/docs/images/exporter_custom_fields.png new file mode 100644 index 00000000..c74b66ae Binary files /dev/null and b/docs/images/exporter_custom_fields.png differ diff --git a/docs/images/exporter_images.png b/docs/images/exporter_images.png new file mode 100644 index 00000000..5d705aac Binary files /dev/null and b/docs/images/exporter_images.png differ diff --git a/docs/images/exporter_library_collections.png b/docs/images/exporter_library_collections.png new file mode 100644 index 00000000..fc05d251 Binary files /dev/null and b/docs/images/exporter_library_collections.png differ diff --git a/docs/images/exporter_library_export.png b/docs/images/exporter_library_export.png new file mode 100644 index 00000000..8b5872aa Binary files /dev/null and b/docs/images/exporter_library_export.png differ diff --git a/docs/images/exporter_library_playlists.png b/docs/images/exporter_library_playlists.png new file mode 100644 index 00000000..39cb612a Binary files /dev/null and b/docs/images/exporter_library_playlists.png differ diff --git a/docs/images/exporter_media_info.png b/docs/images/exporter_media_info.png new file mode 100644 index 00000000..9e4b2d1d Binary files /dev/null and b/docs/images/exporter_media_info.png differ diff --git a/docs/images/exporter_modal.png b/docs/images/exporter_modal.png new file mode 100644 index 00000000..fce36336 Binary files /dev/null and b/docs/images/exporter_modal.png differ diff --git a/docs/images/exporter_table.png b/docs/images/exporter_table.png new file mode 100644 index 00000000..c9d7db40 Binary files /dev/null and b/docs/images/exporter_table.png differ diff --git a/docs/images/exporter_user_playlists.png b/docs/images/exporter_user_playlists.png new file mode 100644 index 00000000..8156954e Binary files /dev/null and b/docs/images/exporter_user_playlists.png differ diff --git a/docs/images/high_privilege_container.png b/docs/images/high_privilege_container.png new file mode 100644 index 00000000..73d5e09c Binary files /dev/null and b/docs/images/high_privilege_container.png differ diff --git a/docs/images/include_in_dashboard.png b/docs/images/include_in_dashboard.png new file mode 100644 index 00000000..566df817 Binary files /dev/null and b/docs/images/include_in_dashboard.png differ diff --git a/docs/images/include_poster_image.png b/docs/images/include_poster_image.png new file mode 100644 index 00000000..8657436b Binary files /dev/null and b/docs/images/include_poster_image.png differ diff --git a/docs/images/include_rich_metadata_info.png b/docs/images/include_rich_metadata_info.png new file mode 100644 index 00000000..9684f1d6 Binary files /dev/null and b/docs/images/include_rich_metadata_info.png differ diff --git a/docs/images/list_of_active_tasks.png b/docs/images/list_of_active_tasks.png new file mode 100644 index 00000000..3515b265 Binary files /dev/null and b/docs/images/list_of_active_tasks.png differ diff --git a/docs/images/missing_art.png b/docs/images/missing_art.png new file mode 100644 index 00000000..c668e5b4 Binary files /dev/null and b/docs/images/missing_art.png differ diff --git a/docs/images/multiple_rows_per_insert.png b/docs/images/multiple_rows_per_insert.png new file mode 100644 index 00000000..77fbb13e Binary files /dev/null and b/docs/images/multiple_rows_per_insert.png differ diff --git a/docs/images/new_command_file.png b/docs/images/new_command_file.png new file mode 100644 index 00000000..cc898f0e Binary files /dev/null and b/docs/images/new_command_file.png differ diff --git a/docs/images/new_shortcut.png b/docs/images/new_shortcut.png new file mode 100644 index 00000000..6aa89650 Binary files /dev/null and b/docs/images/new_shortcut.png differ diff --git a/docs/images/newsletter_custom_template_folder.png b/docs/images/newsletter_custom_template_folder.png new file mode 100644 index 00000000..a88c5c4b Binary files /dev/null and b/docs/images/newsletter_custom_template_folder.png differ diff --git a/docs/images/plexpy_version.png b/docs/images/plexpy_version.png new file mode 100644 index 00000000..233c9abe Binary files /dev/null and b/docs/images/plexpy_version.png differ diff --git a/docs/images/pragma_integrity_check.png b/docs/images/pragma_integrity_check.png new file mode 100644 index 00000000..1fb9c925 Binary files /dev/null and b/docs/images/pragma_integrity_check.png differ diff --git a/docs/images/pythonw_background_process.png b/docs/images/pythonw_background_process.png new file mode 100644 index 00000000..d4382197 Binary files /dev/null and b/docs/images/pythonw_background_process.png differ diff --git a/docs/images/qr_code_setting.png b/docs/images/qr_code_setting.png new file mode 100644 index 00000000..5c7b681a Binary files /dev/null and b/docs/images/qr_code_setting.png differ diff --git a/docs/images/refresh_media_info.png b/docs/images/refresh_media_info.png new file mode 100644 index 00000000..f8498ae0 Binary files /dev/null and b/docs/images/refresh_media_info.png differ diff --git a/docs/images/status_is_ready.png b/docs/images/status_is_ready.png new file mode 100644 index 00000000..339a7a13 Binary files /dev/null and b/docs/images/status_is_ready.png differ diff --git a/docs/images/updated_settings_small.png b/docs/images/updated_settings_small.png new file mode 100644 index 00000000..2f26c5f6 Binary files /dev/null and b/docs/images/updated_settings_small.png differ