SageTV Community  

Go Back   SageTV Community > SageTV Development and Customizations > SageTV Customizations
Forum Rules FAQs Community Downloads Today's Posts Search

Notices

SageTV Customizations This forums is for discussing and sharing user-created modifications for the SageTV application created by using the SageTV Studio or through the use of external plugins. Use this forum to discuss customizations for SageTV version 6 and earlier, or for the SageTV3 UI.

Reply
 
Thread Tools Search this Thread Display Modes
  #561  
Old 03-31-2010, 12:41 PM
Slugger Slugger is offline
SageTVaholic
 
Join Date: Mar 2007
Location: Kingston, ON
Posts: 4,008
Quote:
Originally Posted by MitchSchaft View Post
So nobody else really has troubles with HTTP ERROR: 503? I get this probably once every 2 weeks. Both SJQ and the alerter at the same time. I have to redeploy to get it back.
Are there any exceptions in the SJQ logs or the SageTV/Jetty logs? I usually see this error during dev work where I cause a runtime exception with the app. Could also be a result of a Jetty error. Either way I'll need exception dumps to track it down.
__________________
Twitter: @ddb_db
Server: Intel i5-4570 Quad Core, 16GB RAM, 1 x 128GB OS SSD (Win7 Pro x64 SP1), 1 x 2TB media drive
Capture: 2 x Colossus
STB Controller: 1 x USB-UIRT
Software:Java 1.7.0_71; SageTV 7.1.9
Clients: 1 x HD300, 2 x HD200, 1 x SageClient, 1 x PlaceShifter
Plugins: Too many to list now...
Reply With Quote
  #562  
Old 03-31-2010, 04:29 PM
davephan's Avatar
davephan davephan is offline
Sage Icon
 
Join Date: Mar 2004
Location: Minnesota
Posts: 1,911
Quote:
Originally Posted by Slugger View Post
In the tools menu, load the media debugger and select a recording that is not working properly (either is going into the queue but you don't think it should be or isn't going into the queue but you think it should). Run that recording through the media debugger, go to the server logs and examine the output. The output will tell you which test is causing the problem.
I tried debugging with the program "60 Minutes", which was on a station named "WCCODT". I am not sure what the server log means. I don't have a client setup yet.

Here is the output of the log file:

2010-03-31 17:16:25,596 INFO [SystemMessageQueueLoader]: Run completed [0ms]
2010-03-31 17:16:27,003 WARN [SJQServlet]: All client connections are being accepted and processed, please consider setting up client restrictions in SJQ settings
2010-03-31 17:16:27,003 INFO [SJQServlet]: Servlet POST request completed [0ms]
2010-03-31 17:16:27,018 INFO [MediaFileQueueLoader]: sleep interrupted
2010-03-31 17:16:27,018 WARN [MediaFileQueueLoader]: Processing '60 Minutes'...
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating 'IsObjMediaFile == "true"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.IsTVFile{} == "true"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.IsNotManualOrFavorite{} == "false"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.GetAiringChannelName{} != "HBOHD"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.GetAiringChannelName{} != "HBO2"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.GetAiringChannelName{} != "HBOSIG"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.GetAiringChannelName{} != "HBOF"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.GetAiringChannelName{} != "HBOC"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.GetAiringChannelName{} != "HBOZ"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.GetAiringChannelName{} != "KTCADT"' == true
2010-03-31 17:16:27,018 WARN [RulesParser]: Line 1: Evaluating '$.GetAiringChannelName{} != "KTCADT2"' == true
2010-03-31 17:16:27,034 INFO [MediaFileQueueLoader]: Run completed [16ms]
2010-03-31 17:16:27,034 INFO [DataStore]: Thread 'SJQ-LogCleaner' is seeking an exclusive DataStore connection!
2010-03-31 17:16:27,034 INFO [DataStore]: Thread 'SJQ-LogCleaner' has received an exclusive DataStore connection! [WAIT=0ms]
2010-03-31 17:16:27,034 INFO [DataStore]: 'SJQ-LogCleaner' has returned its exclusive DataStore connection!
2010-03-31 17:16:27,034 INFO [LogCleaner]: Thread finished [0ms]
2010-03-31 17:16:27,034 INFO [VacuumCleaner]: Thread finished [0ms]
2010-03-31 17:16:27,034 WARN [FileCleaner]: Skipping because file cleaner settings are empty!
2010-03-31 17:16:37,987 WARN [SJQServlet]: All client connections are being accepted and processed, please consider setting up client restrictions in SJQ settings
2010-03-31 17:16:37,987 INFO [SJQServlet]: Servlet POST request completed [0ms]
2010-03-31 17:16:54,878 WARN [SJQServlet]: All client connections are being accepted and processed, please consider setting up client restrictions in SJQ settings
2010-03-31 17:16:54,909 INFO [SJQServlet]: Servlet POST request completed [31ms]
2010-03-31 17:17:15,956 INFO [ClientMonitor]: Run completed [0ms]
2010-03-31 17:17:16,128 INFO [InternalTaskClient]: Run completed [0ms]
2010-03-31 17:17:25,612 INFO [SystemMessageQueueLoader]: Run completed [16ms]
2010-03-31 17:17:39,878 WARN [SJQServlet]: All client connections are being accepted and processed, please consider setting up client restrictions in SJQ settings


