mirror of
https://github.com/FakeTV/pseudo-channel.git
synced 2025-12-06 00:13:38 +00:00
Directory Revamp
Before making changes to the update-channels-from-git.sh file, I wanted to have everything stored in such a way that it made logical sense where it went. Anything that goes to the root folder is in "main-dir", channel specific files are in "channel-dir", and the files for both sections are in "both-dir". These directories will eventually be referenced in the new version of "update-channels-from-git.sh".
This commit is contained in:
0
generate_daily_sched.sh → channel-dir/generate_daily_sched.sh
Executable file → Normal file
0
generate_daily_sched.sh → channel-dir/generate_daily_sched.sh
Executable file → Normal file
@@ -1,29 +1,29 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
Created on Thu Jun 28 22:59:57 2018
|
Created on Thu Jun 28 22:59:57 2018
|
||||||
|
|
||||||
@author: Matt
|
@author: Matt
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from pseudo_config import plexLibraries as local_commercials
|
from pseudo_config import plexLibraries as local_commercials
|
||||||
|
|
||||||
commercials = local_commercials["Commercials"]
|
commercials = local_commercials["Commercials"]
|
||||||
movies = local_commercials["Movies"]
|
movies = local_commercials["Movies"]
|
||||||
tvs = local_commercials["TV Shows"]
|
tvs = local_commercials["TV Shows"]
|
||||||
|
|
||||||
commercials_file = open('Commercial_Libraries.txt','w')
|
commercials_file = open('Commercial_Libraries.txt','w')
|
||||||
movies_file = open('Movie_Libraries.txt','w')
|
movies_file = open('Movie_Libraries.txt','w')
|
||||||
tvs_file = open('TV_Libraries.txt','w')
|
tvs_file = open('TV_Libraries.txt','w')
|
||||||
for commercial in commercials:
|
for commercial in commercials:
|
||||||
commercials_file.write(commercial + '\n')
|
commercials_file.write(commercial + '\n')
|
||||||
for movie in movies:
|
for movie in movies:
|
||||||
movies_file.write(movie + '\n')
|
movies_file.write(movie + '\n')
|
||||||
for tv in tvs:
|
for tv in tvs:
|
||||||
tvs_file.write(tv + '\n')
|
tvs_file.write(tv + '\n')
|
||||||
|
|
||||||
commercials_file.close()
|
commercials_file.close()
|
||||||
movies_file.close()
|
movies_file.close()
|
||||||
tvs_file.close()
|
tvs_file.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
0
startstop.sh → channel-dir/startstop.sh
Executable file → Normal file
0
startstop.sh → channel-dir/startstop.sh
Executable file → Normal file
@@ -1,26 +1,26 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
Created on Tue Jun 26 23:31:00 2018
|
Created on Tue Jun 26 23:31:00 2018
|
||||||
|
|
||||||
@author: Matt
|
@author: Matt
|
||||||
"""
|
"""
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
def atoi(text):
|
def atoi(text):
|
||||||
return int(text) if text.isdigit() else text
|
return int(text) if text.isdigit() else text
|
||||||
|
|
||||||
def natural_keys(text):
|
def natural_keys(text):
|
||||||
'''
|
'''
|
||||||
alist.sort(key=natural_keys) sorts in human order
|
alist.sort(key=natural_keys) sorts in human order
|
||||||
http://nedbatchelder.com/blog/200712/human_sorting.html
|
http://nedbatchelder.com/blog/200712/human_sorting.html
|
||||||
(See Toothy's implementation in the comments)
|
(See Toothy's implementation in the comments)
|
||||||
'''
|
'''
|
||||||
return [ atoi(c) for c in re.split('(\d+)', text) ]
|
return [ atoi(c) for c in re.split('(\d+)', text) ]
|
||||||
|
|
||||||
temp_hold = list(sys.argv[1:])
|
temp_hold = list(sys.argv[1:])
|
||||||
temp_hold.sort(key=natural_keys)
|
temp_hold.sort(key=natural_keys)
|
||||||
file = open('Channels_Sorted.txt','w')
|
file = open('Channels_Sorted.txt','w')
|
||||||
for item in temp_hold:
|
for item in temp_hold:
|
||||||
file.write(item + '\n')
|
file.write(item + '\n')
|
||||||
file.close()
|
file.close()
|
||||||
@@ -1,107 +1,107 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
Created on Thu Jun 28 17:33:59 2018
|
Created on Thu Jun 28 17:33:59 2018
|
||||||
|
|
||||||
@author: Matt
|
@author: Matt
|
||||||
"""
|
"""
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import os
|
import os
|
||||||
from shutil import copy2
|
from shutil import copy2
|
||||||
from pseudo_config import plexLibraries as global_commercials
|
from pseudo_config import plexLibraries as global_commercials
|
||||||
|
|
||||||
channel_dir_increment_symbol = "_"
|
channel_dir_increment_symbol = "_"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Step ONE: Global database update
|
# Step ONE: Global database update
|
||||||
print("+++++ Doing global update from PLEX")
|
print("+++++ Doing global update from PLEX")
|
||||||
os.system('sudo python PseudoChannel.py -u')
|
os.system('sudo python PseudoChannel.py -u')
|
||||||
|
|
||||||
|
|
||||||
base_dirA = os.path.dirname(os.path.abspath(__file__))
|
base_dirA = os.path.dirname(os.path.abspath(__file__))
|
||||||
locations = "pseudo-channel"+channel_dir_increment_symbol
|
locations = "pseudo-channel"+channel_dir_increment_symbol
|
||||||
channel_dirs = [ item for item in os.listdir('.') if os.path.isdir(os.path.join('.', item)) ]
|
channel_dirs = [ item for item in os.listdir('.') if os.path.isdir(os.path.join('.', item)) ]
|
||||||
channel_dirs = list(filter(lambda x: x.startswith(locations),channel_dirs))
|
channel_dirs = list(filter(lambda x: x.startswith(locations),channel_dirs))
|
||||||
|
|
||||||
for channel_dir in channel_dirs:
|
for channel_dir in channel_dirs:
|
||||||
# Step TWO: Go to each folder, export the following information
|
# Step TWO: Go to each folder, export the following information
|
||||||
# - Show title, lastEpisodeTitle
|
# - Show title, lastEpisodeTitle
|
||||||
# - Movie title, lastPlayedDate
|
# - Movie title, lastPlayedDate
|
||||||
os.chdir(channel_dir)
|
os.chdir(channel_dir)
|
||||||
|
|
||||||
channel_dirA = os.path.dirname(os.path.abspath(__file__))
|
channel_dirA = os.path.dirname(os.path.abspath(__file__))
|
||||||
db_path = os.path.join(channel_dirA, "pseudo-channel.db")
|
db_path = os.path.join(channel_dirA, "pseudo-channel.db")
|
||||||
print("+++++ Importing from " + db_path)
|
print("+++++ Importing from " + db_path)
|
||||||
try:
|
try:
|
||||||
conn = sqlite3.connect(db_path)
|
conn = sqlite3.connect(db_path)
|
||||||
table = conn.cursor()
|
table = conn.cursor()
|
||||||
|
|
||||||
|
|
||||||
lastEpisode_export = table.execute('SELECT lastEpisodeTitle,title FROM shows').fetchall()
|
lastEpisode_export = table.execute('SELECT lastEpisodeTitle,title FROM shows').fetchall()
|
||||||
lastEpisode_export = list(lastEpisode_export)
|
lastEpisode_export = list(lastEpisode_export)
|
||||||
lastMovie_export = table.execute('SELECT lastPlayedDate,title FROM movies').fetchall()
|
lastMovie_export = table.execute('SELECT lastPlayedDate,title FROM movies').fetchall()
|
||||||
lastMovie_export = list(lastMovie_export)
|
lastMovie_export = list(lastMovie_export)
|
||||||
|
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
except:
|
except:
|
||||||
print("+++++ Database experiencing errors or hasn't been formed yet; creating fresh one")
|
print("+++++ Database experiencing errors or hasn't been formed yet; creating fresh one")
|
||||||
lastEpisode_export = []
|
lastEpisode_export = []
|
||||||
lastMovie_export = []
|
lastMovie_export = []
|
||||||
|
|
||||||
|
|
||||||
# Step THREE: Delete the previous database, replace with the recently created global one
|
# Step THREE: Delete the previous database, replace with the recently created global one
|
||||||
print("+++++ Copying global update to " + db_path)
|
print("+++++ Copying global update to " + db_path)
|
||||||
copy2('../pseudo-channel.db','.')
|
copy2('../pseudo-channel.db','.')
|
||||||
|
|
||||||
|
|
||||||
# Step FOUR: Import the previous information we exported previously
|
# Step FOUR: Import the previous information we exported previously
|
||||||
print("+++++ Exporting to " + db_path)
|
print("+++++ Exporting to " + db_path)
|
||||||
conn = sqlite3.connect(db_path)
|
conn = sqlite3.connect(db_path)
|
||||||
table = conn.cursor()
|
table = conn.cursor()
|
||||||
|
|
||||||
for i in range(0,len(lastEpisode_export)):
|
for i in range(0,len(lastEpisode_export)):
|
||||||
sql = "UPDATE shows SET lastEpisodeTitle=? WHERE title=?"
|
sql = "UPDATE shows SET lastEpisodeTitle=? WHERE title=?"
|
||||||
table.execute(sql,lastEpisode_export[i])
|
table.execute(sql,lastEpisode_export[i])
|
||||||
|
|
||||||
for i in range(0,len(lastMovie_export)):
|
for i in range(0,len(lastMovie_export)):
|
||||||
sql = "UPDATE movies SET lastPlayedDate=? WHERE title=?"
|
sql = "UPDATE movies SET lastPlayedDate=? WHERE title=?"
|
||||||
table.execute(sql,lastMovie_export[i])
|
table.execute(sql,lastMovie_export[i])
|
||||||
|
|
||||||
# Step FIVE: Remove any media not in the directories set of commerical archives
|
# Step FIVE: Remove any media not in the directories set of commerical archives
|
||||||
print("+++++ Trimming database at " + db_path)
|
print("+++++ Trimming database at " + db_path)
|
||||||
os.system('sudo python report_MediaFolders.py')
|
os.system('sudo python report_MediaFolders.py')
|
||||||
local_commercials = open('Commercial_Libraries.txt').read().splitlines()
|
local_commercials = open('Commercial_Libraries.txt').read().splitlines()
|
||||||
local_movies = open('Movie_Libraries.txt').read().splitlines()
|
local_movies = open('Movie_Libraries.txt').read().splitlines()
|
||||||
local_tvs = open('TV_Libraries.txt').read().splitlines()
|
local_tvs = open('TV_Libraries.txt').read().splitlines()
|
||||||
|
|
||||||
commercial_removal = [x for x in global_commercials["Commercials"] if x not in local_commercials]
|
commercial_removal = [x for x in global_commercials["Commercials"] if x not in local_commercials]
|
||||||
movie_removal = [x for x in global_commercials["Movies"] if x not in local_movies]
|
movie_removal = [x for x in global_commercials["Movies"] if x not in local_movies]
|
||||||
tv_removal = [x for x in global_commercials["TV Shows"] if x not in local_tvs]
|
tv_removal = [x for x in global_commercials["TV Shows"] if x not in local_tvs]
|
||||||
|
|
||||||
# print(db_path)
|
# print(db_path)
|
||||||
# print(local_commercials)
|
# print(local_commercials)
|
||||||
# print(global_commercials["Commercials"])
|
# print(global_commercials["Commercials"])
|
||||||
# print(commercial_removal)
|
# print(commercial_removal)
|
||||||
|
|
||||||
for commercial in commercial_removal:
|
for commercial in commercial_removal:
|
||||||
sql = "DELETE FROM commercials WHERE customSectionName=?"
|
sql = "DELETE FROM commercials WHERE customSectionName=?"
|
||||||
table.execute(sql,(commercial,))
|
table.execute(sql,(commercial,))
|
||||||
for movie in movie_removal:
|
for movie in movie_removal:
|
||||||
sql = "DELETE FROM movies WHERE customSectionName=?"
|
sql = "DELETE FROM movies WHERE customSectionName=?"
|
||||||
table.execute(sql,(movie,))
|
table.execute(sql,(movie,))
|
||||||
for tv in tv_removal:
|
for tv in tv_removal:
|
||||||
sql = "DELETE FROM shows WHERE customSectionName=?"
|
sql = "DELETE FROM shows WHERE customSectionName=?"
|
||||||
table.execute(sql,(tv,))
|
table.execute(sql,(tv,))
|
||||||
sql = "DELETE FROM episodes WHERE customSectionName=?"
|
sql = "DELETE FROM episodes WHERE customSectionName=?"
|
||||||
table.execute(sql,(tv,))
|
table.execute(sql,(tv,))
|
||||||
|
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
os.chdir('..')
|
os.chdir('..')
|
||||||
|
|
||||||
print("+++++ " + db_path + " complete! Going to next file")
|
print("+++++ " + db_path + " complete! Going to next file")
|
||||||
|
|
||||||
|
|
||||||
print("+++++ Global update COMPLETE")
|
print("+++++ Global update COMPLETE")
|
||||||
0
multi-channel-bash-scripts/channeldown.sh → main-dir/channeldown.sh
Executable file → Normal file
0
multi-channel-bash-scripts/channeldown.sh → main-dir/channeldown.sh
Executable file → Normal file
0
multi-channel-bash-scripts/channelup.sh → main-dir/channelup.sh
Executable file → Normal file
0
multi-channel-bash-scripts/channelup.sh → main-dir/channelup.sh
Executable file → Normal file
0
multi-channel-bash-scripts/generate-channels-daily-schedules.sh → main-dir/generate-channels-daily-schedules.sh
Executable file → Normal file
0
multi-channel-bash-scripts/generate-channels-daily-schedules.sh → main-dir/generate-channels-daily-schedules.sh
Executable file → Normal file
0
multi-channel-bash-scripts/manual.sh → main-dir/manual.sh
Executable file → Normal file
0
multi-channel-bash-scripts/manual.sh → main-dir/manual.sh
Executable file → Normal file
0
multi-channel-bash-scripts/stop-all-channels.sh → main-dir/stop-all-channels.sh
Executable file → Normal file
0
multi-channel-bash-scripts/stop-all-channels.sh → main-dir/stop-all-channels.sh
Executable file → Normal file
0
multi-channel-bash-scripts/updatechannels.sh → main-dir/updatechannels.sh
Executable file → Normal file
0
multi-channel-bash-scripts/updatechannels.sh → main-dir/updatechannels.sh
Executable file → Normal file
109
pseudo_config.py
109
pseudo_config.py
@@ -1,109 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
"""
|
|
||||||
1) Create a file outside of this proj dir called "plex_token.py":
|
|
||||||
|
|
||||||
touch ../plex_token.py
|
|
||||||
|
|
||||||
2) add these lines to the newly created file:
|
|
||||||
|
|
||||||
baseurl = 'the url to your server'
|
|
||||||
token = 'your plex token'
|
|
||||||
|
|
||||||
3) Edit the "basurl" variable below to point to your Plex server
|
|
||||||
|
|
||||||
4) Edit the "plexClients" variable to include the name of your plex client(s) this app will control.
|
|
||||||
|
|
||||||
5) Edit the "plexLibraries" variable to remap your specific library names to the app specific names.
|
|
||||||
...for instance, if your Plex "Movies" are located in your Plex library as "Films", update that
|
|
||||||
line so it looks like:
|
|
||||||
|
|
||||||
"Movies" : ["Films"],
|
|
||||||
|
|
||||||
6) *Skip this feature for now*
|
|
||||||
|
|
||||||
For Google Calendar integration add your "gkey" to the "plex_token.py" file
|
|
||||||
...(https://docs.simplecalendar.io/find-google-calendar-id/):
|
|
||||||
|
|
||||||
gkey = "the key"
|
|
||||||
|
|
||||||
7) If using the Google Calendar integration exclusively, set this to true below:
|
|
||||||
|
|
||||||
useGoogleCalendar
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
'''
|
|
||||||
*
|
|
||||||
* List of plex clients to use (add multiple clients to control multiple TV's)
|
|
||||||
*
|
|
||||||
'''
|
|
||||||
plexClients = ['RasPlex']
|
|
||||||
|
|
||||||
plexLibraries = {
|
|
||||||
"TV Shows" : ["TV"],
|
|
||||||
"Movies" : ["Films"],
|
|
||||||
"Commercials" : ["Commercials", "Smashing Pumpkins - Videos"],
|
|
||||||
}
|
|
||||||
|
|
||||||
useCommercialInjection = True
|
|
||||||
|
|
||||||
"""How many seconds to pad commercials between each other / other media"""
|
|
||||||
commercialPadding = 5
|
|
||||||
|
|
||||||
"""
|
|
||||||
Specify the path to this controller on the network (i.e. 'http://192.168.1.28' - no trailing slash).
|
|
||||||
Also specify the desired port to run the simple http webserver. The daily generated
|
|
||||||
schedule will be served at "http://<your-ip>:<your-port>/" (i.e. "http://192.168.1.28:8000/").
|
|
||||||
|
|
||||||
You can also leave the below controllerServerPath empty if you'd like to run your own webserver.
|
|
||||||
"""
|
|
||||||
controllerServerPath = "http://192.168.1.28"
|
|
||||||
controllerServerPort = "8000"
|
|
||||||
|
|
||||||
"""
|
|
||||||
This variable sets the title for the PseudoChannel.py html page.
|
|
||||||
"""
|
|
||||||
htmlPseudoTitle = "Daily PseudoChannel"
|
|
||||||
|
|
||||||
"""
|
|
||||||
When the schedule updates every 24 hours, it's possible that it will interrupt any shows / movies that were
|
|
||||||
playing from the previous day. To fix this, the app saves a "cached" schedule from the previous day to
|
|
||||||
override any media that is trying to play while the previous day is finishing.
|
|
||||||
"""
|
|
||||||
useDailyOverlapCache = False
|
|
||||||
|
|
||||||
dailyUpdateTime = "12:01 AM"
|
|
||||||
|
|
||||||
"""When to delete / remake the pseudo-channel.log - right at midnight, (i.e. 'friday') """
|
|
||||||
rotateLog = "friday"
|
|
||||||
|
|
||||||
"""Debug mode will give you more output in your terminal to help problem solve issues."""
|
|
||||||
debug_mode = True
|
|
||||||
|
|
||||||
"""This squeezes in one last commercial to fill up the empty gaps even if the last commercial gets cutoff
|
|
||||||
Set this to false if you don't want your commercials to get cutoff/don't mind the gap.
|
|
||||||
"""
|
|
||||||
useDirtyGapFix = False
|
|
||||||
|
|
||||||
"""
|
|
||||||
##### Do not edit below this line---------------------------------------------------------------
|
|
||||||
|
|
||||||
Below is logic to grab your Plex 'token' & Plex 'baseurl'. If you are following along and have created a 'plex_token.py'
|
|
||||||
file as instructed, you do not need to edit below this line.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os, sys
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
||||||
# import ../plex_token.py
|
|
||||||
|
|
||||||
try:
|
|
||||||
import plex_token as plex_token
|
|
||||||
except ImportError as e:
|
|
||||||
print "+++++ Cannot find plex_token file. Make sure you create a plex_token.py file with the appropriate data."
|
|
||||||
raise e
|
|
||||||
|
|
||||||
baseurl = plex_token.baseurl
|
|
||||||
token = plex_token.token
|
|
||||||
gkey = '' #plex_token.gkey
|
|
||||||
@@ -1,528 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!-- Welcome to PseudoChannel!
|
|
||||||
|
|
||||||
This will be the most difficult part in the process of setting up your PseudoChannel (but it is not hard,
|
|
||||||
just be sure to read this and you will be set).
|
|
||||||
|
|
||||||
There are a few things to keep in mind when setting up this XML.
|
|
||||||
|
|
||||||
1) What exactly is this file for?
|
|
||||||
|
|
||||||
The whole idea behind "PseudoChannel.py" is to create your own channel(s) to mimick real TV,
|
|
||||||
using your own "TV Shows", "Movies" and "Commercials". You are not supposed to intervene too often,
|
|
||||||
rather you are supposed to set it up (here) and just let it go as it advances in series episodes, playing
|
|
||||||
commercials to fill up gaps between scheduled content and playing movies where specified. That being said,
|
|
||||||
this particular file is where you map out what your channel looks like. I have my own schedule
|
|
||||||
below so you can reference it when building your own channel.
|
|
||||||
|
|
||||||
2) How do I make sense of these '<time></time>' blocks / '<weekdays></weekdays' blocks?
|
|
||||||
|
|
||||||
Since the whole concept of the channel is to have repeating blocks of content that changes throughout the
|
|
||||||
week depending on the day / time of day (like a real channel) you specify your "TV Shows" and "Movies" schedule
|
|
||||||
by adding a '<time></time>' block within the part of the week you want it to be scheduled for. For instance,
|
|
||||||
below I have "Looney Tunes" scheduled to play "everyday" starting at "6:00 AM", whereas I have "Garfield & Friends"
|
|
||||||
playing only on "weekday" mornings scheduled for after Looney Tunes starting at "8:00 AM". Also notice that
|
|
||||||
"Garfield & Friends" below is actually written as, "Garfield & Friends". This is especially important
|
|
||||||
to those new to editing XML. In XML, "UTF-8", you are forbidden from using certain characters like the and
|
|
||||||
character. It is important to encode your titles to XML friendly text (this is also important for non-english characters).
|
|
||||||
You can convert titles that have forbidden characters by using this online too: http://coderstoolbox.net/string/#!encoding=xml&action=encode&charset=us_ascii
|
|
||||||
|
|
||||||
3) Setting the available parameters: "title=", "type=", "strict-time=", "time-shift=", "xtra="
|
|
||||||
|
|
||||||
There are two required parameters: "title" and "type". The "title" value should be either the title of your series
|
|
||||||
(i.e. "Friends") or if you are scheduling a movie it should only be set to, "random". The "type" parameter should be set
|
|
||||||
to either "series" or "movie". The attribute "strict-time" can either be "true" or "false" and refers to
|
|
||||||
whether or not the particular "<time>" block will be scheduled for the exact time you specify or if it will
|
|
||||||
shift around to fill up gaps. This is useful as sometimes episodes are as short as 5 minutes (cartoons) while
|
|
||||||
other episodes that are normally ~25 minutes are an hour or so long. Setting "strict-time" to "false" will
|
|
||||||
tell the app to shift that time block closer to the previous episode. The corresponding, "time-shift" attribute
|
|
||||||
tells the app how to shift the item. Its value can be "1" or more and will help the scheduler determine when to schedule the
|
|
||||||
shifting time according to that value. So for instance, if you'd like no gaps between your content, then you want
|
|
||||||
to set "strict-time='false'" and "time-shift='1'". However if you want your content to shift but would rather
|
|
||||||
it 'hook' on to a pretty time, like "2:45 PM" versus "2:41 PM" then you would set "time-shift" to a value like "5".
|
|
||||||
This will shift content around and schedule it within 5 minutes of the previous item but hook it on to the
|
|
||||||
nearest multiple of "5". You could use "15" or "30" too for even prettier times. Experiment.
|
|
||||||
|
|
||||||
4) Movies. How do I schedule "Billy Madison" to play on Saturday afternoon?
|
|
||||||
|
|
||||||
Well, since the app is supposed to work like a real TV Channel, you aren't supposed to have that kind of
|
|
||||||
control. If you want to watch "Billy Madison" then why not just turn on your Plex TV app and play it? Instead
|
|
||||||
here you want to always use "random" tor the "title=" value of movie content. But let's say you have a ton of Adam Sandler
|
|
||||||
movies and want to schedule a "random" Adam Sandler movie on Saturday afternoon? That makes more sense, that way
|
|
||||||
you aren't playing the same movie every Saturday afternoon! For movies specifically, you have a new
|
|
||||||
attribute called "xtra". There you can add various parameters to narrow in on the random movie type you
|
|
||||||
want scheduled every Saturday afternoon. So if for some reason you are set on playing an Adam Sandler comedy
|
|
||||||
every Saturday, then you might have a <time> block that looks like this:
|
|
||||||
|
|
||||||
<time title="random" type="movie" strict-time="true" xtra='actor:adam sandler genre:comedy contentRating:PG'>12:45 PM</time>
|
|
||||||
|
|
||||||
The available "xtra" paramters are as follows (http://python-plexapi.readthedocs.io/en/latest/_modules/plexapi/library.html#LibrarySection.search):
|
|
||||||
|
|
||||||
* unwatched: Display or hide unwatched content (True, False). [all]
|
|
||||||
* duplicate: Display or hide duplicate items (True, False). [movie]
|
|
||||||
* actor: List of actors to search ([actor_or_id, ...]). [movie]
|
|
||||||
* collection: List of collections to search within ([collection_or_id, ...]). [all]
|
|
||||||
* contentRating: List of content ratings to search within ([rating_or_key, ...]). [movie]
|
|
||||||
* country: List of countries to search within ([country_or_key, ...]). [movie,music]
|
|
||||||
* decade: List of decades to search within ([yyy0, ...]). [movie]
|
|
||||||
* director: List of directors to search ([director_or_id, ...]). [movie]
|
|
||||||
* genre: List Genres to search within ([genere_or_id, ...]). [all]
|
|
||||||
* resolution: List of video resolutions to search within ([resolution_or_key, ...]). [movie]
|
|
||||||
* studio: List of studios to search within ([studio_or_key, ...]). [music]
|
|
||||||
* year: List of years to search within ([yyyy, ...]). [all]
|
|
||||||
|
|
||||||
Currently the "xtra" attribute is only available to be used with movies.
|
|
||||||
|
|
||||||
5) Commercials?
|
|
||||||
|
|
||||||
If you are planning on using "time-shift" with a value greater than "1", then you will have empty gaps
|
|
||||||
in between your scheduled content. A neat feature is to fill those gaps with commercials, music videos,
|
|
||||||
or whatever you can come up with. All you have to do is set the commercial flag in the "pseudo_config.py"
|
|
||||||
file to tell the app to use "commercial injection" and make sure you have a "Commercials" library in your
|
|
||||||
plex media library. In that library, fill it with as many commercials or short videos as you can. The more
|
|
||||||
the better! I have close to a thousand commercials in mine - this helps the app fill up the gaps with a
|
|
||||||
wide variety of video content of varied durations. (hint: use a tool like 'youtube-dl' to download full
|
|
||||||
playlists from yourtube. You can fill up your "Commercials" library quick). Once you have your commercials library
|
|
||||||
setup, make sure to run, "python PseudoChannel.py -u" once more to update your local db with your new commercials
|
|
||||||
library. Commercials will now be "injected" to fill up gaps upon the next days schedule (or you can manually
|
|
||||||
generate the schedule using the "-g" flag).
|
|
||||||
|
|
||||||
Ok, that should be it. I've made it sound much more complicated than it actually is. Just make sure that you aren't
|
|
||||||
accidentally overlapping times, aren't accidentally trying to use forbidden XML characters, etc. Once you have
|
|
||||||
everything set, it should be hands off form there on out. Just go back to the cli and run "python PseudoChannel.py -xml"
|
|
||||||
to tell the app that you have updated the XML.
|
|
||||||
|
|
||||||
Oh and lastly, make sure that your "series" title's are written exactly as they are in your Plex Library. So if you
|
|
||||||
have "The Office (us)" in your Plex library, you need to have it written exactly like that here (not case sensitive) or it won't work. In
|
|
||||||
my previous "garfield" example you might be tempted to write it as "Garfield and Friends" instead of the hassle of
|
|
||||||
using the XML ascii character "&". Well you cannot do that. I usually like to have my Plex Server web page
|
|
||||||
open in a tab while making my XML. That way for each "series" title I can double check the library to make sure I
|
|
||||||
am using the series title exactly as Plex is.
|
|
||||||
|
|
||||||
Ok, that is it. If you have questions feel free to contact Mark or I on discord here: https://discord.gg/7equn68,
|
|
||||||
or open an 'issue' on the github repository. Have fun!
|
|
||||||
|
|
||||||
-->
|
|
||||||
<schedule>
|
|
||||||
<everyday>
|
|
||||||
<!-- The first item is set to: strict-time=true - this isn't necessary but helps organize the schedule -->
|
|
||||||
<!--
|
|
||||||
The following is a good example of content that is extremely short. Looney Tunes cartoons are around
|
|
||||||
5 minutes in length per episode. Althrough sometimes they are as much as 25 minutes long.
|
|
||||||
Since strict-time is set to false, the app will adjust accordingly. I am however setting a *rough
|
|
||||||
intended time of 6:00 AM and incrementing by 10 minutes. The app will figure out the real
|
|
||||||
start times but this will help me conceptualize my schedule as I keep adding entries.
|
|
||||||
-->
|
|
||||||
<time title="Looney Tunes" type="series" strict-time="false" time-shift="1" >6:00 AM</time>
|
|
||||||
<time title="Looney Tunes" type="series" strict-time="false" time-shift="1" >6:10 AM</time>
|
|
||||||
<time title="Looney Tunes" type="series" strict-time="false" time-shift="1" >6:20 AM</time>
|
|
||||||
<time title="Looney Tunes" type="series" strict-time="false" time-shift="1" >6:40 AM</time>
|
|
||||||
<time title="Looney Tunes" type="series" strict-time="false" time-shift="1" >6:50 AM</time>
|
|
||||||
</everyday>
|
|
||||||
<mondays>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:30 AM</time>
|
|
||||||
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:00 AM</time>
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:30 AM</time>
|
|
||||||
|
|
||||||
<time title="macgyver" type="series" strict-time="false" time-shift="5" >11:00 AM</time>
|
|
||||||
|
|
||||||
<time title="boy meets world" type="series" strict-time="false" time-shift="5" >12:00 PM</time>
|
|
||||||
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >12:30 PM</time>
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >1:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Wonder Years" type="series" strict-time="false" time-shift="5" >1:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Simpsons" type="series" strict-time="false" time-shift="5" >2:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Monk" type="series" strict-time="false" time-shift="5" >2:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >3:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Fresh Prince of Bel-Air" type="series" strict-time="false" time-shift="5" >3:30 PM</time>
|
|
||||||
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:00 PM</time>
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:00 PM</time>
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:30 PM</time>
|
|
||||||
|
|
||||||
<time title="seinfeld" type="series" strict-time="false" time-shift="5" >6:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Parker Lewis Can't Lose" type="series" strict-time="false" time-shift="5" >6:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Futurama" type="series" strict-time="false" time-shift="5" >7:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Saved by the Bell" type="series" strict-time="false" time-shift="5" >7:30 PM</time>
|
|
||||||
<time title="Saved by the Bell" type="series" strict-time="false" time-shift="5" >8:00 PM</time>
|
|
||||||
|
|
||||||
<time title="new girl" type="series" strict-time="false" time-shift="5" >8:30 PM</time>
|
|
||||||
|
|
||||||
<time title="random" type="movie" strict-time="false" time-shift="5" xtra='actor:mike myers genre:comedy contentRating:PG-13'>9:00 PM</time>
|
|
||||||
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:30 PM</time>
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:40 PM</time>
|
|
||||||
<time title="Blossom" type="series" strict-time="false" time-shift="5" >10:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Frasier" type="series" strict-time="false" time-shift="1" >10:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:30 PM</time>
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:40 PM</time>
|
|
||||||
|
|
||||||
<time title="M*A*S*H" type="series" strict-time="false" time-shift="5" >10:50 PM</time>
|
|
||||||
|
|
||||||
<time title="Beverly Hills, 90210" type="series" strict-time="false" time-shift="5" >11:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Cheers" type="series" strict-time="false" time-shift="5" >11:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Three's Company" type="series" strict-time="false" time-shift="5" >11:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Brady Bunch" type="series" strict-time="false" time-shift="5" >11:40 PM</time>
|
|
||||||
</mondays>
|
|
||||||
<tuesdays>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:30 AM</time>
|
|
||||||
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:00 AM</time>
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:30 AM</time>
|
|
||||||
|
|
||||||
<time title="macgyver" type="series" strict-time="false" time-shift="5" >11:00 AM</time>
|
|
||||||
|
|
||||||
<time title="boy meets world" type="series" strict-time="false" time-shift="5" >12:00 PM</time>
|
|
||||||
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >12:30 PM</time>
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >1:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Wonder Years" type="series" strict-time="false" time-shift="5" >1:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Simpsons" type="series" strict-time="false" time-shift="5" >2:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Monk" type="series" strict-time="false" time-shift="5" >2:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >3:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Fresh Prince of Bel-Air" type="series" strict-time="false" time-shift="5" >3:30 PM</time>
|
|
||||||
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:00 PM</time>
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:00 PM</time>
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:30 PM</time>
|
|
||||||
|
|
||||||
<time title="seinfeld" type="series" strict-time="false" time-shift="5" >6:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Parker Lewis Can't Lose" type="series" strict-time="false" time-shift="5" >6:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Futurama" type="series" strict-time="false" time-shift="5" >7:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Saved by the Bell" type="series" strict-time="false" time-shift="5" >7:30 PM</time>
|
|
||||||
<time title="Saved by the Bell" type="series" strict-time="false" time-shift="5" >8:00 PM</time>
|
|
||||||
|
|
||||||
<time title="new girl" type="series" strict-time="false" time-shift="5" >8:30 PM</time>
|
|
||||||
|
|
||||||
<time title="random" type="movie" strict-time="false" time-shift="5" xtra='actor:mike myers genre:comedy contentRating:PG-13'>9:00 PM</time>
|
|
||||||
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:30 PM</time>
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:40 PM</time>
|
|
||||||
<time title="Blossom" type="series" strict-time="false" time-shift="5" >10:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Frasier" type="series" strict-time="false" time-shift="1" >10:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:30 PM</time>
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:40 PM</time>
|
|
||||||
|
|
||||||
<time title="M*A*S*H" type="series" strict-time="false" time-shift="5" >10:50 PM</time>
|
|
||||||
|
|
||||||
<time title="Beverly Hills, 90210" type="series" strict-time="false" time-shift="5" >11:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Cheers" type="series" strict-time="false" time-shift="5" >11:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Three's Company" type="series" strict-time="false" time-shift="5" >11:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Brady Bunch" type="series" strict-time="false" time-shift="5" >11:40 PM</time>
|
|
||||||
</tuesdays>
|
|
||||||
<wednesdays>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:30 AM</time>
|
|
||||||
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:00 AM</time>
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:30 AM</time>
|
|
||||||
|
|
||||||
<time title="macgyver" type="series" strict-time="false" time-shift="5" >11:00 AM</time>
|
|
||||||
|
|
||||||
<time title="boy meets world" type="series" strict-time="false" time-shift="5" >12:00 PM</time>
|
|
||||||
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >12:30 PM</time>
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >1:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Wonder Years" type="series" strict-time="false" time-shift="5" >1:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Simpsons" type="series" strict-time="false" time-shift="5" >2:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Monk" type="series" strict-time="false" time-shift="5" >2:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >3:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Fresh Prince of Bel-Air" type="series" strict-time="false" time-shift="5" >3:30 PM</time>
|
|
||||||
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:00 PM</time>
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:00 PM</time>
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:30 PM</time>
|
|
||||||
|
|
||||||
<time title="seinfeld" type="series" strict-time="false" time-shift="5" >6:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Parker Lewis Can't Lose" type="series" strict-time="false" time-shift="5" >6:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Futurama" type="series" strict-time="false" time-shift="5" >7:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Saved by the Bell" type="series" strict-time="false" time-shift="5" >7:30 PM</time>
|
|
||||||
<time title="Saved by the Bell" type="series" strict-time="false" time-shift="5" >8:00 PM</time>
|
|
||||||
|
|
||||||
<time title="new girl" type="series" strict-time="false" time-shift="5" >8:30 PM</time>
|
|
||||||
|
|
||||||
<time title="random" type="movie" strict-time="false" time-shift="5" xtra='actor:mike myers genre:comedy contentRating:PG-13'>9:00 PM</time>
|
|
||||||
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:30 PM</time>
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:40 PM</time>
|
|
||||||
<time title="Blossom" type="series" strict-time="false" time-shift="5" >10:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Frasier" type="series" strict-time="false" time-shift="1" >10:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:30 PM</time>
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:40 PM</time>
|
|
||||||
|
|
||||||
<time title="M*A*S*H" type="series" strict-time="false" time-shift="5" >10:50 PM</time>
|
|
||||||
|
|
||||||
<time title="Beverly Hills, 90210" type="series" strict-time="false" time-shift="5" >11:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Cheers" type="series" strict-time="false" time-shift="5" >11:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Three's Company" type="series" strict-time="false" time-shift="5" >11:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Brady Bunch" type="series" strict-time="false" time-shift="5" >11:40 PM</time>
|
|
||||||
</wednesdays>
|
|
||||||
<thursdays>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:30 AM</time>
|
|
||||||
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:00 AM</time>
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:30 AM</time>
|
|
||||||
|
|
||||||
<time title="macgyver" type="series" strict-time="false" time-shift="5" >11:00 AM</time>
|
|
||||||
|
|
||||||
<time title="boy meets world" type="series" strict-time="false" time-shift="5" >12:00 PM</time>
|
|
||||||
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >12:30 PM</time>
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >1:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Wonder Years" type="series" strict-time="false" time-shift="5" >1:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Simpsons" type="series" strict-time="false" time-shift="5" >2:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Monk" type="series" strict-time="false" time-shift="5" >2:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >3:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Fresh Prince of Bel-Air" type="series" strict-time="false" time-shift="5" >3:30 PM</time>
|
|
||||||
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:00 PM</time>
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:00 PM</time>
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:30 PM</time>
|
|
||||||
|
|
||||||
<time title="seinfeld" type="series" strict-time="false" time-shift="5" >6:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Parker Lewis Can't Lose" type="series" strict-time="false" time-shift="5" >6:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Futurama" type="series" strict-time="false" time-shift="5" >7:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Saved by the Bell" type="series" strict-time="false" time-shift="5" >7:30 PM</time>
|
|
||||||
<time title="Saved by the Bell" type="series" strict-time="false" time-shift="5" >8:00 PM</time>
|
|
||||||
|
|
||||||
<time title="new girl" type="series" strict-time="false" time-shift="5" >8:30 PM</time>
|
|
||||||
|
|
||||||
<time title="random" type="movie" strict-time="false" time-shift="5" xtra='actor:mike myers genre:comedy contentRating:PG-13'>9:00 PM</time>
|
|
||||||
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:30 PM</time>
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:40 PM</time>
|
|
||||||
<time title="Blossom" type="series" strict-time="false" time-shift="5" >10:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Frasier" type="series" strict-time="false" time-shift="1" >10:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:30 PM</time>
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:40 PM</time>
|
|
||||||
|
|
||||||
<time title="M*A*S*H" type="series" strict-time="false" time-shift="5" >10:50 PM</time>
|
|
||||||
|
|
||||||
<time title="Beverly Hills, 90210" type="series" strict-time="false" time-shift="5" >11:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Cheers" type="series" strict-time="false" time-shift="5" >11:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Three's Company" type="series" strict-time="false" time-shift="5" >11:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Brady Bunch" type="series" strict-time="false" time-shift="5" >11:40 PM</time>
|
|
||||||
</thursdays>
|
|
||||||
<fridays>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >9:30 AM</time>
|
|
||||||
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:00 AM</time>
|
|
||||||
<time title="talespin" type="series" strict-time="false" time-shift="5" >10:30 AM</time>
|
|
||||||
|
|
||||||
<time title="macgyver" type="series" strict-time="false" time-shift="5" >11:00 AM</time>
|
|
||||||
|
|
||||||
<time title="boy meets world" type="series" strict-time="false" time-shift="5" >12:00 PM</time>
|
|
||||||
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >12:30 PM</time>
|
|
||||||
<time title="full house" type="series" strict-time="false" time-shift="5" >1:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Wonder Years" type="series" strict-time="false" time-shift="5" >1:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Simpsons" type="series" strict-time="false" time-shift="5" >2:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Monk" type="series" strict-time="false" time-shift="5" >2:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >3:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Fresh Prince of Bel-Air" type="series" strict-time="false" time-shift="5" >3:30 PM</time>
|
|
||||||
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:00 PM</time>
|
|
||||||
<time title="the office (us)" type="series" strict-time="false" time-shift="5" >4:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:00 PM</time>
|
|
||||||
<time title="Roseanne" type="series" strict-time="false" time-shift="5" >5:30 PM</time>
|
|
||||||
|
|
||||||
<time title="seinfeld" type="series" strict-time="false" time-shift="5" >6:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Parker Lewis Can't Lose" type="series" strict-time="false" time-shift="5" >6:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Saved by the Bell" type="series" strict-time="false" time-shift="5" >7:00 PM</time>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Here is an example of a day specific block. TGIF 90's style...
|
|
||||||
-->
|
|
||||||
<time title="Sabrina The Teenage Witch" type="series" strict-time="true" time-shift="1" >8:00 PM</time>
|
|
||||||
<time title="Boy Meets World" type="series" strict-time="false" time-shift="1" >8:20 PM</time>
|
|
||||||
<time title="Family Matters" type="series" strict-time="false" time-shift="1" >8:40 PM</time>
|
|
||||||
<time title="Family Matters" type="series" strict-time="false" time-shift="1" >9:00 PM</time>
|
|
||||||
|
|
||||||
<!-- - -->
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:30 PM</time>
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >9:40 PM</time>
|
|
||||||
<time title="Blossom" type="series" strict-time="false" time-shift="5" >10:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Frasier" type="series" strict-time="false" time-shift="1" >10:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:30 PM</time>
|
|
||||||
<time title="Mad About You" type="series" strict-time="false" time-shift="5" >10:40 PM</time>
|
|
||||||
|
|
||||||
<time title="M*A*S*H" type="series" strict-time="false" time-shift="5" >10:50 PM</time>
|
|
||||||
|
|
||||||
<time title="Beverly Hills, 90210" type="series" strict-time="false" time-shift="5" >11:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Cheers" type="series" strict-time="false" time-shift="5" >11:20 PM</time>
|
|
||||||
|
|
||||||
<time title="Three's Company" type="series" strict-time="false" time-shift="5" >11:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Brady Bunch" type="series" strict-time="false" time-shift="5" >11:40 PM</time>
|
|
||||||
|
|
||||||
</fridays>
|
|
||||||
<saturdays>
|
|
||||||
<!--
|
|
||||||
Here is an example of using the xtra attr to specify a saturday late-afternoon 80's movie block.
|
|
||||||
-->
|
|
||||||
<time title="random" type="movie" strict-time="false" time-shift="5" xtra="decade:1980">5:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Elementary" type="show" strict-time="false" time-shift="5" >7:00 PM</time>
|
|
||||||
|
|
||||||
</saturdays>
|
|
||||||
<sundays>
|
|
||||||
<!--
|
|
||||||
Here is an example of using the xtra attr to specify a sunday late-afternoon romantic comedy movie block.
|
|
||||||
-->
|
|
||||||
<time title="random" type="movie" strict-time="false" time-shift="5" xtra="genre:comedy,romance">5:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Sherlock" type="show" strict-time="false" time-shift="5" >7:00 PM</time>
|
|
||||||
|
|
||||||
</sundays>
|
|
||||||
<weekends>
|
|
||||||
<!--
|
|
||||||
I am incrementing the start times by about 30 minutes. Since times will shift with a
|
|
||||||
5 minute "time-shift", the app will adjust the schedule according to the episode
|
|
||||||
duration / time-shift value.
|
|
||||||
-->
|
|
||||||
<time title="The Smurfs" type="series" strict-time="false" time-shift="5" >7:00 AM</time>
|
|
||||||
|
|
||||||
<time title="Garfield & Friends" type="series" strict-time="false" time-shift="5" >7:30 AM</time>
|
|
||||||
|
|
||||||
<time title="Batman" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
|
|
||||||
|
|
||||||
<time title="random" type="movie" strict-time="false" time-shift="5" xtra="genre:comedy">8:30 AM</time>
|
|
||||||
|
|
||||||
<time title="The Adventures of Pete & Pete" type="series" strict-time="false" time-shift="5" >10:00 AM</time>
|
|
||||||
|
|
||||||
<time title="Gilligan's Island" type="series" strict-time="false" time-shift="5" >10:30 AM</time>
|
|
||||||
|
|
||||||
<time title="The Jetsons" type="series" strict-time="false" time-shift="5" >11:00 AM</time>
|
|
||||||
|
|
||||||
<time title="Blossom" type="series" strict-time="false" time-shift="5" >11:30 AM</time>
|
|
||||||
|
|
||||||
<time title="Clarissa Explains It All" type="series" strict-time="false" time-shift="5" >12:00 AM</time>
|
|
||||||
|
|
||||||
<time title="random" type="movie" strict-time="false" time-shift="5" xtra="genre:action decade:1990,1980,1970,1960">12:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Wonder Years" type="series" strict-time="false" time-shift="5" >2:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Simpsons" type="series" strict-time="false" time-shift="5" >2:30 PM</time>
|
|
||||||
|
|
||||||
<time title="Monk" type="series" strict-time="false" time-shift="5" >3:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Married... with Children" type="series" strict-time="false" time-shift="5" >3:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Fresh Prince of Bel-Air" type="series" strict-time="false" time-shift="5" >4:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Arrested Development" type="series" strict-time="false" time-shift="5" >4:30 PM</time>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Here I am leaving some room for saturdays/sundays specific content. I will keep strict-time false for all my
|
|
||||||
times so I can squeeze in as much content into my schedule without cutting anything off. If you choose to
|
|
||||||
use strict-time, then it's important to make sure you have left a good amount of room so scheduled content
|
|
||||||
doesn't get cutoff.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<time title="Beverly Hills, 90210" type="show" strict-time="false" time-shift="5" >8:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Daria" type="show" strict-time="false" time-shift="5" >9:00 PM</time>
|
|
||||||
|
|
||||||
<time title="The Scooby-Doo Show" type="show" strict-time="false" time-shift="5" >9:30 PM</time>
|
|
||||||
|
|
||||||
<time title="The Flintstones" type="show" strict-time="false" time-shift="5" >10:00 PM</time>
|
|
||||||
|
|
||||||
<time title="Happy Days" type="show" strict-time="false" time-shift="5" >10:30 PM</time>
|
|
||||||
|
|
||||||
</weekends>
|
|
||||||
<weekdays>
|
|
||||||
|
|
||||||
</weekdays>
|
|
||||||
</schedule>
|
|
||||||
0
multi-channel-bash-scripts/update-channels-from-git.sh → update-channels-from-git.sh
Executable file → Normal file
0
multi-channel-bash-scripts/update-channels-from-git.sh → update-channels-from-git.sh
Executable file → Normal file
Reference in New Issue
Block a user