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:
mutto233
2018-06-29 16:27:29 -04:00
parent 6a604960f0
commit ea70ed38ce
32 changed files with 161 additions and 798 deletions

View File

View File

@@ -1,29 +1,29 @@
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 28 22:59:57 2018
@author: Matt
"""
from pseudo_config import plexLibraries as local_commercials
commercials = local_commercials["Commercials"]
movies = local_commercials["Movies"]
tvs = local_commercials["TV Shows"]
commercials_file = open('Commercial_Libraries.txt','w')
movies_file = open('Movie_Libraries.txt','w')
tvs_file = open('TV_Libraries.txt','w')
for commercial in commercials:
commercials_file.write(commercial + '\n')
for movie in movies:
movies_file.write(movie + '\n')
for tv in tvs:
tvs_file.write(tv + '\n')
commercials_file.close()
movies_file.close()
tvs_file.close()
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 28 22:59:57 2018
@author: Matt
"""
from pseudo_config import plexLibraries as local_commercials
commercials = local_commercials["Commercials"]
movies = local_commercials["Movies"]
tvs = local_commercials["TV Shows"]
commercials_file = open('Commercial_Libraries.txt','w')
movies_file = open('Movie_Libraries.txt','w')
tvs_file = open('TV_Libraries.txt','w')
for commercial in commercials:
commercials_file.write(commercial + '\n')
for movie in movies:
movies_file.write(movie + '\n')
for tv in tvs:
tvs_file.write(tv + '\n')
commercials_file.close()
movies_file.close()
tvs_file.close()

0
startstop.sh → channel-dir/startstop.sh Executable file → Normal file
View File

View File

@@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 26 23:31:00 2018
@author: Matt
"""
import re
import sys
def atoi(text):
return int(text) if text.isdigit() else text
def natural_keys(text):
'''
alist.sort(key=natural_keys) sorts in human order
http://nedbatchelder.com/blog/200712/human_sorting.html
(See Toothy's implementation in the comments)
'''
return [ atoi(c) for c in re.split('(\d+)', text) ]
temp_hold = list(sys.argv[1:])
temp_hold.sort(key=natural_keys)
file = open('Channels_Sorted.txt','w')
for item in temp_hold:
file.write(item + '\n')
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 26 23:31:00 2018
@author: Matt
"""
import re
import sys
def atoi(text):
return int(text) if text.isdigit() else text
def natural_keys(text):
'''
alist.sort(key=natural_keys) sorts in human order
http://nedbatchelder.com/blog/200712/human_sorting.html
(See Toothy's implementation in the comments)
'''
return [ atoi(c) for c in re.split('(\d+)', text) ]
temp_hold = list(sys.argv[1:])
temp_hold.sort(key=natural_keys)
file = open('Channels_Sorted.txt','w')
for item in temp_hold:
file.write(item + '\n')
file.close()

View File