Dave
Reply With Quote
  #563  
Old 03-31-2010, 04:41 PM
Slugger Slugger is offline
SageTVaholic
 
Join Date: Mar 2007
Location: Kingston, ON
Posts: 4,008
Based on this output, all your tests passed so that recording should have been added to the queue. Are you expecting it not to be added to the queue? If so, then why do you think it shouldn't be in the queue? Or is it not being added to the queue, but you expect it to be? If this is the case, then there's something weird going on b/c based on that output, the 60 Minutes recording should have been placed in the queue.
__________________
Twitter: @ddb_db
Server: Intel i5-4570 Quad Core, 16GB RAM, 1 x 128GB OS SSD (Win7 Pro x64 SP1), 1 x 2TB media drive
Capture: 2 x Colossus
STB Controller: 1 x USB-UIRT
Software:Java 1.7.0_71; SageTV 7.1.9
Clients: 1 x HD300, 2 x HD200, 1 x SageClient, 1 x PlaceShifter
Plugins: Too many to list now...
Reply With Quote
  #564  
Old 03-31-2010, 05:15 PM
davephan's Avatar
davephan davephan is offline
Sage Icon
 
Join Date: Mar 2004
Location: Minnesota
Posts: 1,911
You're right! The channels named in the script should not be the queue, and they are not in the queue. The problem was that I was thinking about the script in the wrong way.

Dave
Reply With Quote
  #565  
Old 03-31-2010, 09:34 PM
davephan's Avatar
davephan davephan is offline
Sage Icon
 
Join Date: Mar 2004
Location: Minnesota
Posts: 1,911
I made some progress installing the SJQ client service, but I am still having some trouble with the SQL ruleset. I basically use a modified example 2. I removed the $.IsNotManualOrFavorite{} == false statement, since I do not want to Comskip the channels that are recorded regardless of Manual, Favorite, or if SageTV records the program without scheduling it myself.

There seems to be a limit how long the ruleset can be. I tried making a long ruleset which had 26 non commercial channels in the ruleset. I waited for about a minute, after manually running the job, and no items were in the job queue. Maybe I did not wait long enough.

Is there a limit to the ruleset length, if so how do you get around that to have a really long list of channels that you don't want comskipped? Can you put several rules after each other in the same ruleset file? The documentation looks like it is possible to have several rules within one ruleset file. Although to do avoid comskipping 26 channels, I think I would need a really long rule, which does not seem to work.

Here's an example of a modified short example 2 that does work. When all the channels are in the rule, the size of the rule is about 4 - 5 times longer.

