Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/zshall/program-guide/llms.txt

Use this file to discover all available pages before exploring further.

data/guide.xml is the single source of truth for every piece of program data in Television Simulator ‘99. It drives the channel grid displayed in the Channel 12 Prevue-style guide, controls which channels are watchable and which one loads on startup, supplies the rotating ad copy shown in the left panel, and injects red notice banners for special announcements. All of this is parsed at startup by a jQuery AJAX call in tv.js and stored in window.guideData for the entire session.

File location

data/guide.xml

Document structure

The file follows a straightforward hierarchy: a root <guide> element contains one <videos> block, one <ads> block, and any number of <channel> elements.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<guide>
  <videos>
    <video id="oemoqEuJdFE" />
  </videos>
  <ads>
    <ad duration="30">
      <p>Your Ad Text</p>
    </ad>
  </ads>
  <channel number="5" name="MYCH5" watchable="watchable">
    <listing timeslot="33" type="1">Evening News</listing>
    <listing timeslot="35" type="movie" rating="TV-PG">Movie Title (1999)</listing>
  </channel>
  <channel number="12" name="PRV" default="default" watchable="watchable">
    <listing timeslot="1" type="1">Prevue Channel</listing>
  </channel>
</guide>
The <videos> block is present in the XML file but Channel 12 does not read from it. The Channel 12 class hardcodes its YouTube video ID directly in its show() method (videoId: '9NSVU4Gv_wA'). If you build a custom channel that reads <video> entries from the guide data, you can populate this block and query it via guideData.find('video') — but no channel in the default codebase currently does so.

Channel element

Each <channel> element represents one row in the guide grid. The attributes that control its behaviour are:
AttributeRequiredDescription
numberThe channel number shown in the guide and used to switch to the channel. Must match the class name Channel{number} registered in tv.js.
nameShort station identifier displayed in the leftmost column of the grid, e.g. PRV, KCBS, ESPN. Keep it to around 6 characters for the best fit.
watchableWhen present (value "watchable"), the channel appears in the listings grid and the TV will load it when that number is selected. Omit to have the channel’s listings silently ignored.
defaultWhen present (value "default"), this channel loads automatically at startup. Only one channel should carry this attribute. Channel 12 (PRV) is the default in the shipped data.
noticeonlyWhen present, the channel’s row is skipped in the guide table — no channel box or listings are rendered — but any <notice> child elements still produce red banner rows. Useful for service-wide alerts not tied to a specific channel.

Listing element

<listing> elements are the individual program slots. They are children of a <channel> and each maps to one cell (or a colspan-merged cell) in the guide row.
<listing timeslot="37" type="movie" rating="TV-PG">Ally McBeal</listing>
AttributeRequiredDescription
timeslotHalf-hour index from midnight. See the timeslot reference table below.
typeControls cell appearance. Only "movie" has special treatment: it renders the cell with a blue gradient background ($blue-gradient in the SCSS). All other values — including "1", "9", and ".5" as used throughout the shipped guide.xml — render as plain listing cells with no visual distinction.
ratingContent rating string displayed as-is in the guide, e.g. G, TV-PG, TV-MA, R, PG-13.
continuousSet to "continuous" to signal that the show spans multiple timeslots. The guide logic uses getFirstListing() to walk backwards from the current timeslot, so a continuous show will fill cells that have no explicit listing of their own.
The text content of <listing> is the programme title and is rendered as the cell body in the guide table.

Notice element

A <notice> element inside any <channel> produces a full-width red banner row above that channel’s listing row. This mirrors the emergency-notice style seen on real 1990s Prevue Guides.
<channel number="25" name="HBOW02">
  <notice>Home Terminal (converter) needed in order to receive Premium Services and Pay Per View</notice>
  <listing timeslot="18" type="movie" rating="PG-13">Home Fries (1998) Drew Barrymore...</listing>
</channel>
Both <notice> and <ad> content is passed through jQuery’s .html(), so standard HTML tags are valid. You can use <p>, <br/>, <strong>, and similar inline elements inside both. Entities like &amp; and &lt; must still be properly escaped because the document is parsed as XML.

Ads section

The <ads> block supplies the rotating promotional copy shown in the left panel of the Channel 12 guide screen. Each <ad> element specifies how many seconds it stays on screen before fading to the next one.
<ads>
  <ad duration="30">
    <p>HBO<br />12 months $10.95 / mo.</p>
    <p>Sign up today!<br />1-800-555-9485</p>
  </ad>
  <ad duration="30">
    <p>Showtime Value Package<br/>Showtime, Sundance &amp; Movie Channel</p>
    <p>$10.95 / mo.<br/>1-800-555-9485</p>
  </ad>
</ads>
AttributeDescription
durationNumber of seconds this ad stays visible before nextAd() is called. Defaults to 30 if omitted.
The nextAd() method in Channel12 checks this.adList.length <= 1 before cycling; if you provide only one <ad>, the rotation stops after the first display and the same ad remains on screen. To get a cycling loop, provide at least two <ad> entries. If the <ads> block is empty, the left panel displays the static text "THIS SPACE FOR RENT".

Timeslot reference

Timeslots are half-hour indices starting at midnight (timeslot 0 = 12:00 AM). The guide automatically displays the three timeslots closest to the current wall-clock time. Use this table to place programmes at the right time of day:
TimeslotTimeTimeslotTimeTimeslotTime
012:00 AM168:00 AM324:00 PM
112:30 AM178:30 AM334:30 PM
21:00 AM189:00 AM345:00 PM
31:30 AM199:30 AM355:30 PM
42:00 AM2010:00 AM366:00 PM
52:30 AM2110:30 AM376:30 PM
63:00 AM2211:00 AM387:00 PM
73:30 AM2311:30 AM397:30 PM
84:00 AM2412:00 PM408:00 PM
94:30 AM2512:30 PM418:30 PM
105:00 AM261:00 PM429:00 PM
115:30 AM271:30 PM439:30 PM
126:00 AM282:00 PM4410:00 PM
136:30 AM292:30 PM4510:30 PM
147:00 AM303:00 PM4611:00 PM
157:30 AM313:30 PM4711:30 PM
4812:00 AM (next day)
For the most immersive simulation, populate your channels with real period-accurate schedules. The shipped guide.xml draws from an actual Los Angeles cable lineup from late 1999 — every show, movie, and timeslot is sourced from a real TV guide from that era. Matching your own channel listings to a specific date and market produces a noticeably more authentic feel than placeholder titles.

Complete example

The following snippet shows a fully configured channel with a notice, mixed listing types, and a movie entry:
<channel number="6" name="TBS" watchable="watchable">
  <listing timeslot="33" type="movie" rating="TV-PG">
    ( 7:05) "A Christmas Story" (1983) Peter Billingsley, Darren McGavin.
    Charming tale of a 9-year-old and his overwhelming Christmas wish. (1 hr 38 min)
  </listing>
  <listing timeslot="37" type="movie" rating="TV-14">
    ( 9:05) "Someone to Watch Over Me" (1987) Tom Berenger, Mimi Rogers.
    A married cop falls for the glamorous Manhattan socialite he's protecting. (1 hr 46 min)
  </listing>
  <listing timeslot="41" type="1" rating="G">Andy Griffith</listing>
  <listing timeslot="42" type="1" rating="G">Beverly Hillbillies</listing>
</channel>

Build docs developers (and LLMs) love