├── README.md ├── docker-compose ├── docker-compose-command.sh └── docker-compose.yml ├── iptv-livetv ├── documentaries.m3u ├── freetv-iptv-playlist-us.m3u ├── iptv-index.m3u ├── iptv-plutotv.m3u ├── iptv-us.m3u ├── online-radio-collection.m3u ├── test_channels_united_states.m3u ├── test_channels_united_states_new.m3u └── world-poker-tour.m3u ├── jellyfin-css └── jellyfin-10.8.x.css ├── misc ├── config.json ├── favicon.ico ├── favicon.png ├── index.html ├── login-disclaimer.txt └── manifest.json ├── nginx ├── html │ ├── 404.html │ └── maintenance.html ├── moz_ssl ├── nginx.conf ├── proxy_params └── website.conf ├── rclone-conf ├── rclone.conf-destination └── rclone.conf-source ├── rclone-filter ├── filter-file-novideo.txt ├── filter-file-video.txt ├── filter-file.txt └── filter-p0ds0smb.txt ├── screenshots ├── screenshot-home.html.jpg └── screenshot-login.html.jpg └── shell-scripts ├── ffmpeg ├── ffmpeg-inotify-transcode-acodec.sh ├── ffmpeg-output-acodec.sh └── ffmpeg-transcode-acodec.sh ├── gen-medialists.sh ├── jellyfin-backdrops-enable_10.9.x.sh ├── jellyfin-delete-transcodetmp.sh ├── jellyfin-healthcheck.sh ├── jellyfin-set-title_10.8.x.sh ├── jellyfin-set-title_10.9.x.sh ├── move-subs-up-one-dir.sh ├── rclone ├── rclone-flush-cache.sh ├── rclone-http-serve.sh └── rclone-sync.sh ├── subtitle-cleaner.sh └── testing ├── filename.sh ├── getopts.sh ├── getopts2.sh ├── pidof.sh ├── screen_check.sh └── shift.sh /README.md: -------------------------------------------------------------------------------- 1 | # jellyfin-stuff 2 | 3 | Author: 📧 [Travis Runyard](mailto:travisrunyard@gmail.com)
4 | Website: 🔗 [travisflix.com](https://travisflix.com)
5 | 6 | ## 📜 DESCRIPTION 7 | 8 | **jellyfin-stuff** is a collection of shell scripts, CSS and Nginx configuration files that helps to customize the Jellyfin front-end and accomplish any other tasks not covered by the official plugins (ie. changing the site title for versions [10.8.x](https://github.com/visualblind/jellyfin-stuff/blob/master/shell-scripts/jellyfin-set-title_10.8.sh) & [10.9.x](https://github.com/visualblind/jellyfin-stuff/blob/master/shell-scripts/jellyfin-set-title_10.9.sh)). 9 | 10 | 11 | Be aware scripts in this repo modify relevant Jellyfin front-end files (html, js, css, etc) directly as there is no other easy way to accomplish the objective without modifying source files and compiling the web interface, so use at your own risk ([force enabling backdrops on by default](https://github.com/visualblind/jellyfin-stuff/blob/master/shell-scripts/jellyfin-backdrops-enable.sh) which modifies main.jellyfin.bundle.js for example). I have done my best to add descriptive comments in the shell scripts explaining what is being done if it is not obvious. 12 | 13 | 14 | > 📌 **TIP:** If you run an NGINX reverse proxy in front of Jellyfin, you can do image caching on tmpfs (/dev/shm) to increase the image loading speed. You can find the relevant config in [website.conf](https://github.com/visualblind/jellyfin-stuff/blob/master/nginx/website.conf#L126) using the `proxy_cache` directives.

![nginx-image-cache-hit](https://i.ibb.co/R2HwVMW/nginx-image-cache-hit.png)

15 | 16 | -------------------------------------------------------------------------------- /docker-compose/docker-compose-command.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Just showing an example of using docker compose syntax 4 | 5 | docker compose -f ~/docker-compose/docker-compose2.yml up -d --no-recreate 6 | 7 | # Using the --no-recreate switch can be seen as a way to doing a sanity check or dry run as the container 8 | # needs to be removed manually or else it will not be re-created (happens on accident sometimes if not careful) 9 | 10 | -------------------------------------------------------------------------------- /docker-compose/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.3' 2 | services: 3 | jellyfin: 4 | container_name: jellyfin 5 | devices: 6 | - "/dev/dri:/dev/dri" 7 | environment: 8 | - JELLYFIN_PublishedServerUrl=travisflix.com 9 | - JELLYFIN_MEDIA_DIR=/media 10 | - JELLYFIN_DATA_DIR=/config 11 | - JELLYFIN_CACHE_DIR=/cache 12 | - JELLYFIN_CONFIG_DIR=/config/config 13 | - JELLYFIN_LOG_DIR=/config/log 14 | - JELLYFIN_WEB_DIR=/jellyfin/jellyfin-web 15 | - JELLYFIN_FFMPEG=/usr/lib/jellyfin-ffmpeg/ffmpeg 16 | - PUID=0 17 | - PGID=0 18 | image: jellyfin/jellyfin:latest 19 | network_mode: host 20 | restart: unless-stopped 21 | volumes: 22 | - "/usr/local/jellyfin/config:/config" 23 | - "/mnt/mergerfs/media:/media:ro" 24 | - "/usr/local/jellyfin/cache:/cache" 25 | - "/usr/local/jellyfin/jellyfin-web:/jellyfin/jellyfin-web/src" 26 | - "/usr/local/jellyfin/jellyfin-web/config.json:/jellyfin/jellyfin-web/config.json" 27 | - "/usr/local/jellyfin/jellyfin-web/session-login-index-html.384c1886b01202a35d87.chunk.js:/jellyfin/jellyfin-web/session-login-index-html.384c1886b01202a35d87.chunk.js" 28 | 29 | filebrowser: 30 | container_name: filebrowser 31 | environment: 32 | - TZ=America/Los_Angeles 33 | - FB_BASEURL=/ 34 | - FB_USERNAME=visualblind 35 | image: hurlenko/filebrowser 36 | #user: "${UID}:${GID}" 37 | volumes: 38 | - /usr/local/filebrowser/config:/config 39 | - /usr/local/filebrowser/data:/data 40 | - /usr/local/filebrowser/branding:/branding 41 | - /mnt/mergerfs/media:/data/media:ro 42 | - /mnt/mergerfs/media/video-movies:/data/video-movies:ro 43 | - /mnt/mergerfs/media/video-movies:/data/users/upload/video-movies:ro 44 | - /mnt/p0ds0smb/media/video-tech:/data/users/upload/video-tech:ro 45 | - /mnt/p1ds0smb/software_wintel:/data/users/upload/software_wintel:ro 46 | - /mnt/mergerfs/backup:/data/backup:ro 47 | ports: 48 | - 8080:8080 49 | networks: 50 | - linuxserver-nginx_default 51 | restart: unless-stopped 52 | 53 | openspeedtest: 54 | container_name: openspeedtest 55 | image: openspeedtest/latest:latest 56 | networks: 57 | - linuxserver-nginx_default 58 | ports: 59 | - "3000:3000" 60 | restart: unless-stopped 61 | 62 | portainer: 63 | container_name: portainer 64 | ports: 65 | - "9000:9000" 66 | volumes: 67 | - "/usr/local/portainer/data:/data" 68 | - "/var/run/docker.sock:/var/run/docker.sock" 69 | image: portainer/portainer 70 | networks: 71 | - linuxserver-nginx_default 72 | 73 | webgrabplus: 74 | image: lscr.io/linuxserver/webgrabplus:latest 75 | container_name: webgrabplus 76 | hostname: webgrabplus 77 | # mac_address: 00:00:00:00:00:00 78 | environment: 79 | - PUID=1000 80 | - PGID=1000 81 | - TZ=America/Los_Angeles 82 | volumes: 83 | - /usr/local/webgrabplus/config:/config 84 | - /usr/local/webgrabplus/data:/data 85 | restart: unless-stopped 86 | 87 | jellyseerr: 88 | image: fallenbagel/jellyseerr:latest 89 | container_name: jellyseerr 90 | environment: 91 | - LOG_LEVEL=debug 92 | - TZ=America/Los_Angeles 93 | ports: 94 | - 5055:5055 95 | volumes: 96 | - /usr/local/jellyseer/appdata/config:/app/config 97 | networks: 98 | - linuxserver-nginx_default 99 | restart: unless-stopped 100 | 101 | droppy: 102 | container_name: droppy 103 | image: silverwind/droppy 104 | ports: 105 | - '8989:8989' 106 | volumes: 107 | - /docker/droppy/config:/config 108 | - /docker/droppy/files:/files 109 | networks: 110 | - linuxserver-nginx_default 111 | restart: unless-stopped 112 | 113 | networks: 114 | linuxserver-nginx_default: 115 | external: true 116 | name: linuxserver-nginx_default 117 | -------------------------------------------------------------------------------- /iptv-livetv/freetv-iptv-playlist-us.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U 2 | #EXTINF:-1 tvg-name="CBS News" tvg-id="CBSNews.us" tvg-logo="https://i.ibb.co/C6NkXzt/CBS-NEWS-Logo-vintage-womens-relaxed-RO-1200x630.webp" group-title="News",CBS News 3 | https://cbsn-us.cbsnstream.cbsnews.com/out/v1/55a8648e8f134e82a470f83d562deeca/master.m3u8 4 | #EXTINF:-1 tvg-name="CBSN KCAL Los Angeles CA" tvg-id="CBSKCALNews.us" tvg-logo="https://i.ibb.co/ncHg0DG/cbs-kcal-losangeles.png" group-title="News",CBSN KCAL Los Angeles CA (720p) [Not 24/7] 5 | https://dai.google.com/linear/hls/event/TxSbNMu4R5anKrjV02VOBg/master.m3u8 6 | #EXTINF:-1 tvg-name="Pluto TV CBSN Los Angeles CA (720p)" tvg-id="PlutoTVCBSNewsLosAngeles.us" tvg-logo="https://images.pluto.tv/channels/5dc481cda1d430000948a1b4/colorLogoPNG.png" group-title="News",Pluto TV CBSN Los Angeles CA (720p) 7 | https://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5dc481cda1d430000948a1b4/master.m3u8?advertisingId=&appName=web&appStoreUrl=&appVersion=DNT&app_name=&architecture=&buildVersion=&deviceDNT=0&deviceId=5dc481cda1d430000948a1b4&deviceLat=&deviceLon=&deviceMake=web&deviceModel=web&deviceType=web&deviceVersion=DNT&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false&sid=207&terminate=false&userId= 8 | #EXTINF:-1 tvg-name="ABC News" tvg-id="ABCNews" tvg-logo="https://i.imgur.com/zBOsKCv.png" group-title="News",ABC News 9 | https://content.uplynk.com/channel/3324f2467c414329b3b0cc5cd987b6be.m3u8 10 | #EXTINF:-1 tvg-name="ABC Bakersfield CA 23" tvg-id="ABCNewsBakersfield" tvg-logo="https://i.ibb.co/CbsYMDR/abckero.webp" group-title="News",ABC Bakersfield CA 23 (KERO) (720p) 11 | https://content.uplynk.com/channel/ff809e6d9ec34109abfb333f0d4444b5.m3u8 12 | #EXTINF:-1 tvg-name="BBC World News" tvg-id="BBCWorld" tvg-logo="https://i.imgur.com/joD38lo.png" group-title="News",BBC World News 13 | http://103.199.161.254/Content/bbcworld/Live/Channel(BBCworld)/index.m3u8 14 | #EXTINF:-1 tvg-name="PBS West" tvg-id="PBSWest.us" tvg-logo="https://i.ibb.co/myk8WCF/pbs-news2.png" group-title="Education",PBS West 15 | https://pbs.lls.cdn.pbs.org/pst/index.m3u8 16 | #EXTINF:-1 tvg-name="Buzzr" tvg-id="Buzzr" tvg-logo="https://i.imgur.com/VihFt5p.png" group-title="Series",Buzzr 17 | https://buzzrota-web.amagi.tv/playlist480.m3u8 18 | #EXTINF:-1 tvg-name="TD Ameritrade Network" tvg-id="TDAmeritradeNetwork.us" tvg-logo="https://i.imgur.com/RbVdkJ5.png" group-title="News",TD Ameritrade Network 19 | https://tdameritrade-distro.amagi.tv/playlist.m3u8 20 | #EXTINF:-1 tvg-name="Bloomberg" tvg-id="BloombergTelevision.us" tvg-logo="https://i.ibb.co/jGSp0Cc/bloomberg.jpg" group-title="News",Bloomberg 21 | https://bloomberg.com/media-manifest/streams/us.m3u8 22 | #EXTINF:-1 tvg-name="ABC News Live 1 (720p)" tvg-id="ABCNewsLive1.us" tvg-logo="https://i.imgur.com/zBOsKCv.png" group-title="News",ABC News Live 1 (720p) 23 | https://abcnews-streams.akamaized.net/hls/live/2023560/abcnews1/master.m3u8 24 | #EXTINF:-1 tvg-name="ABC News Live 2 (720p)" tvg-id="ABCNewsLive2.us" tvg-logo="https://i.imgur.com/zBOsKCv.png" group-title="News",ABC News Live 2 (720p) 25 | https://abcnews-streams.akamaized.net/hls/live/2023561/abcnews2/master.m3u8 26 | #EXTINF:-1 tvg-name="ABC 7 Los Angeles CA (KABC-TV) (720p)" tvg-id="KABC-TV" tvg-logo="https://i.imgur.com/zBOsKCv.png" group-title="News",ABC 7 Los Angeles CA (KABC-TV) (720p) 27 | https://content.uplynk.com/channel/ext/2118d9222a87420ab69223af9cfa0a0f/kabc_24x7_news.m3u8 28 | #EXTINF:-1 tvg-name="ABC 4 Seattle WA (KOMO-TV) (720p)" tvg-id="KOMO-TV" tvg-logo="https://i.imgur.com/OujKrqc.png" group-title="News",ABC 4 Seattle WA (KOMO-TV) (720p) 29 | https://content.uplynk.com/2c88dfe19e1447e6a6aa27e8e143a140.m3u8 30 | #EXTINF:-1 tvg-name="Aqua Teen Hunger Force (1080p)" tvg-id="AdultSwimAquaTeenHungerForce.us" tvg-logo="https://i.ibb.co/kmxS2RR/Athf-logo.webp" group-title="Series",Aqua Teen Hunger Force (1080p) 31 | https://adultswim-vodlive.cdn.turner.com/live/aqua-teen/stream.m3u8 32 | #EXTINF:-1 tvg-name="Black Jesus (1080p)" tvg-id="AdultSwimBlackJesus.us" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/2/2b/Black_Jesus_title_card.png" group-title="Series",Black Jesus (1080p) 33 | https://adultswim-vodlive.cdn.turner.com/live/black-jesus/stream.m3u8 34 | #EXTINF:-1 tvg-name="Channel 5 (1080p)" tvg-id="AdultSwimChannel5.us" tvg-logo="https://i.ibb.co/D4kJP4Z/adult-swim-channel-5.png" group-title="Series",Channel 5 (1080p) 35 | https://adultswim-vodlive.cdn.turner.com/live/channel-5/stream.m3u8 36 | #EXTINF:-1 tvg-name="Dream Corp LLC (1080p)" tvg-id="AdultSwimDreamCorpLLC.us" tvg-logo="https://i.imgur.com/jOTChgo.jpg" group-title="Series",Dream Corp LLC (1080p) 37 | https://adultswim-vodlive.cdn.turner.com/live/DREAM-CORP-LLC/stream.m3u8 38 | #EXTINF:-1 tvg-name="Last Stream On The Left (1080p)" tvg-id="AdultSwimLastStreamOnTheLeft.us" tvg-logo="https://i.imgur.com/VsAKoN6.jpg" group-title="Series",Last Stream On The Left (1080p) 39 | https://adultswim-vodlive.cdn.turner.com/live/lsotl/stream.m3u8 40 | #EXTINF:-1 tvg-name="Metalocalypse (1080p)" tvg-id="AdultSwimMetalocalypse.us" tvg-logo="https://i.ibb.co/fvbD6Fg/as.jpg" group-title="Series",Metalocalypse (1080p) 41 | https://adultswim-vodlive.cdn.turner.com/live/metalocalypse/stream.m3u8 42 | #EXTINF:-1 tvg-name="Off The Air (1080p)" tvg-id="AdultSwimOffTheAir.us" tvg-logo="https://i.imgur.com/tFks0c6.jpg" group-title="Series",Off The Air (1080p) 43 | https://adultswim-vodlive.cdn.turner.com/live/off-the-air/stream.m3u8 44 | #EXTINF:-1 tvg-name="Rick and Morty (1080p)" tvg-id="AdultSwimRickAndMorty.us" tvg-logo="https://i.ibb.co/jWWDP9D/rickandmorty01.jpg" group-title="Series",Rick and Morty (1080p) 45 | https://adultswim-vodlive.cdn.turner.com/live/rick-and-morty/stream.m3u8 46 | #EXTINF:-1 tvg-name="Robot Chicken (1080p)" tvg-id="AdultSwimRobotChicken.us" tvg-logo="https://i.imgur.com/bTWIjIw.jpg" group-title="Series",Robot Chicken (1080p) 47 | https://adultswim-vodlive.cdn.turner.com/live/robot-chicken/stream.m3u8 48 | #EXTINF:-1 tvg-name="Samurai Jack (1080p)" tvg-id="AdultSwimSamuraiJack.us" tvg-logo="https://i.ibb.co/fvbD6Fg/as.jpg" group-title="Series",Samurai Jack (1080p) 49 | https://adultswim-vodlive.cdn.turner.com/live/samurai-jack/stream.m3u8 50 | #EXTINF:-1 tvg-name="The Eric Andre Show (1080p)" tvg-id="AdultSwimTheEricAndreShow.us" tvg-logo="https://i.imgur.com/tqHQy32.jpg" group-title="Series",The Eric Andre Show (1080p) 51 | https://adultswim-vodlive.cdn.turner.com/live/eric-andre/stream.m3u8 52 | #EXTINF:-1 tvg-name="The Venture Bros (1080p)" tvg-id="AdultSwimTheVentureBros.us" tvg-logo="https://i.ibb.co/fvbD6Fg/as.jpg" group-title="Series",The Venture Bros (1080p) 53 | https://adultswim-vodlive.cdn.turner.com/live/venture-bros/stream.m3u8 54 | #EXTINF:-1 tvg-name="Your Pretty Face Is Going To Hell (1080p)" tvg-id="AdultSwimYourPrettyFaceIsGoingToHell.us" tvg-logo="https://i.ibb.co/fvbD6Fg/as.jpg" group-title="Series",Your Pretty Face Is Going To Hell (1080p) 55 | https://adultswim-vodlive.cdn.turner.com/live/ypf/stream.m3u8 56 | #EXTINF:-1 tvg-name="CBS News Los Angeles (720p)" tvg-id="CBSNewsLA.us" tvg-logo="https://images.pluto.tv/channels/5dc481cda1d430000948a1b4/colorLogoPNG.png" group-title="News",CBS News Los Angeles (720p) 57 | https://cbsn-la.cbsnstream.cbsnews.com/out/v1/57b6c4534a164accb6b1872b501e0028/master.m3u8 58 | https://tve-live-lln.warnermediacdn.com/hls/live/586495/cnngo/cnn_slate/VIDEO_0_3564000.m3u8 59 | #EXTINF:-1 tvg-name="Law & Crime (720p)" tvg-id="LawCrime.us" tvg-logo="https://i.ibb.co/D5S2GcD/lawandcrime-defult-social.jpg" group-title="Series",Law & Crime (720p) 60 | http://lawandcrime.samsung.wurl.com/manifest/playlist.m3u8 61 | #EXTINF:-1 tvg-name="Law & Crime (720p) (XUMO)" tvg-id="LawCrimeXUMO.us" tvg-logo="https://i.ibb.co/vdC6x7d/xumo-play.png" group-title="Series",Law & Crime (720p) (XUMO) 62 | https://dai2.xumo.com/amagi_hls_data_xumo1234A-lawcrime/CDN/playlist.m3u8 63 | #EXTINF:-1 tvg-name="MST3K 1 (1080p)" tvg-id="MST3K1.us" tvg-logo="https://i.ibb.co/FVMsb87/mst3k-live-stream-400x.png" group-title="Series",MST3K 1 (1080p) 64 | http://cfd-v4-service-channel-stitcher-use1-1.prd.pluto.tv/stitch/hls/channel/545943f1c9f133a519bbac92/master.m3u8?appName=web&appVersion=unknown&clientTime=0&deviceDNT=0&deviceId=6c2a02e6-30d3-11ef-9cf5-e9ddff8ff496&deviceMake=Chrome&deviceModel=web&deviceType=web&deviceVersion=unknown&includeExtendedEvents=false&serverSideAds=false&sid=08f3602c-a3d5-4a4d-91f2-ec37a24d31a5 65 | #EXTINF:-1 tvg-name="MST3K 2 (1080p)" tvg-id="MST3K2.us" tvg-logo="https://i.ibb.co/FVMsb87/mst3k-live-stream-400x.png" group-title="Series",MST3K 2 (1080p) 66 | https://aegis-cloudfront-1.tubi.video/d4996d1c-b12b-4220-ac05-b674d76b639b/playlist.m3u8 67 | #EXTINF:-1 tvg-name="The Film Detective (720p)" tvg-id="TheFilmDetective.us" tvg-logo="https://i.imgur.com/4aFLH9g.png" group-title="Movies",The Film Detective (720p) 68 | https://dai.google.com/linear/hls/event/OYH9J7rZSK2fabKXWAYcfA/master.m3u8 69 | #EXTINF:-1 tvg-name="Weathernation (720p)" tvg-id="WeatherNation.us" tvg-logo="https://cdn.tvpassport.com/image/station/100x100/weathernation.png" group-title="News",Weathernation (720p) 70 | https://live-news-manifest.tubi.video/live-news-manifest/csm/extlive/tubiprd01,Cloudfront-Weather-Nation.m3u8 71 | #EXTINF:-1 tvg-name="WeatherSpy" tvg-id="WeatherSpy.us" tvg-logo="https://i.imgur.com/SAZF1cq.jpg" group-title="News",WeatherSpy 72 | https://jukin-weatherspy-1-us.samsung.wurl.tv/playlist.m3u8 73 | #EXTINF:-1 tvg-name="WeatherSpy (720p) (XUMO)" tvg-id="WeatherSpy.us" tvg-logo="https://i.imgur.com/SAZF1cq.jpg" group-title="News",WeatherSpy (720p) (XUMO) 74 | https://dai2.xumo.com/amagi_hls_data_xumo1212A-redboxweatherspy/CDN/playlist.m3u8 75 | #EXTINF:-1 tvg-name="Pluto TV Space (720p) [Not 24/7]" tvg-id="PlutoTVSpace.us" tvg-logo="https://images.pluto.tv/channels/5dbc2f98777f2e0009934ae7/colorLogoPNG.png" group-title="Series",Pluto TV Space (720p) [Not 24/7] 76 | https://service-stitcher.clusters.pluto.tv/v1/stitch/embed/hls/channel/5dbc2f98777f2e0009934ae7/master.m3u8?advertisingId=channel&appName=rokuchannel&appVersion=1.0&bmodel=bm1&channel_id=channel&content=channel&content_rating=ROKU_ADS_CONTENT_RATING&content_type=livefeed&coppa=false&deviceDNT=1&deviceId=channel&deviceMake=rokuChannel&deviceModel=web&deviceType=rokuChannel&deviceVersion=1.0&embedPartner=rokuChannel&genre=ROKU_ADS_CONTENT_GENRE&is_lat=1&platform=web&rdid=channel&studio_id=viacom&tags=ROKU_CONTENT_TAGS 77 | #EXTINF:-1 tvg-name="Pluto TV Smithsonian Channel Selects (720p)" tvg-id="PlutoTVSmithsonianChannelSelects.us" tvg-logo="https://images.pluto.tv/channels/5f21ea08007a49000762d349/featuredImage.jpg" group-title="Series",Pluto TV Smithsonian Channel Selects (720p) 78 | https://service-stitcher.clusters.pluto.tv/v1/stitch/embed/hls/channel/5f21ea08007a49000762d349/master.m3u8?advertisingId=channel&appName=rokuchannel&appVersion=1.0&bmodel=bm1&channel_id=channel&content=channel&content_rating=ROKU_ADS_CONTENT_RATING&content_type=livefeed&coppa=false&deviceDNT=1&deviceId=channel&deviceMake=rokuChannel&deviceModel=web&deviceType=rokuChannel&deviceVersion=1.0&embedPartner=rokuChannel&genre=ROKU_ADS_CONTENT_GENRE&is_lat=1&platform=web&rdid=channel&studio_id=viacom&tags=ROKU_CONTENT_TAGS 79 | #EXTINF:-1 tvg-name="Pluto TV Spotlight (684p)" tvg-id="PlutoTVSpotlight.us" tvg-logo="https://images.pluto.tv/channels/5ba3fb9c4b078e0f37ad34e8/colorLogoPNG.png" group-title="Series",Pluto TV Spotlight (684p) 80 | https://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5ba3fb9c4b078e0f37ad34e8/master.m3u8?advertisingId=&appName=web&appStoreUrl=&appVersion=DNT&app_name=&architecture=&buildVersion=&deviceDNT=0&deviceId=5ba3fb9c4b078e0f37ad34e8&deviceLat=&deviceLon=&deviceMake=web&deviceModel=web&deviceType=web&deviceVersion=DNT&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false&sid=51&terminate=false&userId= 81 | #EXTINF:-1 tvg-name="Funny or Die (720p)" tvg-id="FunnyorDie.us" tvg-logo="https://i.ibb.co/GFgQQxF/funny-or-die-logo.jpg" group-title="Series",Funny or Die (720p) 82 | https://dai2.xumo.com/amagi_hls_data_xumo1212A-redboxfunnyordie/CDN/playlist.m3u8 83 | #EXTINF:-1 tvg-name="Forensic Files (Tubi)" tvg-id="FilmRiseForensicFiles.us" tvg-logo="https://i.ibb.co/mGYny0w/forensic-files-400x.jpg" group-title="Series",Forensic Files (Tubi) 84 | https://apollo.production-public.tubi.io/live/ac-forensic-files.m3u8 85 | #EXTINF:-1 tvg-name="CNN" tvg-id="CNN.us" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/CNN.svg/512px-CNN.svg.png" group-title="News",CNN 86 | https://stream1.freetv.fun/e5667906c5c0fc0d1a7327e49a649f1e28cfd74bfb9a96c0844156fbec16ab64.m3u8 87 | https://stream1.freetv.fun/cnn-1.m3u8 88 | #EXTINF:-1 tvg-name="CNN International" tvg-id="CNNInternationalNorthAmerica.us" tvg-logo="https://i.imgur.com/dfxefQw.png" group-title="News",CNN International 89 | https://stream1.freetv.fun/14985f6413cc7555063e05f9966d1a6d9019ff04884b80b62c1f35e8582bef18.m3u8 90 | https://stream1.freetv.fun/cnn-int-4.m3u8 91 | #EXTINF:-1 tvg-name="C-SPAN" tvg-id="CSPAN.us" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/C-SPAN_Logo_%282019%29.svg/512px-C-SPAN_Logo_%282019%29.svg.png" group-title="News",C-SPAN 92 | https://stream1.freetv.fun/f6bfffcab440e219cfeacdb8c80597308b8dc1d9a7bd5bce90dd62dbb4318496.m3u8 93 | https://stream1.freetv.fun/c-span-2.m3u8 94 | #EXTINF:-1 tvg-name="HBO Xtreme" tvg-id="HBOXtreme.br" tvg-logo="https://www.vertvcable.com/wp-content/uploads/2022/02/hboextreme.jpg" group-title="Series",HBO Xtreme 95 | http://45.177.179.227:8000/play/a02f/index.m3u8 96 | #EXTINF:-1 tvg-name="Baywatch (720p)" tvg-id="Baywatch.us" tvg-logo="https://images.fineartamerica.com/images/artworkimages/medium/3/1-baywatch-chris-toro-transparent.png" group-title="Series",Baywatch (720p) 97 | https://apollo.production-public.tubi.io/live/ac-baywatch.m3u8 98 | #EXTINF:-1 tvg-name="BBC Top Gear" tvg-id="BBCTopGear" tvg-logo="https://static.wikia.nocookie.net/classikcars/images/f/f8/Top-gear.jpg" group-title="Series",BBC Top Gear (720p) 99 | https://apollo.production-public.tubi.io/live/ac-bbc-top-gear2.m3u8 100 | #EXTINF:-1 tvg-name="Ice Road Truckers" tvg-id="IceRoadTruckers" tvg-logo="https://i.pinimg.com/564x/f5/5d/1c/f55d1c1ac7458bec4840dc1bd875cfe7.jpg" group-title="Series",Ice Road Truckers (1080p) 101 | https://apollo.production-public.tubi.io/live/ac-ice-road-truckers.m3u8 -------------------------------------------------------------------------------- /iptv-livetv/iptv-plutotv.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U 2 | #EXTINF:-1 tvg-name="PlutoTV Crime Movies" tvg-id="PlutoTVCrimeMovies.us" tvg-logo="https://i.imgur.com/SJcqknt.png" group-title="Movies",PlutoTV Crime Movies 3 | https://service-stitcher.clusters.pluto.tv/v1/stitch/embed/hls/channel/5f4d8594eb979c0007706de7/master.m3u8?advertisingId=channel&appName=rokuchannel&appVersion=1.0&bmodel=bm1&channel_id=channel&content=channel&content_rating=ROKU_ADS_CONTENT_RATING&content_type=livefeed&coppa=false&deviceDNT=1&deviceId=channel&deviceMake=rokuChannel&deviceModel=web&deviceType=rokuChannel&deviceVersion=1.0&embedPartner=rokuChannel&genre=ROKU_ADS_CONTENT_GENRE&is_lat=1&platform=web&rdid=channel&studio_id=viacom&tags=ROKU_CONTENT_TAGS 4 | #EXTINF:-1 tvg-name="PlutoTV Movies" tvg-id="PlutoTVMovies.us" tvg-logo="https://i.imgur.com/XzAbXAn.png" group-title="Movies",PlutoTV Movies 5 | https://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5c5c3b948002db3c3e0b262e/master.m3u8?advertisingId=&appName=web&appStoreUrl=&appVersion=DNT&app_name=&architecture=&buildVersion=&deviceDNT=1&deviceId=5c5c3b948002db3c3e0b262e&deviceLat=&deviceLon=&deviceMake=web&deviceModel=web&deviceType=web&deviceVersion=DNT&includeExtendedEvents=false&marketingRegion=DE&serverSideAds=false&sid=eddfafe3-0584-11eb-82fe-0242ac110002&terminate=false&userId= 6 | #EXTINF:-1 tvg-name="PlutoTV Westerns" tvg-id="PlutoTVWesterns.us" tvg-logo="https://i.imgur.com/biepi4A.png" group-title="Movies",PlutoTV Westerns 7 | https://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5e8df4bc16e34700077e77d3/master.m3u8?advertisingId=&appName=web&appStoreUrl=&appVersion=DNT&app_name=&architecture=&buildVersion=&deviceDNT=0&deviceId=5e8df4bc16e34700077e77d3&deviceLat=&deviceLon=&deviceMake=web&deviceModel=web&deviceType=web&deviceVersion=DNT&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false&sid=526&terminate=false&userId= 8 | #EXTINF:-1 tvg-name="PlutoTV Spotlight" tvg-id="PlutoTVSpotlight.us" tvg-logo="https://i.imgur.com/AogTmZc.png" group-title="VOD Movies (EN)",PlutoTV Spotlight 9 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5ba3fb9c4b078e0f37ad34e8/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=51&deviceId=5ba3fb9c4b078e0f37ad34e8&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 10 | #EXTINF:-1 tvg-name="PlutoTV Action" tvg-id="PlutoTVAction.us" tvg-logo="https://i.imgur.com/g8PCdh6.png" group-title="VOD Movies (EN)",PlutoTV Action 11 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/561d7d484dc7c8770484914a/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=54&deviceId=561d7d484dc7c8770484914a&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 12 | #EXTINF:-1 tvg-name="PlutoTV Comedy" tvg-id="PlutoTVComedy.us" tvg-logo="https://i.imgur.com/Pjs4lgs.png" group-title="VOD Movies (EN)",PlutoTV Comedy 13 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5a4d3a00ad95e4718ae8d8db/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=57&deviceId=5a4d3a00ad95e4718ae8d8db&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 14 | #EXTINF:-1 tvg-name="PlutoTV Drama" tvg-id="PlutoTVDrama.us" tvg-logo="https://i.imgur.com/B9srooj.png" group-title="VOD Movies (EN)",PlutoTV Drama 15 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5b4e92e4694c027be6ecece1/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=60&deviceId=5b4e92e4694c027be6ecece1&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 16 | #EXTINF:-1 tvg-name="PlutoTV Fantastic" tvg-id="PlutoTVFantastic.us" tvg-logo="https://i.imgur.com/dOfXc5w.png" group-title="VOD Movies (EN)",PlutoTV Fantastic 17 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5b64a245a202b3337f09e51d/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=66&deviceId=5b64a245a202b3337f09e51d&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 18 | #EXTINF:-1 tvg-name="PlutoTV Romance" tvg-id="PlutoTVRomance.us" tvg-logo="https://i.imgur.com/j6livg0.png" group-title="VOD Movies (EN)",PlutoTV Romance 19 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5a66795ef91fef2c7031c599/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=70&deviceId=5a66795ef91fef2c7031c599&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 20 | #EXTINF:-1 tvg-name="PlutoTV Crime Movies" tvg-id="PlutoTVCrimeMovies.us" tvg-logo="https://i.imgur.com/PlAQrIb.png" group-title="VOD Movies (EN)",PlutoTV Crime Movies 21 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5f4d8594eb979c0007706de7/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=73&deviceId=5f4d8594eb979c0007706de7&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 22 | #EXTINF:-1 tvg-name="PlutoTV Thrillers" tvg-id="PlutoTVThrillers.us" tvg-logo="https://i.imgur.com/jyiFzG4.png" group-title="VOD Movies (EN)",PlutoTV Thrillers 23 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5b4e69e08291147bd04a9fd7/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=74&deviceId=5b4e69e08291147bd04a9fd7&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 24 | #EXTINF:-1 tvg-name="PlutoTV Horror" tvg-id="PlutoTVHorror.us" tvg-logo="https://i.imgur.com/An93hAh.png" group-title="VOD Movies (EN)",PlutoTV Horror 25 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/569546031a619b8f07ce6e25/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=75&deviceId=569546031a619b8f07ce6e25&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 26 | #EXTINF:-1 tvg-name="PlutoTV Terror" tvg-id="PlutoTVTerror.us" tvg-logo="https://i.imgur.com/JLgn5jC.png" group-title="VOD Movies (EN)",PlutoTV Terror 27 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5c6dc88fcd232425a6e0f06e/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=76&deviceId=5c6dc88fcd232425a6e0f06e&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 28 | #EXTINF:-1 tvg-name="Black Cinema" tvg-id="BlackCinema.us" tvg-logo="https://i.imgur.com/Zh1QGW9.png" group-title="VOD Movies (EN)",Black Cinema 29 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/58af4c093a41ca9d4ecabe96/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=80&deviceId=58af4c093a41ca9d4ecabe96&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 30 | #EXTINF:-1 tvg-name="PlutoTV Staff Picks" tvg-id="PlutoTVStaffPicks.us" tvg-logo="https://i.imgur.com/DFDHAT8.png" group-title="VOD Movies (EN)",PlutoTV Staff Picks 31 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5f4d863b98b41000076cd061/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=90&deviceId=5f4d863b98b41000076cd061&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 32 | #EXTINF:-1 tvg-name="PlutoTV Documentaries" tvg-id="PlutoTVDocumentaries.us" tvg-logo="https://i.imgur.com/Mr4ZsNZ.png" group-title="VOD Movies (EN)",PlutoTV Documentaries 33 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5b85a7582921777994caea63/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=91&deviceId=5b85a7582921777994caea63&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 34 | #EXTINF:-1 tvg-name="PlutoTV 90s Throwback" tvg-id="90sThrowback.us" tvg-logo="https://i.imgur.com/sI1o3uK.png" group-title="VOD Movies (EN)",PlutoTV 90s Throwback 35 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5f4d86f519358a00072b978e/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=94&deviceId=5f4d86f519358a00072b978e&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 36 | #EXTINF:-1 tvg-name="PlutoTV 80s Rewind" tvg-id="80sRewind.us" tvg-logo="https://i.imgur.com/0FaLAhK.png" group-title="VOD Movies (EN)",PlutoTV 80s Rewind 37 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5ca525b650be2571e3943c63/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=95&deviceId=5ca525b650be2571e3943c63&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 38 | #EXTINF:-1 tvg-name="PlutoTV 70s Cinema" tvg-id="70sCinema.us" tvg-logo="https://i.imgur.com/wk9Baz9.png" group-title="VOD Movies (EN)",PlutoTV 70s Cinema 39 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5f4d878d3d19b30007d2e782/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=96&deviceId=5f4d878d3d19b30007d2e782&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 40 | #EXTINF:-1 tvg-name="PlutoTV Paramount Movie Channel" tvg-id="ParamountMovieChannel.us" tvg-logo="https://i.imgur.com/CfqRav0.png" group-title="VOD Movies (EN)",PlutoTV Paramount Movie Channel 41 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5cb0cae7a461406ffe3f5213/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=100&deviceId=5cb0cae7a461406ffe3f5213&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 42 | #EXTINF:-1 tvg-name="PlutoTV Westerns" tvg-id="PlutoTVWesterns.us" tvg-logo="https://i.imgur.com/79R7m0b.png" group-title="VOD Movies (EN)",PlutoTV Westerns 43 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5b4e94282d4ec87bdcbb87cd/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=103&deviceId=5b4e94282d4ec87bdcbb87cd&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 44 | #EXTINF:-1 tvg-name="PlutoTV Classic Movies" tvg-id="ClassicMovies.us" tvg-logo="https://i.imgur.com/feWPHep.png" group-title="VOD Movies (EN)",PlutoTV Classic Movies 45 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/561c5b0dada51f8004c4d855/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=106&deviceId=561c5b0dada51f8004c4d855&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 46 | #EXTINF:-1 tvg-name="PlutoTV Cult Films" tvg-id="PlutoTVCultFilms.us" tvg-logo="https://i.imgur.com/kD3SkoC.png" group-title="VOD Movies (EN)",PlutoTV Cult Films 47 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5c665db3e6c01b72c4977bc2/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=109&deviceId=5c665db3e6c01b72c4977bc2&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 48 | #EXTINF:-1 tvg-name="PlutoTV Flicks of Fury" tvg-id="FlicksofFury.us" tvg-logo="https://i.imgur.com/yhyzBfb.png" group-title="VOD Movies (EN)",PlutoTV Flicks of Fury 49 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/58e55b14ad8e9c364d55f717/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=112&deviceId=58e55b14ad8e9c364d55f717&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 50 | #EXTINF:-1 tvg-name="PlutoTV The Asylum" tvg-id="TheAsylum.us" tvg-logo="https://i.imgur.com/rOxQfdG.png" group-title="VOD Movies (EN)",PlutoTV The Asylum 51 | http://service-stitcher.clusters.pluto.tv/stitch/hls/channel/591105034c1806b47438342c/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=115&deviceId=591105034c1806b47438342c&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 52 | #EXTINF:-1 tvg-name="World Poker Tour – Pluto TV" tvg-id="PlutoTVWorldPokerTour.us" tvg-logo="https://i.imgur.com/AF1ON8u.png" group-title="VOD Italy",World Poker Tour – Pluto TV 53 | https://service-stitcher.clusters.pluto.tv/v1/stitch/embed/hls/channel/608016e446d73500075ea7e0/master.m3u8?deviceId=channel&deviceModel=web&deviceVersion=1.0&appVersion=1.0&deviceType=rokuChannel&deviceMake=rokuChannel&deviceDNT=1&advertisingId=channel&embedPartner=rokuChannel&appName=rokuchannel&is_lat=1&bmodel=bm1&content=channel&platform=web&tags=ROKU_CONTENT_TAGS&coppa=false&content_type=livefeed&rdid=channel&genre=ROKU_ADS_CONTENT_GENRE&content_rating=ROKU_ADS_CONTENT_RATING&studio_id=viacom&channel_id=channel 54 | #EXTINF:-1 tvg-name="Forensic Files (PlutoTV) 1" tvg-id="ForensicFiles.us" tvg-logo="https://i.ibb.co/mGYny0w/forensic-files-400x.jpg" group-title="Shows",Forensic Files (PlutoTV) 1 55 | https://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5bb1af6a268cae539bcedb0a/master.m3u8?terminate=false&deviceType=web&deviceMake=web&deviceModel=web&sid=370&deviceId=5bb1af6a268cae539bcedb0a&deviceVersion=DNT&appVersion=DNT&deviceDNT=0&userId=&advertisingId=&deviceLat=&deviceLon=&app_name=&appName=web&buildVersion=&appStoreUrl=&architecture=&includeExtendedEvents=false&marketingRegion=US&serverSideAds=false 56 | #EXTINF:-1 tvg-name="Forensic Files (PlutoTV) 2" tvg-id="ForensicFiles.us" tvg-logo="https://i.ibb.co/mGYny0w/forensic-files-400x.jpg" group-title="Shows",Forensic Files (PlutoTV) 2 57 | http://cfd-v4-service-channel-stitcher-use1-1.prd.pluto.tv/stitch/hls/channel/5bb1af6a268cae539bcedb0a/master.m3u8?appName=web&appVersion=unknown&clientTime=0&deviceDNT=0&deviceId=6c28ca68-30d3-11ef-9cf5-e9ddff8ff496&deviceMake=Chrome&deviceModel=web&deviceType=web&deviceVersion=unknown&includeExtendedEvents=false&serverSideAds=false&sid=859d292d-044e-4dc8-b889-003fa718d02e -------------------------------------------------------------------------------- /iptv-livetv/online-radio-collection.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U 2 | #EXTINF:0 tvg-name="KFI AM 640" tvg-logo="https://i.ibb.co/QFvsTYx/kfi-am-640-black.webp",KFI AM 640 3 | https://stream.revma.ihrhls.com/zc177/hls.m3u8 4 | #EXTINF:0 tvg-name="93.1 JACK FM" tvg-logo="https://i.ibb.co/wN49Sx3W/93-1jackfm-scaled.png",93.1 JACK FM 5 | https://live.amperwave.net/manifest/audacy-kcbsfmaac-imc 6 | #EXTINF:0 tvg-name="106.7 KROQ" tvg-logo="https://i.ibb.co/sd1bxqnM/kroq106-7-400x400.png",106.7 KROQ 7 | https://live.amperwave.net/manifest/audacy-kroqfmaac-imc 8 | #EXTINF:0 tvg-name="POWER 101.1 FM" tvg-logo="https://i.ibb.co/WNtCktR0/power101-1fm.jpg",POWER 101.1 FM 9 | https://ice3.securenetsystems.net/WHJA2 10 | #EXTINF:0 tvg-name="K-EARTH 101" tvg-logo="https://i.ibb.co/jkN8TkTx/kearth-101-fm-500x500.jpg",K-EARTH 101 11 | https://live.amperwave.net/manifest/audacy-krthfmaac-imc 12 | #EXTINF:0 tvg-name="95.5 KLOS" tvg-logo="https://i.ibb.co/GvTBpstK/95-5klos-scaled.webp",95.5 KLOS 13 | https://playerservices.streamtheworld.com/api/livestream-redirect/KLOSFMAAC.aac -------------------------------------------------------------------------------- /iptv-livetv/world-poker-tour.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U 2 | #EXTINF:-1 tvg-id="PlutoTVWorldPokerTour.us" tvg-country="US" tvg-language="English" tvg-logo="https://images.pluto.tv/channels/5f8ecfb9db6c180007a6d1b0/colorLogoPNG.png" group-title="Series",World Poker Tour (720p) Pluto TV 3 | https://service-stitcher.clusters.pluto.tv/stitch/hls/channel/5ad9b7aae738977e2c312132/master.m3u8?advertisingId=&appName=web&appStoreUrl=&appVersion=DNT&app_name=&architecture=&buildVersion=&deviceDNT=1&deviceId=5ad9b7aae738977e2c312132&deviceLat=&deviceLon=&deviceMake=web&deviceModel=web&deviceType=web&deviceVersion=DNT&includeExtendedEvents=false&marketingRegion=DE&serverSideAds=false&sid=48d01e71-b553-42a5-9205-affb7381b546&terminate=false&userId= 4 | 5 | -------------------------------------------------------------------------------- /jellyfin-css/jellyfin-10.8.x.css: -------------------------------------------------------------------------------- 1 | /* FONT STYLE */ 2 | @import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700;800&display=swap'); 3 | @font-face { 4 | font-family: 'Open Sans', sans-serif; !important 5 | font-style: normal; !important 6 | font-weight: 400; !important 7 | } 8 | .page, div { 9 | font-family: 'Open Sans', sans-serif; !important 10 | font-style: normal; !important 11 | font-weight: 400; !important 12 | } 13 | h1, h2, h3 { 14 | font-family: 'Open Sans', sans-serif; text-transform: uppercase; 15 | } 16 | h2, h3 { 17 | letter-spacing: .4px; 18 | } 19 | .emby-tab-button { 20 | font-family: 'Open Sans', sans-serif !important; 21 | text-transform: uppercase; 22 | letter-spacing: .5px; 23 | } 24 | .emby-tab-button:active { 25 | font-weight: 700 !important; 26 | } 27 | .emby-tab-button-active { 28 | font-weight: 700 !important; 29 | } 30 | .emby-button { 31 | text-transform: uppercase; 32 | } 33 | .button-link { 34 | text-transform: uppercase; 35 | color: #00a4dc !important; 36 | } 37 | .button-link:hover { 38 | color: #e0e0e0 !important; 39 | text-decoration-line: none; !important 40 | } 41 | 42 | /* DISCLAIMER FONT STYLE */ 43 | .disclaimer p { 44 | font-weight: 400; 45 | color: #deff7f; 46 | /* color: #c8ff00; */ 47 | /* color: honeydew; */ 48 | /* color: seashell; */ 49 | } 50 | 51 | /* TEXTBOX LABELS */ 52 | .checkboxListLabel, .inputLabel, .inputLabelUnfocused, .paperListLabel, .textareaLabelUnfocused { 53 | color: rgb(255, 255, 255); !important 54 | /* color: rgb(0, 186, 217) !important; */ 55 | font-weight: 600 !important; 56 | } 57 | 58 | /* NAV MENU */ 59 | .navMenuOption { 60 | padding: .6em 0 .6em 2.4em !important; 61 | text-transform: none !important; 62 | } 63 | 64 | /* ADMIN DASHBOARD */ 65 | span.navMenuOptionText { 66 | white-space: pre-wrap; 67 | text-align: justify; 68 | } 69 | .mainDrawer { 70 | background: #161616 !important; 71 | } 72 | .drawer-open { 73 | -webkit-box-shadow: 2px 0 12px 74 | box-shadow: 2px 0 12px 75 | } 76 | .checkboxLabel { 77 | text-transform: uppercase; 78 | } 79 | .checkboxListLabel, .inputLabel, .inputLabelUnfocused, .textareaLabelUnfocused { 80 | text-transform: uppercase; 81 | } 82 | 83 | .textareaLabel { 84 | text-transform: uppercase; 85 | } 86 | .selectLabel { 87 | text-transform: uppercase; 88 | } 89 | .fieldDescription { 90 | font-style: oblique; 91 | } 92 | .paperList, .visualCardBox { 93 | border: 2px solid; 94 | } 95 | div.focuscontainer.dialog.formDialog.align-items-center.justify-content-center.dialog-fullscreen-lowres.centeredDialog.opened { 96 | border: 2px solid; 97 | } 98 | div.focuscontainer.dialog.formDialog.align-items-center.justify-items-center.dialog-fullscreen-lowres.centeredDialog.opened { 99 | border: 2px solid; 100 | } 101 | .formDialogFooterItem-autosize { 102 | padding-left: 1em; 103 | padding-right: 1em; 104 | } 105 | .emby-input:focus, .emby-textarea:focus { 106 | box-shadow: 0 0 10px 0; 107 | } 108 | table.tblApiKeys.detailTable { 109 | text-transform: uppercase; 110 | } 111 | 112 | /* HEADER TOP MENU TRANSPARENCY */ 113 | .skinHeader.focuscontainer-x.skinHeader-withBackground.skinHeader-blurred {background:none; background-color:rgba(0, 0, 0, 0);} 114 | .skinHeader.focuscontainer-x.skinHeader-withBackground.skinHeader-blurred.noHomeButtonHeader {background:none; background-color:rgba(0, 0, 0, 0);} 115 | 116 | /* BACKGROUND STYLE */ 117 | /* .backgroundContainer, .dialog, html {background-color: #000 !important;} */ 118 | /* 119 | /* .backgroundContainer.withBackdrop { 120 | background-color: rgba(0,0,0,1) !important; 121 | } */ 122 | /* .backgroundContainer.withBackdrop { 123 | background-color: transparent !important; 124 | } */ 125 | */ 126 | .cardContent-shadow, .defaultCardBackground0 { 127 | background-color: transparent !important; 128 | } 129 | .appfooter { 130 | border-top: 1px solid rgba(255,255,255,.1) !important; 131 | } 132 | .dialog-small { 133 | border: 2px solid !important; 134 | } 135 | .selectionCommandsPanel { 136 | background: #cc3333 !important; 137 | } 138 | div.dialog { 139 | padding: 0 .2em .2em 0; 140 | } 141 | 142 | /* RIGHT-CLICK CONTEXT MENU */ 143 | .actionSheetContent {border: 1px solid;} 144 | .dialog {background-color: #101010cf;} 145 | 146 | .layout-desktop .listItemBodyText { 147 | margin: 0.10em 0 0 0 !important; 148 | } 149 | 150 | /* UI BUTTON STYLE */ 151 | .emby-select-withcolor { 152 | background: transparent !important; 153 | border: .07em solid !important; 154 | } 155 | .fab, .raised { 156 | border: 1px solid #00a4dc !important; 157 | transition: 0.3s; 158 | } 159 | .fab:hover, .raised:hover { 160 | background: #0073a8 !important; 161 | border-color: #00a4dc !important; 162 | } 163 | .emby-input-iconbutton { 164 | transition: 0.3s; 165 | } 166 | i.md-icon.playstatebutton-icon-played { 167 | transition: 0.3s; 168 | } 169 | button.listItemButton.paper-icon-button-light.emby-button { 170 | transition: 0.3s; 171 | } 172 | i.md-icon.ratingbutton-icon-withrating { 173 | transition: 0.3s; 174 | } 175 | button.listItemButton.paper-icon-button-light.emby-button.ratingbutton-withrating { 176 | transition: 0.3s; 177 | } 178 | #popupAddTrigger button { 179 | font-size: 1em; 180 | text-transform: uppercase; 181 | text-decoration: none; 182 | font-weight: 600; 183 | line-height: 1.35; 184 | letter-spacing: .5px; 185 | margin: 0 .29em; 186 | padding: .86em 1em; 187 | border: 1px solid !important; 188 | border-radius: .2em; 189 | cursor: pointer; 190 | transition: 0.3s; 191 | } 192 | 193 | /* PROGRESS RINGS */ 194 | div.progressring {right: 30px;} 195 | 196 | /* EMBY BRANDING */ 197 | .pageTitleWithDefaultLogo {background-image: url("//cdn.travisflix.com/web/img/travisflix_clean_lg.svg") !important;} 198 | 199 | /* LOGIN FORM WIDTH */ 200 | #loginPage .readOnlyContent, #loginPage form {max-width: 24em;} 201 | 202 | /* HIDE "PLEASE LOGIN" TEXT, MARGIN IS TO PREVENT LOGIN FORM MOVING TOO FAR UP */ 203 | #loginPage h1 {display: none;} 204 | #loginPage .padded-left.padded-right.padded-bottom-page {margin-top: 50px;} 205 | 206 | /* HIDE MANUAL AND FORGOT BUTTONS */ 207 | #loginPage .raised.cancel.block.btnManual.emby-button {display: none;} 208 | #loginPage .raised.cancel.block.btnForgotPassword.emby-button {display: none;} 209 | 210 | /* BACKGROUND IMAGE */ 211 | #loginPage { 212 | background-image: url("//cdn.travisflix.com/Branding/Splashscreen?format=webp&foregroundLayer=0.2"); 213 | position: absolute; 214 | margin-left: auto; 215 | margin-right: auto; 216 | background-repeat: no-repeat; 217 | background-position: top; 218 | width: 100%; 219 | overflow-y: scroll; 220 | background-attachment: fixed; 221 | background-size: cover; 222 | webkit-background-size: cover; 223 | -o-background-size: cover; 224 | } 225 | 226 | /* TEXT INPUT FIELD BORDER COLOR */ 227 | .emby-input, .emby-textarea {border: 0.16em solid #444444;} 228 | 229 | /* PLAYBACK REPORTING PLUGIN */ 230 | table#activity_report_table thead { 231 | color: rgba(255, 255, 255, 0.87) !important; 232 | background: #cc3333 !important; 233 | text-transform: uppercase; 234 | } 235 | 236 | #user_usage_report_table thead { 237 | text-transform: uppercase; 238 | } 239 | 240 | #user_usage_report_results button { 241 | border: 1px solid !important; 242 | border-radius: .2em; 243 | cursor: pointer; 244 | transition: 0.3s; 245 | } 246 | 247 | /* SIZE EPISODE PREVIEW IMAGES IN A MORE COMPACT WAY */ 248 | .listItemImage.listItemImage-large.itemAction.lazy {height: 110px;} 249 | .listItem-content {height: 115px;} 250 | .secondary.listItem-overview.listItemBodyText {height: 61px; margin: 0;} 251 | 252 | /* ADJUST BOTH "SIZE-ADJUST" AND "SIZE" TO MODIFY SIZE */ 253 | .headerTabs.sectionTabs {text-size-adjust: 110%; font-size: 110%;} 254 | 255 | .pageTitle { 256 | margin-top: auto; 257 | margin-bottom: auto; 258 | color: yellow !important; 259 | } 260 | 261 | .mediaSourceIndicator { 262 | color: #a40061; 263 | background: yellow; 264 | } 265 | 266 | .emby-tab-button {padding: 1.75em 1.7em;} 267 | 268 | /* REMOVE SECTION TITLE HEADER AND EDIT MENU */ 269 | #homeTab div.section0 div.sectionTitleContainer.sectionTitleContainer-cards {visibility: hidden;} 270 | 271 | /* MY MEDIA IMAGE SIZE */ 272 | .smallBackdropCard {width: 16.0% !important;} 273 | 274 | /* VIDEO TITLE TEXT */ 275 | button.itemAction.textActionButton.cardTextActionButton {font-weight: 600;} 276 | 277 | #loginPage .content-primary, .padded-bottom-page, .page, .pageWithAbsoluteTabs .pageTabContent { 278 | padding-bottom: 0 !important; 279 | } 280 | 281 | .cardText > .textActionButton { 282 | width: 100%; 283 | overflow: hidden; 284 | text-overflow: ellipsis; 285 | } 286 | 287 | /* MAKE WATCHED ICON DARK AND TRANSPARENT */ 288 | .playedIndicator { 289 | /* background: #00000058; */ 290 | background: #000000c2; 291 | color: #fbff3fd6; 292 | } 293 | 294 | .countIndicator {background: #dc0026a3;} 295 | 296 | /* THIS MODIFIES THE COLORS OF THE CAST, SEARCH AND USER BUTTONS IN THE TOP RIGHT */ 297 | .headerRight { color: yellow; } 298 | 299 | /* SCROLLBAR */ 300 | /* .layout-desktop ::-webkit-scrollbar {width: 1em;} */ 301 | ::-webkit-scrollbar-thumb:vertical {background: center no-repeat #afafaf;} 302 | ::-webkit-scrollbar-track-piece {background-color: #161616;} 303 | 304 | /* MOVE DETAILLOGO AND ITEM DESCRIPTION HIGHER 305 | .itemBackdrop {height: 45vh;} 306 | .detailLogo {top: 5vh;} */ 307 | 308 | /*Shrink and square (or round) cast thumnails*/ 309 | @media all and (min-width: 131.25em){ 310 | #castContent .card.overflowPortraitCard { 311 | width: 6.3vw !important; 312 | font-size: 90% !important; 313 | } 314 | } 315 | 316 | @media all and (min-width: 120em) and (max-width: 131.25em){ 317 | #castContent .card.overflowPortraitCard { 318 | width: 6.4vw !important; 319 | font-size: 90% !important; 320 | } 321 | } 322 | 323 | @media all and (min-width: 100em) and (max-width: 120em){ 324 | #castContent .card.overflowPortraitCard { 325 | width: 7.6vw !important; 326 | font-size: 90% !important; 327 | } 328 | } 329 | 330 | @media all and (min-width: 87.5em) and (max-width: 100em){ 331 | #castContent .card.overflowPortraitCard { 332 | width: 9.3vw !important; 333 | font-size: 90% !important; 334 | } 335 | } 336 | 337 | @media all and (min-width: 75em) and (max-width: 87.5em){ 338 | #castContent .card.overflowPortraitCard { 339 | width: 10.5vw !important; 340 | font-size: 90% !important; 341 | } 342 | } 343 | 344 | @media all and (min-width: 50em) and (max-width: 75em){ 345 | #castContent .card.overflowPortraitCard { 346 | width: 15vw !important; 347 | font-size: 90% !important; 348 | } 349 | } 350 | 351 | @media all and (min-width: 43.75em) and (max-width: 50em){ 352 | #castContent .card.overflowPortraitCard { 353 | width: 20.1vw !important; 354 | font-size: 90% !important; 355 | } 356 | } 357 | 358 | @media all and (min-width: 25em) and (max-width: 43.75em){ 359 | #castContent .card.overflowPortraitCard { 360 | width: 31.2vw !important; 361 | font-size: 90% !important; 362 | } 363 | } 364 | 365 | @media all and (max-width: 25em){ 366 | #castContent .card.overflowPortraitCard { 367 | width: 40vw !important; 368 | font-size: 90% !important; 369 | } 370 | } 371 | 372 | /*Shrink and square (or round) cast thumnails*/ 373 | #castContent .card.overflowPortraitCard.personCard.card-hoverable.card-withuserdata {width: 4.2cm !important; font-size: 90% !important;} 374 | #castContent .card.overflowPortraitCard.personCard.card-withuserdata {width: 4.2cm !important; font-size: 90% !important;} 375 | .cardPadder {background-color: #0000 !important; box-shadow: none !important;} 376 | 377 | /*Correct image aspect ratio behaviour, set border-radius to zero for square tiles*/ 378 | #castContent .cardOverlayContainer.itemAction, 379 | #castContent .cardImageContainer 380 | {border-radius: 50% !important;} 381 | #castContent .cardScalable {width: 3.8cm !important; height: 3.8cm !important;} 382 | 383 | /*Add this if using completely round icons, it centers the threedot button*/ 384 | #castContent .cardOverlayButton-br {bottom: 4%; right: 15%; width: 70%;} 385 | #castContent .cardOverlayButton.cardOverlayButton-hover.itemAction.paper-icon-button-light {margin:auto;} 386 | -------------------------------------------------------------------------------- /misc/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "includeCorsCredentials": false, 3 | "multiserver": false, 4 | "themes": [ 5 | { 6 | "name": "Apple TV", 7 | "id": "appletv", 8 | "color": "#bcbcbc" 9 | }, { 10 | "name": "Blue Radiance", 11 | "id": "blueradiance", 12 | "color": "#011432" 13 | }, { 14 | "name": "Dark", 15 | "id": "dark", 16 | "color": "#202020", 17 | "default": true 18 | }, { 19 | "name": "Light", 20 | "id": "light", 21 | "color": "#303030" 22 | }, { 23 | "name": "Purple Haze", 24 | "id": "purplehaze", 25 | "color": "#000420" 26 | }, { 27 | "name": "WMC", 28 | "id": "wmc", 29 | "color": "#0c2450" 30 | } 31 | ], 32 | "menuLinks": [ 33 | { 34 | "name": "Help / Support", 35 | "icon": "contact_support", 36 | "url": "https://travisflix.com/help/#/support" 37 | }, 38 | { 39 | "name": "Site Status", 40 | "icon": "monitor_heart", 41 | "url": "https://status.travisflix.com" 42 | }, 43 | { 44 | "name": "Server Statistics", 45 | "icon": "query_stats", 46 | "url": "https://statistics.travisflix.com" 47 | }, 48 | { 49 | "name": "Speed Test", 50 | "icon": "speed", 51 | "url": "http://speed.travisflix.com" 52 | }, 53 | { 54 | "name": "Upload", 55 | "icon": "file_upload", 56 | "url": "https://files.travisflix.com/" 57 | }, 58 | { 59 | "name": "Telegram", 60 | "icon": "telegram", 61 | "url": "https://t.me/+5lfAfvn7U90xOTQx" 62 | }, 63 | { 64 | "name": "Movies.txt", 65 | "icon": "local_movies", 66 | "url": "https://travisflix.com/movies.txt" 67 | }, 68 | { 69 | "name": "Shows.txt", 70 | "icon": "tv", 71 | "url": "https://travisflix.com/shows.txt" 72 | }, 73 | { 74 | "name": "Standup.txt", 75 | "icon": "theater_comedy", 76 | "url": "https://travisflix.com/standup.txt" 77 | }, 78 | { 79 | "name": "MotoGP.txt", 80 | "icon": "sports_motorsports", 81 | "url": "https://travisflix.com/motogp.txt" 82 | }, 83 | { 84 | "name": "Formula1.txt", 85 | "icon": "emoji_events", 86 | "url": "https://travisflix.com/formula1.txt" 87 | }, 88 | { 89 | "name": "Tennis.txt", 90 | "icon": "sports_tennis", 91 | "url": "https://travisflix.com/tennis.txt" 92 | } 93 | ], 94 | "servers": [], 95 | "plugins": [ 96 | "playAccessValidation/plugin", 97 | "experimentalWarnings/plugin", 98 | "htmlAudioPlayer/plugin", 99 | "htmlVideoPlayer/plugin", 100 | "photoPlayer/plugin", 101 | "comicsPlayer/plugin", 102 | "bookPlayer/plugin", 103 | "youtubePlayer/plugin", 104 | "backdropScreensaver/plugin", 105 | "pdfPlayer/plugin", 106 | "logoScreensaver/plugin", 107 | "sessionPlayer/plugin", 108 | "chromecastPlayer/plugin" 109 | ] 110 | } 111 | -------------------------------------------------------------------------------- /misc/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visualblind/jellyfin-stuff/25b60c091b4ffceefa0fa540db516708810bcd00/misc/favicon.ico -------------------------------------------------------------------------------- /misc/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visualblind/jellyfin-stuff/25b60c091b4ffceefa0fa540db516708810bcd00/misc/favicon.png -------------------------------------------------------------------------------- /misc/index.html: -------------------------------------------------------------------------------- 1 | TravisFlix
-------------------------------------------------------------------------------- /misc/login-disclaimer.txt: -------------------------------------------------------------------------------- 1 | **Welcome to TravisFlix** ¯\\_(ツ)_\/¯

🎬 **MOVIES: 3,500+** — 📺 **TV-SERIES: 530+**
❓ **Help / Support:** [help.travisflix.com](https://help.travisflix.com)
💬 **Telegram:** [t.me/travisflix](https://t.me/+bpRYE4pTaRM1MmYx)
🤑 **CashApp:** [cash.app/$visualblind](https://cash.app/$visualblind)
** Donate Bitcoin**:
bc1q690p3utevcus3mscnq5anegz7a3m7cjv4vvd6g -------------------------------------------------------------------------------- /misc/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TravisFlix", 3 | "description": "The Free Software Media System", 4 | "lang": "en-US", 5 | "short_name": "TravisFlix", 6 | "start_url": "index.html#!/home.html", 7 | "theme_color": "#101010", 8 | "background_color": "#101010", 9 | "display": "standalone", 10 | "icons": [ 11 | { 12 | "sizes": "72x72", 13 | "src": "touchicon72.png", 14 | "type": "image/png" 15 | }, 16 | { 17 | "sizes": "114x114", 18 | "src": "touchicon114.png", 19 | "type": "image/png" 20 | }, 21 | { 22 | "sizes": "144x144", 23 | "src": "touchicon144.png", 24 | "type": "image/png" 25 | }, 26 | { 27 | "sizes": "512x512", 28 | "src": "touchicon512.png", 29 | "type": "image/png" 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /nginx/html/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 404 ‒ Resource not found 9 | 10 | 11 | 12 | 97 | 98 | 99 | 100 | 101 | 102 |
103 |

404

104 |
105 | 106 | 107 | -------------------------------------------------------------------------------- /nginx/html/maintenance.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Scheduled Maintenance 6 | 37 | 38 | 39 |
40 |
41 |
42 |

DomainName is temporarily unavailable 💔

43 |

WHAT: I am currently doing something to the site
44 | WHEN: Right now
45 | WHY: I felt like it

46 |

Visit the t.me/domain Telegram group for updates

47 |
48 |
49 |
50 | 51 | 52 | -------------------------------------------------------------------------------- /nginx/moz_ssl: -------------------------------------------------------------------------------- 1 | # generated 2022-01-09, Mozilla Guideline v5.6, nginx 1.20.1, OpenSSL 1.1.1l, modern configuration, no HSTS 2 | # https://ssl-config.mozilla.org/#server=nginx&version=1.20.1&config=modern&openssl=1.1.1l&hsts=false&guideline=5.6 3 | 4 | # ECDSA certificates 5 | ssl_certificate keys/domain.com-ecdsa/fullchain.pem; 6 | ssl_certificate_key keys/domain.com-ecdsa/privkey.pem; 7 | 8 | ssl_session_timeout 1d; 9 | ssl_session_cache shared:MozSSL:10m; # about 40000 sessions 10 | ssl_session_tickets off; 11 | 12 | # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam 13 | ssl_dhparam keys/dhparam.pem; # openssl dhparam -out /etc/nginx/dhparam.pem 4096 14 | 15 | # intermediate configuration 16 | ssl_protocols TLSv1.2 TLSv1.3; 17 | ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; 18 | # ssl_ecdh_curve secp521r1:secp384r1:prime256v1; # Requires nginx >= 1.1.0 19 | # ssl_ecdh_curve secp384r1:secp256r1; # Requires nginx >= 1.1.0 20 | 21 | ssl_prefer_server_ciphers off; 22 | 23 | # HSTS (ngx_http_headers_module is required) (63072000 seconds) 24 | #add_header Strict-Transport-Security "max-age=63072000" always; 25 | 26 | # OCSP stapling 27 | ssl_stapling on; 28 | ssl_stapling_verify on; 29 | 30 | # verify chain of trust of OCSP response using Root CA and Intermediate certs 31 | ssl_trusted_certificate keys/chain.pem; 32 | 33 | # replace with the IP address of your resolver 34 | resolver 1.1.1.1 1.0.0.1; 35 | -------------------------------------------------------------------------------- /nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user www-data; 2 | 3 | # Sets the worker threads to the number of CPU cores available in the system for best performance. 4 | # Should be > the number of CPU cores. 5 | # Maximum number of connections = worker_processes * worker_connections 6 | worker_processes auto; 7 | #worker_processes 2; 8 | worker_priority -10; 9 | 10 | # Maximum number of open files per worker process. 11 | # Should be > worker_connections. 12 | worker_rlimit_nofile 65536; 13 | 14 | # The file storing the process ID of the main process 15 | pid /run/nginx.pid; 16 | 17 | # Include module configuration files 18 | include /etc/nginx/modules-enabled/*.conf; 19 | 20 | events { 21 | # If you need more connections than this, you start optimizing your OS. 22 | # That's probably the point at which you hire people who are smarter than you as this is *a lot* of requests. 23 | # Should be < worker_rlimit_nofile. 24 | worker_connections 10000; 25 | } 26 | 27 | error_log /var/log/nginx/error.log warn; 28 | 29 | http { 30 | 31 | # Include the perl module 32 | perl_modules perl/lib; 33 | 34 | # mod_http_perl function 35 | perl_set $uri_lowercase 'sub { 36 | my $r = shift; 37 | my $uri = $r->uri; 38 | $uri =~ s/\R//; # replace all newline characters 39 | $uri = lc($uri); 40 | return $uri; 41 | }'; 42 | 43 | # remove X-Powered-By header set by PHP-FPM module 44 | fastcgi_hide_header X-Powered-By; 45 | 46 | variables_hash_max_size 2048; 47 | more_set_headers 'Server: Lulz'; 48 | 49 | # Hide nginx version information. 50 | server_tokens off; 51 | 52 | # Specify MIME types for files. 53 | include mime.types; 54 | 55 | default_type application/octet-stream; 56 | client_max_body_size 0; 57 | # Update charset_types to match updated mime.types. 58 | # text/html is always included by charset module. 59 | charset_types text/pub text/css text/plain text/vnd.wap.wml application/javascript application/json application/rss+xml application/xml; 60 | 61 | #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 62 | # '$status $body_bytes_sent "$http_referer" ' 63 | # '"$http_user_agent" "$http_x_forwarded_for"'; 64 | 65 | log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" ' 66 | '$status $body_bytes_sent "$http_referer" ' 67 | '"$http_user_agent" "$http_x_forwarded_for" ' 68 | '"$host" sn="$server_name" ' 69 | 'rt=$request_time ' 70 | 'ua="$upstream_addr" us="$upstream_status" ' 71 | 'ut="$upstream_response_time" ul="$upstream_response_length" ' 72 | 'cs=$upstream_cache_status' ; 73 | 74 | log_format upstreamlog '[$time_local] $remote_addr - $remote_user - ' 75 | '$server_name $host to: $upstream_addr: $request $status ' 76 | 'upstream_response_time $upstream_response_time msec $msec ' 77 | 'request_time $request_time'; 78 | 79 | log_format apm '"$time_local" client=$remote_addr ' 80 | 'method=$request_method request="$request" ' 81 | 'request_length=$request_length ' 82 | 'status=$status bytes_sent=$bytes_sent ' 83 | 'body_bytes_sent=$body_bytes_sent ' 84 | 'referer=$http_referer ' 85 | 'user_agent="$http_user_agent" ' 86 | 'upstream_addr=$upstream_addr ' 87 | 'upstream_status=$upstream_status ' 88 | 'upstream_cache_status=$upstream_cache_status ' 89 | 'request_time=$request_time ' 90 | 'upstream_response_time=$upstream_response_time ' 91 | 'upstream_connect_time=$upstream_connect_time ' 92 | 'upstream_header_time=$upstream_header_time'; 93 | 94 | log_format cache '$remote_addr - $upstream_cache_status [$time_local] ' 95 | '"$request" $status $body_bytes_sent ' 96 | '"$http_referer" "$http_user_agent"'; 97 | 98 | # Log access to this file 99 | # This is only used when you don't override it on a server{} level 100 | # access_log logs/access.log main; 101 | access_log /var/log/nginx/access.log main_ext; 102 | 103 | # How long to allow each connection to stay idle. 104 | # Longer values are better for each individual client, particularly for SSL, 105 | # but means that worker connections are tied up longer. 106 | #keepalive_timeout 30s; 107 | fastcgi_read_timeout 300s; 108 | 109 | # Speed up file transfers by using sendfile() to copy directly 110 | # between descriptors rather than using read()/write(). 111 | # For performance reasons, on FreeBSD systems w/ ZFS 112 | # this option should be disabled as ZFS's ARC caches 113 | # frequently used files in RAM by default. 114 | sendfile on; 115 | 116 | # Don't send out partial frames; this increases throughput 117 | # since TCP frames are filled up before being sent out. 118 | tcp_nopush on; 119 | tcp_nodelay on; 120 | 121 | # Enable gzip compression. 122 | gzip on; 123 | 124 | # Compression level (1-9). 125 | # 5 is a perfect compromise between size and CPU usage, offering about 126 | # 75% reduction for most ASCII files (almost identical to level 9). 127 | gzip_comp_level 5; 128 | 129 | # Don't compress anything that's already small and unlikely to shrink much 130 | # if at all (the default is 20 bytes, which is bad as that usually leads to 131 | # larger files after gzipping). 132 | gzip_min_length 4096; 133 | 134 | # Compress data even for clients that are connecting to us via proxies, 135 | # identified by the "Via" header (required for CloudFront). 136 | gzip_proxied any; 137 | 138 | # Tell proxies to cache both the gzipped and regular version of a resource 139 | # whenever the client's Accept-Encoding capabilities header varies; 140 | # Avoids the issue where a non-gzip capable client (which is extremely rare 141 | # today) would display gibberish if their proxy gave them the gzipped version. 142 | gzip_vary on; 143 | 144 | # Compress all output labeled with one of the following MIME-types. 145 | #gzip_types 146 | # text/html is always compressed by gzip module 147 | 148 | # This should be turned on if you are going to have pre-compressed copies (.gz) of 149 | # static files available. If not it should be left off as it will cause extra I/O 150 | # for the check. It is best if you enable this in a location{} block for 151 | # a specific directory, or on an individual server{} level. 152 | #gzip_static on; 153 | 154 | # Include files in the sites-enabled folder. server{} configuration files should be 155 | # placed in the sites-available folder, and then the configuration should be enabled 156 | # by creating a symlink. 157 | # See doc/sites-enabled.md 158 | 159 | resolver 1.1.1.1 1.0.0.1 valid=300s; 160 | resolver_timeout 3s; 161 | 162 | # CloudFlare reverse proxy real IP addresses 163 | #real_ip_recursive on; 164 | 165 | # Include important configuration files 166 | include sites-enabled/*.conf; 167 | include conf.d/*.conf; 168 | 169 | proxy_cache_key "$scheme$request_method$host$request_uri"; 170 | 171 | proxy_cache_min_uses 1; 172 | proxy_cache_valid 200 302 304 1d; 173 | proxy_cache_valid 301 12h; 174 | proxy_cache_valid 404 1m; 175 | #proxy_ignore_headers Cache-Control Expires; 176 | proxy_hide_header X-Powered-By; 177 | proxy_cache_revalidate on; 178 | proxy_cache_use_stale error timeout updating http_500; 179 | proxy_cache_background_update on; 180 | proxy_cache_lock on; 181 | 182 | } 183 | -------------------------------------------------------------------------------- /nginx/proxy_params: -------------------------------------------------------------------------------- 1 | proxy_set_header Host $host; 2 | proxy_set_header X-Real-IP $remote_addr; 3 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 4 | proxy_set_header X-Forwarded-Proto $scheme; 5 | proxy_set_header X-Forwarded-Protocol $scheme; 6 | proxy_set_header X-Forwarded-Host $host; 7 | 8 | client_max_body_size 0; 9 | client_body_buffer_size 1m; 10 | proxy_intercept_errors on; 11 | #proxy_buffering on; 12 | proxy_buffer_size 4k; 13 | proxy_buffers 64 4k; 14 | proxy_busy_buffers_size 64k; 15 | proxy_temp_file_write_size 256k; 16 | proxy_max_temp_file_size 0; 17 | proxy_read_timeout 300; 18 | -------------------------------------------------------------------------------- /nginx/website.conf: -------------------------------------------------------------------------------- 1 | # Proxy cache for Jellyfin images 2 | proxy_cache_path /dev/shm/nginx-cache/yoursite levels=1:2 keys_zone=jellyfin:10m max_size=1500M inactive=120h use_temp_path=off loader_threshold=400 loader_files=325; 3 | 4 | # Limit Connections zone for Jellyfin downloads 5 | limit_conn_zone $binary_remote_addr zone=perip:5m; 6 | 7 | upstream jellyfin_backend { 8 | server servername:8096; 9 | keepalive 32; 10 | keepalive_requests 1000; 11 | #keepalive_time 1h; 12 | keepalive_timeout 180s; 13 | } 14 | 15 | server { 16 | ### Redirect to site root ### 17 | listen 80; 18 | listen [::]:80; 19 | listen 443 ssl http2; 20 | listen [::]:443 ssl http2; 21 | server_name ~^(www\.)?(subdomain1\.)?(subdomain2\.)?domain\.com$; 22 | 23 | include proxy_params; 24 | include moz_ssl; 25 | 26 | return 301 https://domain.com$request_uri; 27 | } 28 | 29 | server { 30 | listen 443 ssl http2; 31 | listen [::]:443 ssl http2; 32 | 33 | server_name domain.com cdn.domain.com; 34 | 35 | include proxy_params; 36 | include moz_ssl; 37 | set $jellyfin_server "http://jellyfin_backend"; 38 | 39 | real_ip_header X-Forwarded-For; 40 | real_ip_recursive on; 41 | set_real_ip_from 10.10.10.31; 42 | set_real_ip_from 192.168.1.100; 43 | 44 | access_log /var/log/nginx/domain.com.cache.log cache; 45 | error_log /var/log/nginx/domain.com.error.log warn; 46 | 47 | root /var/www/domain.com; 48 | proxy_set_header Range $http_range; 49 | proxy_set_header If-Range $http_if_range; 50 | proxy_buffering on; 51 | 52 | # Security / XSS Mitigation Headers 53 | add_header X-Frame-Options "SAMEORIGIN"; 54 | add_header X-XSS-Protection "1; mode=block"; 55 | add_header X-Content-Type-Options "nosniff"; 56 | 57 | # HSTS HTTPS Security 58 | #add_header Strict-Transport-Security "max-age=31536000" always; #365 days 59 | add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"; 60 | 61 | # Content Security Policy 62 | # See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP 63 | # Enforces https content and restricts JS/CSS to origin 64 | # External Javascript (such as cast_sender.js for Chromecast) must be whitelisted. 65 | 66 | add_header Content-Security-Policy "default-src 'self' blob: data: https: https://i.ibb.co https://image.tmdb.org; connect-src 'self'; font-src 'self' data: https://fonts.gstatic.com/ https://fonts.googleapis.com; img-src 'self' https://repo.jellyfin.org https://raw.githubusercontent.com https://cdn.domain.com https://i.ibb.co https://image.tmdb.org https://assets.fanart.tv http://assets.fanart.tv https://m.media-amazon.com/ https://static.tvmaze.com/; object-src 'none'; script-src 'self' 'unsafe-inline' blob: https://www.gstatic.com/ https://www.youtube.com https://static.cloudflareinsights.com/beacon.min.js https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js https://cdn.jsdelivr.net; script-src-elem 'self' 'unsafe-inline' youtube.com blob: https://www.gstatic.com/ https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com/ https://cdnjs.cloudflare.com/"; 67 | 68 | # TOR HEADERS 69 | #add_header Onion-Location http://zzjymusfscxydtjnhtcpabgu5eldgg3evs23esvirlznxs6luvqpecqd.onion$request_uri; 70 | 71 | if (-f $document_root/maintenance.html) { 72 | return 503; 73 | } 74 | 75 | error_page 404 @http404; 76 | error_page 429 @http429; 77 | error_page 503 @maintenance; 78 | 79 | location @maintenance { 80 | rewrite ^(.*)$ /maintenance.html break; 81 | } 82 | 83 | location @http404 { 84 | internal; 85 | root /var/ErrorPages/404colors; 86 | rewrite ^(.*)$ /404.html break; 87 | } 88 | 89 | location @http429 { 90 | rewrite ^(.*)$ /http429.html break; 91 | } 92 | 93 | location = / { 94 | return 302 https://$host/web/; 95 | } 96 | 97 | location / { 98 | include proxy_params; 99 | proxy_connect_timeout 30s; 100 | add_header X-Nginx-Forwarded-Host $http_host; 101 | add_header Strict-Transport-Security "max-age=31536000" always; #365 days 102 | proxy_pass $jellyfin_server; 103 | } 104 | 105 | # location block for /web - This is purely for aesthetics so /web/#!/ works instead of having to go to /web/index.html/#!/ 106 | location = /web/ { 107 | # Proxy main Jellyfin traffic 108 | include proxy_params; 109 | proxy_pass $jellyfin_server/web/index.html; 110 | } 111 | 112 | location /socket { 113 | # Proxy Jellyfin Websockets traffic 114 | proxy_pass http://servername:8096/socket; 115 | proxy_http_version 1.1; 116 | proxy_set_header Upgrade $http_upgrade; 117 | proxy_set_header Connection "upgrade"; 118 | proxy_set_header Host $host; 119 | proxy_set_header X-Real-IP $remote_addr; 120 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 121 | proxy_set_header X-Forwarded-Proto $scheme; 122 | proxy_set_header X-Forwarded-Protocol $scheme; 123 | proxy_set_header X-Forwarded-Host $http_host; 124 | } 125 | 126 | ### Cache images javascript and fonts ### 127 | location ~ ^/Items/(.*)/Images|/web/.*(\.js|\.woff2) { 128 | include proxy_params; 129 | sendfile on; 130 | proxy_pass $jellyfin_server; 131 | proxy_cache_key "$host$request_uri"; 132 | proxy_cache jellyfin; 133 | proxy_cache_revalidate on; 134 | proxy_cache_lock off; 135 | proxy_cache_valid 200 301 302 30d; 136 | proxy_cache_methods GET HEAD; 137 | proxy_cache_min_uses 1; 138 | proxy_ignore_headers Expires Cache-Control Set-Cookie X-Accel-Expires Vary; 139 | proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; 140 | add_header X-Nginx-Cache $upstream_cache_status; # HTTP response header "X-Nginx-Cache" = HIT/MISS/BYPASS/EXPIRED 141 | add_header X-Nginx-CIP $remote_addr; 142 | 143 | gzip_vary on; 144 | gzip_proxied any; 145 | gzip_comp_level 5; 146 | gzip_min_length 10240; 147 | gzip_http_version 1.1; 148 | gzip_types image/png image/jpeg image/webp image/svg+xml; 149 | } 150 | 151 | location ~ ^/Items/(.*)/Download$ { 152 | include proxy_params; 153 | 154 | ## Rate-limit all downloads 155 | limit_rate 8192k; # Speed in Kilobyte/s 156 | limit_conn perip 3; # Simultaneous connections/per ip 157 | limit_conn_status 429; 158 | proxy_buffering on; # Required for limit_conn 159 | 160 | sendfile off; 161 | add_header X-Nginx-Forwarded-Host $http_host; 162 | add_header Strict-Transport-Security "max-age=31536000" always; #365 days 163 | proxy_pass $jellyfin_server; 164 | } 165 | 166 | location /help/ { 167 | proxy_set_header Host help.domain.com; 168 | add_header X-Nginx-ClientIP $remote_addr; 169 | add_header X-Nginx-Proxy $proxy_host; 170 | add_header X-Nginx-Forwarded-Host $http_host; 171 | add_header Strict-Transport-Security "max-age=31536000" always; #365 days 172 | proxy_pass https://account.github.io/; 173 | } 174 | 175 | location /web/assets/img/icon-transparent.png { 176 | sendfile on; 177 | rewrite ^(.*)$ /web/img/icon-transparent-tf.png break; 178 | } 179 | 180 | location ~ /web(/assets)?/img/banner-(light|dark)\.png$ { 181 | sendfile on; 182 | rewrite ^(.*)$ /web/img/banner-travisflix.png break; 183 | } 184 | 185 | location /web/img/ { 186 | sendfile on; 187 | try_files $uri $uri/ =404; 188 | } 189 | 190 | location /test/ { 191 | try_files $uri $uri/ =404; 192 | } 193 | 194 | location /web/test/ { 195 | 196 | if ($request_uri ~* "([^/]*$)" ) { 197 | set $last_path_component $1; 198 | } 199 | 200 | return 301 https://$host/test/$last_path_component; 201 | } 202 | 203 | location ~* ^/Videos/(.*)$ { 204 | include proxy_params; 205 | tcp_nodelay on; 206 | tcp_nopush on; 207 | sendfile off; 208 | add_header X-Nginx-Stream "tcp_nodelay=ON tcp_nopush=ON sendfile=OFF"; 209 | add_header X-Nginx-Forwarded-Host $http_host; 210 | add_header X-Nginx-Proxy $proxy_host; 211 | 212 | # Disable buffering when the nginx proxy gets very resource heavy upon streaming 213 | proxy_buffering off; 214 | proxy_pass $jellyfin_server; 215 | } 216 | 217 | location ~ ^/Playback/(BitrateTest.*)$ { 218 | include proxy_params; 219 | proxy_buffering off; 220 | add_header X-Nginx-Proxy $proxy_host; 221 | proxy_pass $jellyfin_server; 222 | } 223 | 224 | location /Sessions/Capabilities/ { 225 | proxy_buffering off; 226 | proxy_request_buffering off; 227 | proxy_pass $jellyfin_server; 228 | } 229 | 230 | location ~ ^/(web/)?favicon.(.*) { 231 | sendfile on; 232 | try_files /favicon.$2 /web/favicon.$2 /web/img/favicon.$2 =404; 233 | add_header X-Nginx-ClientIP $remote_addr; 234 | } 235 | 236 | location /web/bc8d51405ec040305a87.ico { 237 | rewrite ^(.*)$ /favicon.ico break; 238 | } 239 | 240 | location ~ ^/web/(379bab68d056910336f9|3f3fe0fd3a0b637b5030|f5bbb798cb2c65908633|23a72f5d56f82554aeab|d6ecf2254db85ff3b545|522fa270807b7b12a9ba|a962662957ebbb8eb436|baafa93a783b76e667ec|0df719b48efcaef953df|106a7abc109fb5e78742|49d14d0eb7bcdf6f2d1b|f94ebf203ea0c91a47c6|d0e56683308a17dba86d|0b37f660ac0f7f01ab41|6de874568a98308c4a74|d31413d3f03c0873ccbb|16fc81178d1aee54f6cc|e62987a12a58b24f383a|39209dd2362c0db7c673|eb8bef4f19b6ad227f46|142d834c201895a46a01|bbb3e6d43389ba0d436c|7b8ef9809145cfec0aa6|3fa90c593184d5737eb3|d28a57b1e61f9f0dabd9|6a2e2e6b4186720e5d4f)\.png$ { 241 | rewrite ^(.*)$ /favicon.png break; 242 | } 243 | 244 | #location ~ ^/(.*)\.txt { 245 | location ~ ^/([0-9a-z]+)\.txt { 246 | sendfile on; 247 | include proxy_params; 248 | more_set_headers 'Content-Type: text/plain'; 249 | try_files $1.txt $uri =404; 250 | add_header X-Nginx-ClientIP $remote_addr; 251 | add_header X-Nginx-Txt $1; 252 | } 253 | 254 | location ~ ^/(web/)?touchicon(72|114|144|512)?\.png$ { 255 | sendfile on; 256 | try_files /web/img/touchicon/touchicon$2.png /web/touchicon$2.png =404; 257 | add_header X-Nginx-ClientIP $remote_addr; 258 | } 259 | 260 | location /netdata/ { 261 | sendfile on; 262 | try_files $uri $uri/ =404; 263 | } 264 | 265 | location /loaderio-548b6134a9005e7b66f4b8ddabf08733 { 266 | try_files /loaderio-548b6134a9005e7b66f4b8ddabf08733.txt $uri =404; 267 | } 268 | 269 | } 270 | -------------------------------------------------------------------------------- /rclone-conf/rclone.conf-destination: -------------------------------------------------------------------------------- 1 | [http-home] 2 | type = http 3 | url = http://MyUser:MyPass@YourDnsOrIpAddress:8081/ 4 | 5 | [gdrive-usmba] 6 | type = drive 7 | client_id = 8 | client_secret = 9 | scope = drive 10 | token = {"access_token":""} 11 | root_folder_id = 12 | 13 | [gcrypt-usmba] 14 | type = crypt 15 | remote = gdrive-usmba:/gcrypt 16 | filename_encryption = standard 17 | directory_name_encryption = true 18 | password = 19 | password2 = 20 | -------------------------------------------------------------------------------- /rclone-conf/rclone.conf-source: -------------------------------------------------------------------------------- 1 | [gdrive] 2 | type = drive 3 | scope = drive 4 | token = {"access_token":""} 5 | client_id = 6 | client_secret = 7 | 8 | [gdrive-usmba] 9 | type = drive 10 | client_id = 11 | client_secret = 12 | scope = drive 13 | token = {"access_token":""} 14 | root_folder_id = 15 | 16 | [gdrive-gavilan] 17 | type = drive 18 | client_id = 19 | client_secret = 20 | scope = drive 21 | token = {"access_token":""} 22 | root_folder_id = 23 | 24 | [gcrypt-gavilan] 25 | type = crypt 26 | remote = gdrive-gavilan:gcrypt 27 | filename_encryption = standard 28 | directory_name_encryption = true 29 | password = 30 | password2 = 31 | 32 | [gcrypt-usmba] 33 | type = crypt 34 | remote = gdrive-usmba:/gcrypt 35 | filename_encryption = standard 36 | directory_name_encryption = true 37 | password = 38 | password2 = 39 | 40 | -------------------------------------------------------------------------------- /rclone-filter/filter-file-novideo.txt: -------------------------------------------------------------------------------- 1 | - /.zfs/** 2 | - /.recycle/** 3 | - /.Trash-1000/** 4 | - /.windows/** 5 | - /$RECYCLE.BIN/** 6 | - video-*/** 7 | - /media/** 8 | -------------------------------------------------------------------------------- /rclone-filter/filter-file-video.txt: -------------------------------------------------------------------------------- 1 | - /.zfs/** 2 | - /.recycle/** 3 | - /.Trash-1000/** 4 | - /.windows/** 5 | - /$RECYCLE.BIN/** 6 | + video-movies/** 7 | + video-shows/** 8 | + video-standup/** 9 | + video-tech/** 10 | + video-tennis/** 11 | + podcasts/** 12 | + /media/** 13 | - * 14 | -------------------------------------------------------------------------------- /rclone-filter/filter-file.txt: -------------------------------------------------------------------------------- 1 | - /.zfs/** 2 | - /.recycle/** 3 | - /.Trash-1000/** 4 | - /.windows/** 5 | - /$RECYCLE.BIN/** 6 | - /[G-g]s/** 7 | + /[T-t]emp/** 8 | - /drivers/** 9 | - /wordpress/** 10 | -------------------------------------------------------------------------------- /rclone-filter/filter-p0ds0smb.txt: -------------------------------------------------------------------------------- 1 | - /.zfs/** 2 | - /.recycle/** 3 | - /.Trash-1000/** 4 | - /.windows/** 5 | - /$RECYCLE.BIN/** 6 | + /media/** 7 | + /media/video-memories/** 8 | + /media/podcasts/** 9 | + video-movies/** 10 | + video-shows/** 11 | + video-standup/** 12 | + video-tech/** 13 | + video-tennis/** 14 | -------------------------------------------------------------------------------- /screenshots/screenshot-home.html.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visualblind/jellyfin-stuff/25b60c091b4ffceefa0fa540db516708810bcd00/screenshots/screenshot-home.html.jpg -------------------------------------------------------------------------------- /screenshots/screenshot-login.html.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visualblind/jellyfin-stuff/25b60c091b4ffceefa0fa540db516708810bcd00/screenshots/screenshot-login.html.jpg -------------------------------------------------------------------------------- /shell-scripts/ffmpeg/ffmpeg-inotify-transcode-acodec.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | inotifywait -m /mnt/pool0/p0ds0smb/temp/ffmpeg -e create -e moved_to | 3 | while read dir action file; do 4 | if [[ "$file" =~ .*\.(mp4|mkv) ]]; then 5 | bash -c "/mnt/pool0/p0ds0smb/visualblind/Documents/Scripts/linux/ffmpeg-transcode-acodec.sh -d /mnt/pool0/p0ds0smb/temp/ffmpeg -w /mnt/pool0/p0ds0smb/temp/ffmpeg/.working | /usr/bin/logger -t 'ffmpeg-inotify-transcode-acodec.sh'"; 6 | fi; 7 | done -------------------------------------------------------------------------------- /shell-scripts/ffmpeg/ffmpeg-output-acodec.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | find . -depth -maxdepth 2 -regextype posix-extended -regex '.*\.mkv$|.*\.mp4$' -type f -exec bash -c 'echo "{}" $(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "{}")' \; 3 | -------------------------------------------------------------------------------- /shell-scripts/ffmpeg/ffmpeg-transcode-acodec.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | ## DESCRIPTION: Transcode with FFmpeg all (mkv, mp4) media files in specified directory, 4 | ## overwriting the original source files. 5 | ## 6 | ## AUTHOR: Travis Runyard 7 | ## Revised: 04/18/2020 8 | ## URL: https://sysinfo.io/ffmpeg-batch-transcode-audio/ 9 | 10 | # Exit on first non-zero exit code 11 | set -e 12 | # Set shell options 13 | shopt -s globstar 14 | shopt -u nullglob 15 | # Declare variables (optionally) are indexed arrays 16 | # Only associative arrays require declaration, but standardizing is a good thing 17 | declare -a FILENAME 18 | declare -a LOG 19 | 20 | # Modify TEMPDIR and WORKDIR to suit your needs 21 | TEMPDIR="/mnt/pool0/p0ds0smb/temp/ffmpeg" 22 | WORKDIR="$TEMPDIR/.working" 23 | SCRIPT_NAME=$(basename "$0") 24 | 25 | usage() 26 | { 27 | cat 1>&2 < $nginx_www/movies.txt 22 | find "$jf_media/video-shows" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort > $nginx_www/shows.txt 23 | #uncomment if you want to generate directory tree as well 24 | # tree --noreport -d --charset=en_US.utf8 "$jf_media/video-shows" >> $nginx_www/shows.txt 25 | find "$jf_media/video-standup" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort > $nginx_www/standup.txt 26 | find "$jf_media/video-tennis" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort --reverse > $nginx_www/tennis.txt 27 | find "$jf_media/video-starcraft" -mindepth 1 -maxdepth 1 -type f -printf '%f\n' | sort --reverse > $nginx_www/starcraft.txt 28 | find "$jf_media/video-tech" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort > $nginx_www/tech.txt 29 | find "$jf_media/podcasts" -mindepth 1 -maxdepth 2 -type d -printf '%f\n' | sort > $nginx_www/podcasts.txt 30 | #uncomment if you want to generate directory tree as well 31 | # tree --noreport --charset=en_US.utf8 "$jf_media/podcasts" >> $nginx_www/podcasts.txt 32 | # sort reversed 33 | find "$jf_media/video-motogp" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort --reverse > $nginx_www/motogp.txt 34 | find "$jf_media/video-formula1" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort --reverse > $nginx_www/formula1.txt 35 | #uncomment if you want to generate directory tree as well 36 | # tree --noreport --charset=en_US.utf8 "$jf_media/video-formula1" >> $nginx_www/formula1.txt 37 | else 38 | exit 1 39 | 40 | fi 41 | 42 | -------------------------------------------------------------------------------- /shell-scripts/jellyfin-backdrops-enable_10.9.x.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # compatibility: jellyfin 10.8.x - 10.9.x 4 | 5 | # enable backdrops by default for all users 6 | sed -E -i 's/enableBackdrops\:function\(\)\{return P\}/enableBackdrops\:function\(\)\{return \_\}/' main.jellyfin.bundle.js 7 | 8 | # if you wish to revert this change then change the _ back to P like this: 9 | # 's/enableBackdrops\:function\(\)\{return \_\}/enableBackdrops\:function\(\)\{return P\}/' 10 | 11 | -------------------------------------------------------------------------------- /shell-scripts/jellyfin-delete-transcodetmp.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Travis Runyard 4 | # 05-05-2020 5 | # Compatibility: jellyfin-independant 6 | # Example usage running every 5 minutes in crontab: 7 | # */5 * * * * /path/jellyfin-delete-transcodetmp.sh 8 | 9 | # enter your jellyfin transcoding directory 10 | TCODETMP='/usr/local/jellyfin/config/transcodes' 11 | 12 | #isMounted () { findmnt -rn "$TCODETMP" > /dev/null 2>&1; } 13 | 14 | FREE=$(df -k --output=avail "$TCODETMP" | tail -n1) 15 | 16 | if [[ $FREE -lt 5242880 ]]; then 17 | # Free space less than 5 GiB 18 | rm -rf "$TCODETMP/"* > /dev/null 2>&1 19 | else 20 | # Delete older than 240 minutes 21 | find "$TCODETMP" -type f -mmin +240 -delete 2>&1 22 | fi 23 | 24 | -------------------------------------------------------------------------------- /shell-scripts/jellyfin-healthcheck.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Enter URI to your Jellyfin health service 4 | # Typically this is http:///health 5 | HEALTHURL='http://localhost:8096/health' 6 | 7 | ##### METHOD 1 ##### 8 | if [[ $(curl -s "$HEALTHURL") != "Healthy" ]] 9 | then 10 | echo "Not Healthy" 11 | else 12 | echo "Healthy" 13 | fi 14 | 15 | #### METHOD 2 ##### 16 | if [ $(curl -s -o /dev/null -w "%{http_code}" "$HEALTHURL") -ne 200 ] 17 | then 18 | echo "Not Healthy" 19 | else 20 | echo "Healthy" 21 | fi 22 | 23 | #### METHOD 3 ##### 24 | if [ $(curl -sI "$HEALTHURL" | head -n 1 | cut -d ' ' -f 2) -ne 200 ] 25 | then 26 | echo "Not Healthy" 27 | else 28 | echo "Healthy" 29 | fi -------------------------------------------------------------------------------- /shell-scripts/jellyfin-set-title_10.8.x.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # compatibility: jellyfin 10.8.x 4 | 5 | # customize website title 6 | NEWTITLE=NewSiteTitle 7 | sed -i "s/document.title=\"Jellyfin\"/document.title=\"$NEWTITLE\"/" main.jellyfin.bundle.js 8 | sed -i "s/document.title=e||\"Jellyfin\"}/document.title=e||\"$NEWTITLE\"}/" main.jellyfin.bundle.js 9 | sed -i "s/Jellyfin/<title>$NEWTITLE/" index.html 10 | -------------------------------------------------------------------------------- /shell-scripts/jellyfin-set-title_10.9.x.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # compatibility: jellyfin 10.9.x 4 | 5 | # customize website title 6 | NEWTITLE=NewSiteTitle 7 | sed -i "s/document.title=\"Jellyfin\"/document.title=\"$NEWTITLE\"/" 73233.bce0f70761dae6c47906.chunk.js 8 | sed -i "s/document.title=e||\"Jellyfin\"}/document.title=e||\"$NEWTITLE\"}/" 73233.bce0f70761dae6c47906.chunk.js 9 | sed -i "s/<title>Jellyfin/<title>$NEWTITLE/" index.html 10 | -------------------------------------------------------------------------------- /shell-scripts/move-subs-up-one-dir.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # this helps to move subtitle files out of their respective subtitle directory up one level to its movie directory if your structure is like this: 4 | 5 | #/mnt/path/to/video-movies 6 | #├── Movie 7 | #│ └── Subs 8 | 9 | # this can be ran multiple times to 'walk' the subs up one directory at a time 10 | # via adjusting the mindepth and maxdepth paramters 11 | 12 | find /mnt/path/to/video-movies -depth -mindepth 3 -maxdepth 4 -type f \ 13 | -ipath '*/sub*' \( -iname '*.srt' -o -iname '*.sub' -o -iname '*.idx' \) \ 14 | -execdir mv -v "{}" ./.. \; 15 | 16 | -------------------------------------------------------------------------------- /shell-scripts/rclone/rclone-flush-cache.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env sh 2 | 3 | # example #1 4 | kill -SIGHUP $(pgrep -f 'rclone mount rclone_mount1') 5 | 6 | # exmaple #2 7 | kill -SIGHUP $(ps aux | grep 'rclone mount rclone_mount1' | grep -v 'grep' |awk '{ print $2 }') 8 | 9 | # example #3 10 | kill -SIGHUP $(pidof 'rclone') 11 | 12 | -------------------------------------------------------------------------------- /shell-scripts/rclone/rclone-http-serve.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | screen -dmS rclone-serve-http rclone serve http /path/to/local/media --addr :8081 --read-only --user Username --pass Password 3 | -------------------------------------------------------------------------------- /shell-scripts/rclone/rclone-sync.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # RClone Config file 3 | RCLONE_CONFIG=/root/.config/rclone/rclone.conf 4 | SCREEN_NAME=$(basename "$0" | cut -d '.' -f 1) 5 | BANDWIDTH=${1:-4} 6 | 7 | export BANDWIDTH 8 | export RCLONE_CONFIG 9 | export SCREEN_NAME 10 | 11 | curl -fsS --retry 3 https://hc-ping.com/Insert_ID /dev/null || wget https://hc-ping.com/Insert_ID -O /dev/null 12 | 13 | #exit if running 14 | if ! [[ $(screen -S "$SCREEN_NAME" -Q select .) ]]; then 15 | echo "$SCREEN_NAME is running, exiting..." 16 | exit 1 17 | fi 18 | 19 | #if [[ $(pidof -x "$0" | wc -w) -gt 2 ]]; then 20 | # echo "$0 already running" 21 | # exit 22 | #fi 23 | 24 | usage() 25 | { 26 | echo "usage: rclone-sync-video.sh [-b | --bandwidth specify bandwidth as an integer | -h | --help shows this message]" 27 | } 28 | 29 | while [ "$1" != "" ]; do 30 | case $1 in 31 | -b | --bandwidth ) shift 32 | BANDWIDTH=$1 33 | export BANDWIDTH 34 | ;; 35 | -h | --help ) usage 36 | exit 0 37 | ;; 38 | * ) usage 39 | exit 1 40 | esac 41 | shift 42 | done 43 | 44 | screen -dmS $SCREEN_NAME -L -Logfile $HOME/.config/rclone/log/filename.log \ 45 | bash -c "rclone sync --bwlimit "$BANDWIDTH"M --progress --checksum --transfers 8 \ 46 | --checkers 8 --tpslimit 8 --tpslimit-burst 8 --update --filter-from \ 47 | $HOME/.config/rclone/filter-file-video.txt --drive-acknowledge-abuse --drive-use-trash=true \ 48 | --log-level INFO --delete-during --log-file $HOME/.config/rclone/log/upload-filename.log \ 49 | /path/to/local/media rclone-remote1:dir1/dir2" 50 | 51 | screen -S $SCREEN_NAME -X colon "logfile flush 0^M" 52 | -------------------------------------------------------------------------------- /shell-scripts/subtitle-cleaner.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # compatibility: jellyfin-independent 4 | 5 | # The command below looks for all srt subtitles in the current direcory non-recursively. 6 | # Remove maxdepth param if you require recursive subdirectory search. 7 | # The multiple matching strings in sed is the advertisement junk sometimes hidden within 8 | # downloaded subtitle files from places such as opensubtitles.org. 9 | # The sed action {d;} means delete. 10 | 11 | # one-liner 12 | find . -maxdepth 1 -name '*.srt' -type f -exec sed -E -i "/WWW.MY-SUBS.CO|Someone needs to stop Clearway Law|Public shouldn't leave reviews for lawyers|Captioned by|SoundwritersTM|Captioning made possible by|COMEDY CENTRAL|Advertise your product|OpenSubtitles|osdb|Support DB.com|Subtitles|YIFY|yifysubtitles|Created by|Encoded by|explosiveskull|twitter.com|Watch Movies, TV Series|Bluray sync|Ripped By mstoll|www.admitme.app|www.OpenSubtitles.org|Support us and become VIP member|Help other users to choose the best subtitles|Sync and corrections by|MemoryOnSmells|www.addic7ed.com|Please rate this subtitle|www.osdb.link|The best subtitles|Synced and corrected by|.srt Extracted|Dan4Jem|AD.MMXVI.XII|n17t01|Who are the real-world Illuminati|saveanilluminati.com|Resync|WEB-DL|Norther|Resync for WEB-DL by Norther|Media Access Group at WGBH|access.wgbh.org|Captioning sponsored by|CBS PARAMOUNT NETWORK|CBS\/Paramount Network|CBS PARAMOUNT|NETWORK TELEVISION|10% OFF 4KVOD.TV USE PROMOCODE: OPENSUB|WATCH LIVE TV,MOVIES,SHOWS IN ONE PLACE/{d;}" '{}' \+ 13 | 14 | # multi-liner: 15 | find . -maxdepth 1 -name '*.srt' -type f -exec sed -E -i \ 16 | "/WWW.MY-SUBS.CO|Someone needs to stop Clearway Law|Public \ 17 | shouldn't leave reviews for lawyers|Captioned by|Soundwriters\ 18 | TM|Captioning made possible by|COMEDY CENTRAL|Advertise your \ 19 | product|OpenSubtitles|osdb|Support DB.com|Subtitles|YIFY|yifysu\ 20 | btitles|Created by|Encoded by|explosiveskull|twitter.com|Watch \ 21 | Movies, TV Series|Bluray sync|Ripped By mstoll|www.admitme.app|\ 22 | www.OpenSubtitles.org|Support us and become VIP member|Help other\ 23 | users to choose the best subtitles|Sync and corrections by|Memo\ 24 | ryOnSmells|www.addic7ed.com|Please rate this subtitle|www.osdb.l\ 25 | ink|The best subtitles|Synced and corrected by|.srt Extracted|Da\ 26 | n4Jem|AD.MMXVI.XII|n17t01|Who are the real-world Illuminati|save\ 27 | anilluminati.com|Resync|WEB-DL|Norther|Resync for WEB-DL by Nort\ 28 | her|Media Access Group at WGBH|access.wgbh.org|Captioning sponso\ 29 | red by|CBS PARAMOUNT NETWORK|CBS\/Paramount Network|CBS PARAMOUN\ 30 | T|NETWORK TELEVISION|10% OFF 4KVOD.TV USE PROMOCODE: OPENSUB|WAT\ 31 | CH LIVE TV,MOVIES,SHOWS IN ONE PLACE/{d;}" '{}' \+ 32 | -------------------------------------------------------------------------------- /shell-scripts/testing/filename.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | me=$(basename "$0") 3 | echo $me 4 | echo $(basename "$0") | cut -d '.' -f 1 5 | -------------------------------------------------------------------------------- /shell-scripts/testing/getopts.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | optspec=":hv-:" 3 | while getopts "$optspec" optchar; do 4 | case "${optchar}" in 5 | -) 6 | case "${OPTARG}" in 7 | loglevel) 8 | val="${!OPTIND}"; OPTIND=$(( $OPTIND + 1 )) 9 | echo "Parsing option: '--${OPTARG}', value: '${val}'" >&2; 10 | ;; 11 | loglevel=*) 12 | val=${OPTARG#*=} 13 | opt=${OPTARG%=$val} 14 | echo "Parsing option: '--${opt}', value: '${val}'" >&2 15 | ;; 16 | *) 17 | if [ "$OPTERR" = 1 ] && [ "${optspec:0:1}" != ":" ]; then 18 | echo "Unknown option --${OPTARG}" >&2 19 | fi 20 | ;; 21 | esac;; 22 | h) 23 | echo "usage: $0 [-v] [--loglevel[=]<value>]" >&2 24 | exit 2 25 | ;; 26 | v) 27 | echo "Parsing option: '-${optchar}'" >&2 28 | ;; 29 | *) 30 | if [ "$OPTERR" != 1 ] || [ "${optspec:0:1}" = ":" ]; then 31 | echo "Non-option argument: '-${OPTARG}'" >&2 32 | fi 33 | ;; 34 | esac 35 | done -------------------------------------------------------------------------------- /shell-scripts/testing/getopts2.sh: -------------------------------------------------------------------------------- 1 | # Parse command-line options 2 | 3 | # Option strings 4 | SHORT=d:w 5 | LONG=directory:,workdir 6 | 7 | # read the options 8 | OPTS=$(getopt --options $SHORT --long $LONG --name "$0" -- "$@") 9 | 10 | if [ $? != 0 ] ; then echo "Failed to parse options...exiting." >&2 ; exit 1 ; fi 11 | 12 | eval set -- "$OPTS" 13 | 14 | # set initial values 15 | TEMPDIR='/mnt/pool0/p0ds0smb/temp/ffmpeg' 16 | WORKDIR="$TEMPDIR/working" 17 | 18 | # extract options and their arguments into variables. 19 | while true ; do 20 | case "$1" in 21 | -d | --directory ) 22 | TEMPDIR="$2" 23 | shift 24 | ;; 25 | -w | --workdir ) 26 | WORKDIR="$2" 27 | shift 2 28 | ;; 29 | -- ) 30 | shift 31 | break 32 | ;; 33 | *) 34 | echo "Internal error!" 35 | exit 1 36 | ;; 37 | esac 38 | done 39 | 40 | # Print the variables 41 | echo "TEMPDIR = $TEMPDIR" 42 | echo "WORKDIR = $WORKDIR" -------------------------------------------------------------------------------- /shell-scripts/testing/pidof.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | pidof -x "$(basename $0)" >/dev/null 2>&1 3 | if [[ $? == 0 ]]; then 4 | echo "$(basename $0) is already running" 5 | exit 1 6 | else 7 | echo "$(basename $0) is not running" 8 | fi 9 | 10 | #Or 11 | 12 | if [[ "`pidof -x $(basename $0) -o %PPID`" ]]; then exit; fi 13 | -------------------------------------------------------------------------------- /shell-scripts/testing/screen_check.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | SCREEN_NAME=$(basename "$0") 3 | #exit if running 4 | screen_check () { 5 | if ! [[ $(screen -S "$SCREEN_NAME" -Q select .) ]]; then 6 | echo "screen is running, exiting..." 7 | echo "variable SCREEN_NAME = $SCREEN_NAME" 8 | exit 9 | fi 10 | } 11 | screen_check 12 | -------------------------------------------------------------------------------- /shell-scripts/testing/shift.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | echo "You start with $# positional parameters" 4 | 5 | # Loop until all parameters are used up 6 | while [ "$1" != "" ]; do 7 | echo "Parameter 1 equals $1" 8 | echo "You now have $# positional parameters" 9 | 10 | # Shift all the parameters down by one 11 | shift 12 | 13 | done 14 | --------------------------------------------------------------------------------