{"id":13551858,"url":"https://github.com/blacktwin/JBOPS","last_synced_at":"2025-04-03T02:31:59.844Z","repository":{"id":39351972,"uuid":"68158899","full_name":"blacktwin/JBOPS","owner":"blacktwin","description":"Just a Bunch Of Plex Scripts","archived":false,"fork":false,"pushed_at":"2025-03-28T16:42:00.000Z","size":1686,"stargazers_count":1765,"open_issues_count":38,"forks_count":314,"subscribers_count":62,"default_branch":"master","last_synced_at":"2025-03-31T22:13:42.962Z","etag":null,"topics":["hacktoberfest"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/blacktwin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-09-14T00:30:40.000Z","updated_at":"2025-03-28T16:42:04.000Z","dependencies_parsed_at":"2024-08-01T12:19:36.003Z","dependency_job_id":null,"html_url":"https://github.com/blacktwin/JBOPS","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blacktwin%2FJBOPS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blacktwin%2FJBOPS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blacktwin%2FJBOPS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blacktwin%2FJBOPS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blacktwin","download_url":"https://codeload.github.com/blacktwin/JBOPS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246925386,"owners_count":20855881,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest"],"created_at":"2024-08-01T12:01:54.609Z","updated_at":"2025-04-03T02:31:58.863Z","avatar_url":"https://github.com/blacktwin.png","language":"Python","readme":"\n# JBOPS - Just a Bunch Of Plex Scripts\n\n\nMost of these scripts utilize a combination of [Tautulli](https://github.com/Tautulli/Tautulli), [python-plexapi](https://github.com/pkkid/python-plexapi), and [requests](http://docs.python-requests.org/en/master/user/install/#install).\n\nFor use of config.ini for common variables please use [plexapi.CONFIG](http://python-plexapi.readthedocs.io/en/latest/configuration.html)\n\nDefault location `~/.config/plexapi/config.ini`\n```python\n# To find path\nimport plexapi\nprint(plexapi.CONFIG_PATH)\n```\n\n### Contact \n[![PM](https://img.shields.io/badge/Discord-Scripts-lightgrey.svg?colorB=7289da)](https://discord.gg/tQcWEUp) [![PM](https://img.shields.io/badge/Reddit-Message-lightgrey.svg)](https://www.reddit.com/user/Blacktwin/)  [![PM](https://img.shields.io/badge/Plex-Message-orange.svg)](https://forums.plex.tv/u/blacktwin) [![Issue](https://img.shields.io/badge/Submit-Issue-red.svg)](https://github.com/blacktwin/JBOPS/issues/new) \n\n### Donation\n\u003ca href=\"https://www.paypal.me/Adam581/1\" target=blank\u003e\u003cimg src=http://imgur.com/WSVZSTW.png alt=\"Buy Me a Coffee\" height=50 width=100 align='center'\u003e\n\u003c/a\u003e \u0026nbsp;\u0026nbsp; or \u0026nbsp;\u0026nbsp; \u003ca href=\"https://www.paypal.me/Adam581/3\" target=blank\u003e\u003cimg src=http://imgur.com/gnvlm6n.jpg alt=\"Buy Me a Beer\" height=50 width=100 align='center'\u003e\u003c/a\u003e\n \n\u003cdetails\u003e\n\u003csummary\u003eCoins?\u003c/summary\u003e\n   \u003cdetails\u003e\n    \u003csummary\u003eBTC:\u003c/summary\u003e\n     3FCb4F3bv1hHCJxq6HJMQiAMn883v3okdh\n    \u003c/details\u003e \n\t\n   \u003cdetails\u003e\n    \u003csummary\u003eBCH:\u003c/summary\u003e \n    qr758vkn7nv6hx0ur9m2tlv8q4qjrvg6pg3yw4kzwq \n   \u003c/details\u003e\n    \n   \u003cdetails\u003e\n    \u003csummary\u003eETH:\u003c/summary\u003e \n    0xa76c8EB9A4955023F0dAABfb32FCD2b460910F2b \n   \u003c/details\u003e\n    \n   \u003cdetails\u003e\n    \u003csummary\u003eLTC:\u003c/summary\u003e \n    MCw3r6rC8jNCcUvSMSu9EqQyyvEDp8EpEf \n   \u003c/details\u003e\n\u003c/details\u003e\n\n## Scripts List\n[![Gist](https://img.shields.io/badge/gist-Blacktwin-green.svg)](https://gist.github.com/blacktwin)   \n\nScripts pulled from my gist profile. \n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"https://github.com/blacktwin/JBOPS/tree/master/maps\"\u003eMaps\u003c/a\u003e\u003c/summary\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eExample\u003c/th\u003e\n    \u003cth\u003eFile\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/blacktwin/JBOPS/raw/master/maps/EU_map_example.PNG\"\u003e\u003cimg src=\"https://img.shields.io/badge/Image-EU_map-blue.svg\" alt=\"\"\u003c/a\u003e\n    \u003ca href=\"https://github.com/blacktwin/JBOPS/raw/master/maps/NA_map_example.PNG\"\u003e\u003cimg src=\"https://img.shields.io/badge/Image-NA_map-blue.svg\" alt=\"\"\u003c/a\u003e\n    \u003ca href=\"https://github.com/blacktwin/JBOPS/raw/master/maps/World_map_example.PNG\"\u003e\u003cimg src=\"https://img.shields.io/badge/Image-World_map-blue.svg\" alt=\"\"\u003c/a\u003e\n    \u003ca href=\"https://github.com/blacktwin/JBOPS/blob/master/maps/geojson_example.geojson\"\u003e\u003cimg src=\"https://img.shields.io/badge/Image-geojson-blue.svg\" alt=\"\"\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/maps/ips_to_maps.py\"ips_to_maps\u003eMaps\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eUsing Tautulli data, draw a map connecting Server to Clients based on IP addresses.\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"https://github.com/blacktwin/JBOPS/tree/master/fun\"\u003eFun\u003c/a\u003e\u003c/summary\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eGist\u003c/th\u003e\n    \u003cth\u003eFile\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/fun/playlist_manager.py\"\u003eplaylist_manager\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eCreate and share playlists based on Most Popular TV/Movies from Tautulli and Aired this day in history.\u003c/td\u003e\n  \u003c/tr\u003e\n    \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/4ccb79c7d01a95176b8e88bf4890cd2b\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/fun/plexapi_haiku.py\"\u003eplexapi_haiku\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eCreate a hiaku from titles found in Plex.\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"https://github.com/blacktwin/JBOPS/tree/master/killstream\"\u003eKill stream\u003c/a\u003e\n\u003c/summary\u003e\n\u003cb\u003e\nKilling streams is a Plex Pass feature. These scripts will only work for Plex Pass users.\n\u003c/b\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eGist\u003c/th\u003e\n    \u003cth\u003eFile\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/killstream/limiterr.py\"\u003elimiterr\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eLimiting Plex users by plays, watches, or total time from Tautulli..\n        See killsteam section \u003ca href=\"../master/killstream/limiterr_readme.md\"\u003elimiterr_readme.md\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/killstream/kill_stream.py\"\u003ekill_stream\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eUse Conditions, Arguements, and Parameters to kill a Plex stream.\n        See killsteam section \u003ca href=\"../master/killstream/readme.md\"\u003ereadme.md\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \n\u003c/table\u003e\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"https://github.com/blacktwin/JBOPS/tree/master/notify\"\u003eNotify\u003c/a\u003e\u003c/summary\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eGist\u003c/th\u003e\n    \u003cth\u003eFile\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n  \u003c/tr\u003e\n    \u003ctr\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/notify/notify_delay.py\"\u003enotify_delay\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eDelay Notification Agent message for concurrent streams.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/e6d589a9af9bdf168717951083861e93\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/notify/find_unwatched_notify.py\"\u003efind_unwatched_notify\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eFind what was added TFRAME ago and not watched and notify admin using Tautulli.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/1094dcf38249f36c8d374e0cba7a86cd\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/notify/notify_added_custom.py\"\u003enotify_added_custom\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eSend an email with what was added to Plex in the past week using Tautulli. Email includes title (TV: Show Name: Episode Name; Movie: Movie Title), time added, image, and summary.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/099c07d8099c18a378bba6415d9253ba\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/notify/notify_fav_tv_all_movie.py\"\u003enotify_fav_tv_all_movie\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eNotify users of recently added episode to show that they have watched at least LIMIT times via email. Also notify users of new movies.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/a2d4b2f2c3b616f1d6da0752fecb2ae7\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/notify/notify_newip.py\"\u003enotify_newip\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eIf a new IP is found send notification via the Email Notification Agent. Email contains User's Avatar image, link to location, IP address, and User's Email address.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/a327055da54d7feb3eef10e64a8b661a\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/notify/notify_on_added.py\"\u003enotify_on_added\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eSend an Email notification when a specific show is added to Plex. Add shows to list that you want notifications for.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/18960ff01c03b67a05594daa6f53660c\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/notify/notify_user_favorites.py\"\u003enotify_user_favorites\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eNotify users of recently added episode to show that they have watched at least LIMIT times via email.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/066c66328a795ebd6079a575e14f0b8b\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/notify/notify_user_newip.py\"\u003enotify_user_newip\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eNotify user that their account has been accessed by a new IP. IP is cleared to make sure notification is sent again.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/261c416dbed08291e6d12f6987d9bafa\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/notify/twitter_notify.py\"\u003etwitter_notify\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003ePost to Twitter when TV/Movie is added to Plex. Include custom message and embed poster image. Option to tweet to TWITTER_USER if title is inside TITLE_FIND.\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"https://github.com/blacktwin/JBOPS/tree/master/utility\"\u003eUtility\u003c/a\u003e\u003c/summary\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eGist\u003c/th\u003e\n    \u003cth\u003eFile\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/plex_api_parental_control.py\"\u003eplex_api_parental_control\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eSet as cron or task for times of allowing and not allowing user access to server. Unsharing will kill any current stream from user before unsharing.\u003c/td\u003e\n  \u003c/tr\u003e\n   \u003ctr\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/plex_api_share.py\"\u003eplex_api_share\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eShare or unshare libraries\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/f4149c296f2d1ffd1cbd863c37bb3a3c\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/bypass_auth_name.py\"\u003ebypass_auth_name\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eUse Tautulli to pull last IP address from user and add to List of IP addresses and networks that are allowed without auth in Plex.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/0332f2dc9534bdf412ff3f664e9513c0\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/delete_watched_TV.py\"\u003edelete_watched_TV\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eFrom a list of TV shows, check if users in a list has watched shows episodes. If all users in list have watched an episode of listed show, then delete episode.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/76b0abf88181618af4598092dd6b0dbb\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/find_plex_meta.py\"\u003efind_plex_meta\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eFind location of Plex metadata.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/603d5da5b70b366e98d0d82d1aa1a470\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/find_unwatched.py\"\u003efind_unwatched\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eFind what was added TFRAME ago and not watched using Tautulli.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/f435aa0ccd498b0840d2407d599bf31d\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/grab_gdrive_media.py\"\u003egrab_gdrive_media\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eGrab media (videos, pictures) from Google Drive. All videos and pictures were automatically synced from Google Photos to Google Drive. Puts media into MEDIA_TYPE/YEAR/MONTH-DAY/FILE.ext directory structure.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/85a63ffd70c6ccb7c1faa70a8f33fc2e\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/plex_api_poster_pull.py\"\u003eplex_api_poster_pull\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003ePull Movie and TV Show poster images from Plex.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/17b58156f69cc52026b71fe4d5afea05\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/plex_imgur_dl.py\"\u003eplex_imgur_dl\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003ePull poster images from Imgur and places them inside Shows root folder.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/f10e0a1e85af00e878963b4570a99054\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/plex_theme_songs.py\"\u003eplex_theme_songs\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eDownload theme songs from Plex TV Shows.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/45c420cbba4e18aadc8cc5090a67b9d1\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/plexapi_delete_playlists.py\"\u003eplexapi_delete_playlists\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eDelete all playlists from Plex using PlexAPI.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/3752a76fa0b3fc6d19e842af7b812184\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/refresh_next_episode.py\"\u003erefresh_next_episode\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eRefresh the next episode of show once current episode is watched.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/370ca42ee20a33fb00c8253fa9bd0de7\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/remove_watched_movies.py\"\u003eremove_watched_movies\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eFind Movies that have been watched by a list of users. If all users have watched movie then delete.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/2f619e62d99edcec27f680998379664c\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/utility/stream_limiter_ban_email.py\"\u003estream_limiter_ban_email\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eThis is indented to restrict a user to the LIMIT amount of concurrent streams. User will be warned, punished, and banned completely if violations continue.\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"https://github.com/blacktwin/JBOPS/tree/master/reporting\"\u003eReporting\u003c/a\u003e\u003c/summary\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eGist\u003c/th\u003e\n    \u003cth\u003eFile\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/reporting/weekly_stats_reporting.py\"\u003eweekly_stats_reporting\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003ePull library and user statistics of last week.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/21823b3394f5b077d42495b21570b593\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/reporting/added_to_plex.py\"\u003eadded_to_plex\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eFind when media was added between STARTFRAME and ENDFRAME to Plex through Tautulli.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/f070dff29ddbeb87973be9c0a94a1df7\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/reporting/check_play.py\"\u003echeck_play\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eCheck if user has play a file more than 3 times but has not finished watching. Hoping to catch play failures.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/1a8933252ad1a9bc2c97395a020c144a\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/reporting/check_plex_log.py\"\u003echeck_plex_log\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eChecking plex logs for debug code WARN and 'Failed to obtain a streaming resource for transcode of key /library/metadata/\"titleID\"'.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/561c3a404754eb7b9e543867619d3251\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/reporting/drive_check.py\"\u003edrive_check\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eCheck if drive exists. If not then notify via Tautulli notifier agent.    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://gist.github.com/blacktwin/bd905d39ab71c5d7c628e27fddd1086e\"\u003e\u003cimg src=\"https://img.shields.io/badge/gist-original-green.svg\"\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"../master/reporting/userplays_weekly_reporting.py\"\u003euserplays_weekly_reporting\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003eUse Tautulli to count how many plays per user occurred this week and send email via Tautulli.\u003c/td\u003e\n  \u003c/tr\u003e\n\n\u003c/table\u003e\n\u003c/details\u003e\n\n----\n### Setting Up Tautulli for Custom Scripts\n\u003cdetails\u003e\n\u003csummary\u003e\u003c/summary\u003e\n\n#### Enable API in Tautulli:\n\nTautulli \u003e Settings \u003e Web Interface \u003e API \u003e Enable API\n\n\n#### Enabling Scripts in Tautulli:\n\nTautulli \u003e Settings \u003e Notification Agents \u003e Add a Notification Agent \u003e Script\n\n#### Configuration\n\nTautulli \u003e Settings \u003e Notification Agents \u003e New Script \u003e Configuration:\n- [ ] Set scripts location to location of your script\n- [ ] Scroll down to option you want to use and select the script from the drop down menu\n- [ ] Set desired Script Timeout value\n- [ ] Optional - Add a description of the script for easy reference\n- [ ] Save\n      \n#### Triggers\nTautulli \u003e Settings \u003e Notification Agents \u003e New Script \u003e Triggers:\n\n- [ ] Check desired trigger\n- [ ] Save\n\n#### Conditions\nTautulli \u003e Settings \u003e Notification Agents \u003e New Script \u003e Conditions:\n\n- [ ] Set desired conditions\n- [ ] Save\n\nFor more information on Tautulli conditions see [here](https://github.com/Tautulli/Tautulli/wiki/Custom-Notification-Conditions)\n\n#### Script Arguments\nTautulli \u003e Settings \u003e Notification Agents \u003e New Script \u003e Script Arguments:\n\n- [ ] Select desired trigger\n- [ ] Input desired notification parameters (List of parameters will likely be found inside script)\n- [ ] Save\n- [ ] Close\n\n\n\u003c/details\u003e\n\n---\n### Common variables\n\n\u003cdetails\u003e\n\u003csummary\u003ePlex\u003c/summary\u003e\n\n- [ ]  PLEX_URL - Local/Remote IP to connect to Plex ('http://localhost:32400', 'https://x.x.x.x:32412', etc.)\n- [ ]  PLEX_TOKEN - [Plex](https://support.plex.tv/hc/en-us/articles/204059436-Finding-an-authentication-token-X-Plex-Token) or Tautulli Settings \u003e Plex.tv Account \u003e PMS Token\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eTautulli\u003c/summary\u003e\n\n- [ ]  TAUTULLI_URL - Local/Remote IP to connect to Tautulli ('http://localhost:8181',  'https://x.x.x.x:8182', etc.)\n- [ ]  TAUTULLI_APIKEY - Tautulli Settings \u003e Access Control \u003e Enable API - API Key\n\u003c/details\u003e\n","funding_links":["https://www.paypal.me/Adam581/1","https://www.paypal.me/Adam581/3"],"categories":["Python","Plex"],"sub_categories":["Plex Scripts and Tools"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblacktwin%2FJBOPS","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblacktwin%2FJBOPS","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblacktwin%2FJBOPS/lists"}