if [IsObjMediaFile == true && $.IsTVFile{} == true && ($.GetAiringChannelName{} != "HBOHD" && $.GetAiringChannelName{} != "HBO2" && $.GetAiringChannelName{} != "HBOSIG" && $.GetAiringChannelName{} != "HBOF") && $.GetAiringChannelName{} != "HBOC" && ($.GetAiringChannelName{} != "HBOZ" && $.GetAiringChannelName{} != "ENCORE" && $.GetAiringChannelName{} != "ENCRA")] {
COMSKIP
}

Dave
Reply With Quote
  #566  
Old 03-31-2010, 09:40 PM
ohpleaseno ohpleaseno is offline
Sage Aficionado
 
Join Date: Apr 2009
Location: South Florida
Posts: 464
couldn't he use regex to shorten it?

Code:
$.GetAiringChannelName{} !% "HBO*|ENCORE|ENCRA"
__________________
Server: WHS with 11TB of storage
Clients:1) HD-200 to a Samsung 32" Slimfit CRT HDTV 2) HD-200 to a Pioneer 26" X1 LCD
Tuners: 1) HD-Homerun 2) Avermedia USB ATSC
Twitter: ohpleaseno
Reply With Quote
  #567  
Old 03-31-2010, 10:56 PM
davephan's Avatar
davephan davephan is offline
Sage Icon
 
Join Date: Mar 2004
Location: Minnesota
Posts: 1,911
Quote:
Originally Posted by ohpleaseno View Post
couldn't he use regex to shorten it?

Code:
$.GetAiringChannelName{} !% "HBO*|ENCORE|ENCRA"
I tried using the wildcard * and it did not work. I tried entering each of the 26 channel names, and it worked. The format using the pipe separators shortens the rule and allows all 26 non-commercial channels to be listed out. Here is the SJQ ruleset file:
Code:
if [IsObjMediaFile == true && $.IsTVFile{} == true && ($.GetAiringChannelName{} !% "KTCADT|KTCADT2|KTCADT3|KTCADT4|CSPAN|CSPAN2|CSPAN3|ENCRWA|ENCORE|ENCRA|ENCRM|ENCRL|ENCRD|ENCRWS|HBOHD|HBO2|HBOSIG|HBOF|HBOC|HBOZ|MPLEX|IFC|SUNDAE|INDIE|RETR|FLIX")] {
   COMSKIP
}
I installed the SJQ client service. The service is configured. I waited about five minutes, and the comskip process started!

I am using the SJQ client configuration file:

COMSKIP {
:RESOURCES 100 # Up to 1 comskips can be run simultaneously (every client has exactly 100 resources available)

# CPU priority to be used for this task process; one of LOW, NORMAL, HIGH (case sensitive)
:CPU "LOW" # Default is NORMAL if not specified

# Comskip returns 1 on success instead of the universally accepted zero; tell SJQ that
# a return code of 1 means success instead of the default value of zero
:RETURNCODE 1

"C:/comskip/comskip.exe \"%c%\""
}

I don't know if multiple jobs can be run at the same time. SJQ should make a big difference, selectively comskipping only the commercial channels!

Dave
Reply With Quote
  #568  
Old 04-01-2010, 08:21 AM
Slugger Slugger is offline
SageTVaholic
 
Join Date: Mar 2007
Location: Kingston, ON
Posts: 4,008
Long rulesets shouldn't matter - should work fine. If it's not, then look in the server logs for an exception dump, which should explain what's going on (usually you made a typo, which becomes more and more likely as the length of your ruleset grows). As to using a regex, you need to remember the value is a regular expression, not a simple wildcard string. There is a link in the User's Guide that points you to the docs for writing valid regular expressions. In its simplest form, you'll want to do something like this:

$.GetAiringChannelName{} !% "HBO.*|ENCORE|ENCRA"

... and so on. You might be able to replace ENCORE|ENCRA with:

"HBO.*|ENC.*", but that might be too generic - you'll have to browse over all your callsigns and ensure that it won't pickup other channels that you do want comskipped. Again, have a look at the User's Guide for the link to the Java regex documentation.
__________________
Twitter: @ddb_db
Server: Intel i5-4570 Quad Core, 16GB RAM, 1 x 128GB OS SSD (Win7 Pro x64 SP1), 1 x 2TB media drive
Capture: 2 x Colossus
STB Controller: 1 x USB-UIRT
Software:Java 1.7.0_71; SageTV 7.1.9
Clients: 1 x HD300, 2 x HD200, 1 x SageClient, 1 x PlaceShifter
Plugins: Too many to list now...
Reply With Quote
  #569  