@@ -1,107 +1,107 @@
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 28 17:33:59 2018
@author: Matt
"""
import sqlite3
import os
from shutil import copy2
from pseudo_config import plexLibraries as global_commercials
channel_dir_increment_symbol = "_"
# Step ONE: Global database update
print("+++++ Doing global update from PLEX")
os.system('sudo python PseudoChannel.py -u')
base_dirA = os.path.dirname(os.path.abspath(__file__))
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 = list(filter(lambda x: x.startswith(locations),channel_dirs))
for channel_dir in channel_dirs:
# Step TWO: Go to each folder, export the following information
# - Show title, lastEpisodeTitle
# - Movie title, lastPlayedDate
os.chdir(channel_dir)
channel_dirA = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(channel_dirA, "pseudo-channel.db")
print("+++++ Importing from " + db_path)
try:
conn = sqlite3.connect(db_path)
table = conn.cursor()
lastEpisode_export = table.execute('SELECT lastEpisodeTitle,title FROM shows').fetchall()
lastEpisode_export = list(lastEpisode_export)
lastMovie_export = table.execute('SELECT lastPlayedDate,title FROM movies').fetchall()
lastMovie_export = list(lastMovie_export)
conn.commit()
conn.close()
except:
print("+++++ Database experiencing errors or hasn't been formed yet; creating fresh one")
lastEpisode_export = []
lastMovie_export = []
# Step THREE: Delete the previous database, replace with the recently created global one
print("+++++ Copying global update to " + db_path)
copy2('../pseudo-channel.db','.')
# Step FOUR: Import the previous information we exported previously
print("+++++ Exporting to " + db_path)
conn = sqlite3.connect(db_path)
table = conn.cursor()
for i in range(0,len(lastEpisode_export)):
sql = "UPDATE shows SET lastEpisodeTitle=? WHERE title=?"
table.execute(sql,lastEpisode_export[i])
for i in range(0,len(lastMovie_export)):
sql = "UPDATE movies SET lastPlayedDate=? WHERE title=?"
table.execute(sql,lastMovie_export[i])
# Step FIVE: Remove any media not in the directories set of commerical archives
print("+++++ Trimming database at " + db_path)
os.system('sudo python report_MediaFolders.py')
local_commercials = open('Commercial_Libraries.txt').read().splitlines()
local_movies = open('Movie_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]
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]
# print(db_path)
# print(local_commercials)
# print(global_commercials["Commercials"])
# print(commercial_removal)
for commercial in commercial_removal:
sql = "DELETE FROM commercials WHERE customSectionName=?"
table.execute(sql,(commercial,))
for movie in movie_removal:
sql = "DELETE FROM movies WHERE customSectionName=?"
table.execute(sql,(movie,))
for tv in tv_removal:
sql = "DELETE FROM shows WHERE customSectionName=?"
table.execute(sql,(tv,))
sql = "DELETE FROM episodes WHERE customSectionName=?"
table.execute(sql,(tv,))
conn.commit()
conn.close()
os.chdir('..')
print("+++++ " + db_path + " complete! Going to next file")
print("+++++ Global update COMPLETE")
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 28 17:33:59 2018
@author: Matt
"""
import sqlite3
import os
from shutil import copy2
from pseudo_config import plexLibraries as global_commercials
channel_dir_increment_symbol = "_"
# Step ONE: Global database update
print("+++++ Doing global update from PLEX")
os.system('sudo python PseudoChannel.py -u')
base_dirA = os.path.dirname(os.path.abspath(__file__))
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 = list(filter(lambda x: x.startswith(locations),channel_dirs))
for channel_dir in channel_dirs:
# Step TWO: Go to each folder, export the following information
# - Show title, lastEpisodeTitle
# - Movie title, lastPlayedDate
os.chdir(channel_dir)
channel_dirA = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(channel_dirA, "pseudo-channel.db")
print("+++++ Importing from " + db_path)
try:
conn = sqlite3.connect(db_path)
table = conn.cursor()
lastEpisode_export = table.execute('SELECT lastEpisodeTitle,title FROM shows').fetchall()
lastEpisode_export = list(lastEpisode_export)
lastMovie_export = table.execute('SELECT lastPlayedDate,title FROM movies').fetchall()
lastMovie_export = list(lastMovie_export)
conn.commit()
conn.close()
except:
print("+++++ Database experiencing errors or hasn't been formed yet; creating fresh one")
lastEpisode_export = []
lastMovie_export = []
# Step THREE: Delete the previous database, replace with the recently created global one
print("+++++ Copying global update to " + db_path)
copy2('../pseudo-channel.db','.')
# Step FOUR: Import the previous information we exported previously
print("+++++ Exporting to " + db_path)
conn = sqlite3.connect(db_path)
table = conn.cursor()
for i in range(0,len(lastEpisode_export)):
sql = "UPDATE shows SET lastEpisodeTitle=? WHERE title=?"
table.execute(sql,lastEpisode_export[i])
for i in range(0,len(lastMovie_export)):
sql = "UPDATE movies SET lastPlayedDate=? WHERE title=?"
table.execute(sql,lastMovie_export[i])
# Step FIVE: Remove any media not in the directories set of commerical archives
print("+++++ Trimming database at " + db_path)
os.system('sudo python report_MediaFolders.py')
local_commercials = open('Commercial_Libraries.txt').read().splitlines()
local_movies = open('Movie_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]
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]
# print(db_path)
# print(local_commercials)
# print(global_commercials["Commercials"])
# print(commercial_removal)
for commercial in commercial_removal:
sql = "DELETE FROM commercials WHERE customSectionName=?"
table.execute(sql,(commercial,))
for movie in movie_removal:
sql = "DELETE FROM movies WHERE customSectionName=?"
table.execute(sql,(movie,))
for tv in tv_removal:
sql = "DELETE FROM shows WHERE customSectionName=?"
table.execute(sql,(tv,))
sql = "DELETE FROM episodes WHERE customSectionName=?"
table.execute(sql,(tv,))
conn.commit()
conn.close()
os.chdir('..')
print("+++++ " + db_path + " complete! Going to next file")
print("+++++ Global update COMPLETE")

View File

View File

View File

View File

@@ -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

View File

@@ -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 &#38; Friends"
playing only on "weekday" mornings scheduled for after Looney Tunes starting at "8:00 AM". Also notice that
"Garfield &#38; Friends" below is actually written as, "Garfield &#38; 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 "&#38;". 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 &#38; Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
<time title="Garfield &#38; 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&#39;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&#39;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 &#38; Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
<time title="Garfield &#38; 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&#39;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&#39;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 &#38; Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
<time title="Garfield &#38; 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&#39;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&#39;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 &#38; Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
<time title="Garfield &#38; 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&#39;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&#39;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 &#38; Friends" type="series" strict-time="false" time-shift="5" >8:00 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >8:30 AM</time>
<time title="Garfield &#38; Friends" type="series" strict-time="false" time-shift="5" >9:00 AM</time>
<time title="Garfield &#38; 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&#39;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&#39;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 &#38; 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 &#38; 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>