Old 04-01-2010, 11:53 AM
nyplayer nyplayer is offline
SageTVaholic
 
Join Date: Sep 2005
Posts: 4,997
Slugger,

This is just a general question is the first check in 3.0 against the SQLITE db to see if a job ran already for a specific media file?.
__________________
Channels DVR UBUNTU Server 2 Primes 3 Connects TVE SageTV Docker with input from Channels DVR XMLTV and M3U VIA Opendct.
Reply With Quote
  #570  
Old 04-01-2010, 01:25 PM
Slugger Slugger is offline
SageTVaholic
 
Join Date: Mar 2007
Location: Kingston, ON
Posts: 4,008
Quote:
Originally Posted by nyplayer View Post
Slugger,

This is just a general question is the first check in 3.0 against the SQLITE db to see if a job ran already for a specific media file?.
No, that's the last check. Why? Because the ruleset is interpreted for each media file as they're being processed. In hindsight, a very poor design decision, which adversely affects the performance of the QueueLoader process, but by the time I had realized this it was too late (in the sense that I didn't want to start over). At the time (spring 2007), I really didn't expect there to be any other users of SJQ other than myself so redesigning the core queue loader process really wasn't at the top of my todo list. The issue was in the back of my mind to fix for v2 and then again for v3, but to be honest, I don't get paid enough to re-engineer such a core feature that does work as intended, though hardly an optimal/efficient solution.

For anyone interested, a proper fix would require something along the lines of "prescanning"/"compiling" the ruleset in order to discover which tasks are defined and then while looping through the objects to be scanned, you do the SQLite lookup first for each defined task and skip over processing rulesets for those tasks that have already been completed. There are gotchas all over the place though - mainly to do with the situation where a rule defines more than one task. In this case you may still have to proceed with the entire test block evaluation because one or more of the tasks could possibly still be added to the queue even though at least one may have already been processed. This is just one exception that I thought of way back when. I'm sure many more exist and so now you can see why the less efficient, but time tested interpreted ruleset algorithm remains in place.

With all that said, I'm willing to accept a patch from anyone willing to tackle this issue. I'd be willing to speculate a proper patch would reduce the avg run time of the QueueLoader from ~2s/1000 media files to probably <250ms/1000 media files (Q6600 CPU). That's only a guess. I can say with certainly that a significant gain of some kind would be seen.

I suppose some day my media library may get big enough that a fix will almost be required for my system. If that day does come then I suppose I'll fix it, but given that this is a background process and I really don't want to fix it, it seems unlikely that I'd fix it anytime soon.

(nyplayer, I know you weren't asking for it to be fixed or even suggesting that it may be broken, but since you brought it up I felt compelled to confess my long standing knowledge on this issue.)
__________________
Twitter: @ddb_db
Server: Intel i5-4570 Quad Core, 16GB RAM, 1 x 128GB OS SSD (Win7 Pro x64 SP1), 1 x 2TB media drive
Capture: 2 x Colossus
STB Controller: 1 x USB-UIRT
Software:Java 1.7.0_71; SageTV 7.1.9
Clients: 1 x HD300, 2 x HD200, 1 x SageClient, 1 x PlaceShifter
Plugins: Too many to list now...
Reply With Quote
  #571  
Old 04-01-2010, 09:29 PM
davephan's Avatar
davephan davephan is offline
Sage Icon
 
Join Date: Mar 2004
Location: Minnesota
Posts: 1,911
My SJQ and SJQ client are both installed on my SageTV computer. The client is installed as a service. I was thinking of installing a SJQ client as a service on another computer to do more Comskip processing streams, and offload the CPU load onto another computer. The second computer does not have SageTV installed on it.

My current SJQ client connects with 127.0.0.1. I assume that I would need to configure the remote computer's SJQ IP address somewhere. The SageTV drive letters are mapped on the remote computer, with the same drive letters.

Dave
Reply With Quote
  #572  
Old 04-01-2010, 10:19 PM
Fuzzy's Avatar
Fuzzy Fuzzy is offline
SageTVaholic
 
Join Date: Sep 2005
Location: Jurupa Valley, CA
Posts: 9,957
You just have to make sure the client can find the sjq server, and have that ip and port specified in the client's .ini file. Also, you have to make sure the client can access the recordings as well. You can either always use UNC paths for everything (recommended), or if no, use can use the :MAPDIR directive in the client to redirect the path the server sees teh file at (where sage tells it the file is) to a path the client can see that file at.
__________________
Buy Fuzzy a beer! (Fuzzy likes beer)

unRAID Server: i7-6700, 32GB RAM, Dual 128GB SSD cache and 13TB pool, with SageTVv9, openDCT, Logitech Media Server and Plex Media Server each in Dockers.
Sources: HRHR Prime with Charter CableCard. HDHR-US for OTA.
Primary Client: HD-300 through XBoxOne in Living Room, Samsung HLT-6189S
Other Clients: Mi Box in Master Bedroom, HD-200 in kids room
Reply With Quote
  #573  
Old 04-03-2010, 06:42 PM
Brent Brent is offline
SageTVaholic
 
Join Date: May 2006
Location: KC, Missouri
Posts: 3,695
Guys, I'm doing a little SJQ writeup on GeekTonic and I'm interested in how everyone is using it. Do you use it with comskip, showanalyzer, and/or some other tool? Let me know and I'll include that use case in the writeup.

Thanks!
Reply With Quote
  #574  
Old 04-03-2010, 07:04 PM
KarylFStein KarylFStein is offline
Sage Fanatic
 
Join Date: Apr 2006
Location: Westland, Michigan, USA
Posts: 999
I don't do this (yet), but someone else mentioned that they use it to move recordings to a NAS after they're done recording. I thought that was pretty cool as you could let your NAS do what it's good at and not try to stick SageTV + supporting pieces on it.
__________________
Home Network: https://karylstein.com/technology.html
Reply With Quote
  #575  
Old 04-03-2010, 07:06 PM
ewelin ewelin is offline
Sage Advanced User
 
Join Date: Sep 2008
Location: Cambridge, MA
Posts: 165
Send a message via AIM to ewelin Send a message via MSN to ewelin Send a message via Yahoo to ewelin
I use it with comskip to process all of the recordings except for ones on PBS, HDNET and other channels which do not have commercials. I also have it set to reschedule a recording if it was recorded in SD and there is an HD airing coming up. The other task I have it complete is that it automatically deletes any Family Guy episodes that were recorded on a local broadcast channel simply because they are always in SD even though the guide say it's in HD.
Reply With Quote
  #576  
Old 04-03-2010, 07:20 PM
Slugger Slugger is offline
SageTVaholic
 
Join Date: Mar 2007
Location: Kingston, ON
Posts: 4,008
I use it to run ShowAnalyzer. I also use it to call BMT for fanart. I also use the internal SJQ _MOVEREC task to move selected recordings from the server's local recording drives onto my NAS (w/o the need to stop Sage). I also call MediaShrink, and the _RELINK task to relink those recordings that I've transcoded with MediaShrink.
__________________
Twitter: @ddb_db
Server: Intel i5-4570 Quad Core, 16GB RAM, 1 x 128GB OS SSD (Win7 Pro x64 SP1), 1 x 2TB media drive
Capture: 2 x Colossus
STB Controller: 1 x USB-UIRT
Software:Java 1.7.0_71; SageTV 7.1.9
Clients: 1 x HD300, 2 x HD200, 1 x SageClient, 1 x PlaceShifter
Plugins: Too many to list now...
Reply With Quote
  #577  
Old 04-03-2010, 07:23 PM
ewelin ewelin is offline
Sage Advanced User
 
Join Date: Sep 2008
Location: Cambridge, MA
Posts: 165
Send a message via AIM to ewelin Send a message via MSN to ewelin Send a message via Yahoo to ewelin
Quote:
Originally Posted by Slugger View Post
I also use it to call BMT for fanart.
that's a great idea!!! Would you mind sharing yoru code for that?
Reply With Quote
  #578  
Old 04-03-2010, 07:42 PM
skiingwiz skiingwiz is offline
Sage Aficionado
 
Join Date: Jan 2005
Posts: 366
I use it to remove the manual recording flag from anything that has been watched. (If I want to keep it, I archive it. I don't like manual recordings not being auto-deleted.)
Reply With Quote
  #579  
Old 04-03-2010, 07:50 PM
Slugger Slugger is offline
SageTVaholic
 
Join Date: Mar 2007
Location: Kingston, ON
Posts: 4,008
Quote:
Originally Posted by ewelin View Post
that's a great idea!!! Would you mind sharing yoru code for that?
Ruleset:

Code:
# Download fanart as needed
if [IsObjMediaFile == true && $.GetShowExternalID{} !% "(?:SP|MV).*" && $.GetShowExternalID{} != "NoShow" && $.IsTVFile{} == true && ($.GetShowCategory{} !% "Special|Standup|Documentary" || $.GetShowSubCategory{} !% "Special|Standup|Documentary") && FileExists != "D:/FANART/TV/$.GetShowTitle{}" && ($.IsManualRecord{} == true || $.IsFavorite{} == true) && $.IsLibraryFile{} == false] {
   :PRIORITY -5
   TVMETADATA
}
Client config:

Code:
TVMETADATA {
   :RESOURCES 5
   "\"C:/Program Files/SageTV/SageTV/bmt.bat\" \"%c%\""
}
bmt.bat:

Code:
@echo off

C:
cd C:\Program Files\SageTV\SageTV
java -jar metadatatool.jar --fanartOnly --auto=true --prompt=false %1
Notes: I'm using an older version of BMT (3.x, I think?).

The ruleset skips movies because the BMT call never seems to work for movies for whatever reason. I also skip some other types of recordings (documentaries, specials, manual recordings, etc.). Finally, some shows will always run the BMT call because the show name contains special characters and so the dir name won't match the $.GetShowTitle{} string and so SJQ will always run it.
__________________
Twitter: @ddb_db
Server: Intel i5-4570 Quad Core, 16GB RAM, 1 x 128GB OS SSD (Win7 Pro x64 SP1), 1 x 2TB media drive
Capture: 2 x Colossus
STB Controller: 1 x USB-UIRT
Software:Java 1.7.0_71; SageTV 7.1.9
Clients: 1 x HD300, 2 x HD200, 1 x SageClient, 1 x PlaceShifter
Plugins: Too many to list now...
Reply With Quote
  #580  
Old 04-03-2010, 08:32 PM
nyplayer nyplayer is offline
SageTVaholic
 
Join Date: Sep 2005
Posts: 4,997
I use it to move diff favorites to other folders and drives... kids wife etc... archive to NAS.

Reboot server once a week when nothing is recording... also reboot clients.

Run Videoredo qfix and cut commercials.
__________________
Channels DVR UBUNTU Server 2 Primes 3 Connects TVE SageTV Docker with input from Channels DVR XMLTV and M3U VIA Opendct.

Last edited by nyplayer; 04-03-2010 at 08:48 PM.
Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Sage Job Queue (SJQ) new release notifications Slugger Customization Announcements 3 12-17-2009 09:59 AM
Plugin: Sage Job Queue (SJQ) Slugger SageTV Customizations 991 12-11-2009 03:52 PM
Sage Job Queue Completed tasks problem raffmanlt SageTV Customizations 2 08-18-2009 07:34 PM
Comskip Monitor VS Sage Job Queue SJQ personalt SageTV Customizations 6 03-02-2009 10:27 AM
Plugin: SJQ v1.1.0RC1 Available - Testers Needed Slugger SageTV Customizations 35 04-21-2008 08:12 AM


All times are GMT -6. The time now is 02:32 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2023, vBulletin Solutions Inc.
Copyright 2003-2005 SageTV, LLC. All rights reserved.