Index: SapphireFrappliance/Players/SapphireMedia.h
===================================================================
--- SapphireFrappliance/Players/SapphireMedia.h	(revision 823)
+++ SapphireFrappliance/Players/SapphireMedia.h	(working copy)
@@ -27,6 +27,7 @@
 @interface SapphireMedia : BRXMLMediaAsset {
 	unsigned int		resumeTime;		/*!< @brief The resume time to use, 0 to use super*/
 	NSString			*imagePath;		/*!< @brief The cover art path to use, nil to use super*/
+	NSImage				*coverart;		/*!< @brief The cover art as image data */
 }
 
 /*!
@@ -51,4 +52,11 @@
  */
 - (void)setImagePath:(NSString *)path;
 
+/*!
+ * @brief Sets the image for cover art so it can be displayed
+ *
+ * param[in] image The cover art as an NSImage object
+ */
+- (void)setImage:(NSImage *)image;
+
 @end
Index: SapphireFrappliance/Players/SapphireMedia.m
===================================================================
--- SapphireFrappliance/Players/SapphireMedia.m	(revision 823)
+++ SapphireFrappliance/Players/SapphireMedia.m	(working copy)
@@ -19,6 +19,7 @@
  */
 
 #import "SapphireMedia.h"
+#import "NSImage-Extensions.h"
 #import <SapphireCompatClasses/SapphireFrontRowCompat.h>
 
 @implementation SapphireMedia
@@ -39,6 +40,7 @@
 - (void)dealloc
 {
 	[imagePath release];
+	[coverart release];
 	[super dealloc];
 }
 
@@ -63,6 +65,12 @@
 	imagePath = [path retain];
 }
 
+- (void)setImage:(NSImage *)image
+{
+	[coverart release];
+	coverart = [image retain];
+}
+
 - (id)mediaType
 {
 	if([SapphireFrontRowCompat usingFrontRow])
@@ -78,7 +86,13 @@
 
 - (id)coverArt
 {
-	return [SapphireFrontRowCompat imageAtPath:imagePath];
+	if (imagePath)
+		return [SapphireFrontRowCompat imageAtPath:imagePath];
+	
+	if (coverart)
+		return [SapphireFrontRowCompat coverartAsImage:[coverart asImageRef]];
+
+	return nil;
 }
 
 @end
Index: SapphireFrappliance/Browser/SapphireMarkMenu.m
===================================================================
--- SapphireFrappliance/Browser/SapphireMarkMenu.m	(revision 823)
+++ SapphireFrappliance/Browser/SapphireMarkMenu.m	(working copy)
@@ -32,7 +32,20 @@
 #import "SapphireWaitDisplay.h"
 #import "SapphireConfirmPrompt.h"
 #import "SapphireApplianceController.h"
+#import "SapphirePosterChooser.h"
+#import "NSImage-Extensions.h"
+#import "NSFileManager-Extensions.h"
 
+BOOL allowCoverArtChange( NSString * const path )
+{
+	if ( [[NSFileManager defaultManager] hasVIDEO_TS:path] )
+		return NO;
+	
+	const NSSet * const disallowedFormats = [[NSSet alloc] initWithObjects:@"mkv", @"flv", nil];
+	
+	return ![disallowedFormats containsObject:[path pathExtension]];
+}
+
 @implementation SapphireMarkMenu
 
 NSString *MARK_NAME					= @"Name";
@@ -50,6 +63,7 @@
 	COMMAND_RENAME_TO_PRETTY,
 	COMMAND_CUT_PATH,
 	COMMAND_DELETE_PATH,
+	COMMAND_CHANGE_ARTWORK,
 	//File Only Commands
 	COMMAND_MARK_TO_JOIN,
 	COMMAND_MARK_AND_JOIN,
@@ -364,6 +378,16 @@
 				BRLocalizedString(@"Deletes this file", @""), MARK_DESCRIPTION,
 				[NSNumber numberWithInt:COMMAND_DELETE_PATH], MARK_COMMAND,
 				nil]];
+		// Allow cover art change for all formats except for DVD and .mkv
+		if ( allowCoverArtChange( [meta path] ) )
+		{
+			[marks addObject:
+				[NSDictionary dictionaryWithObjectsAndKeys:
+					BRLocalizedString(@"Change artwork", @"Change artwork"), MARK_NAME,
+					BRLocalizedString(@"Select displayed artwork", @""), MARK_DESCRIPTION,
+					[NSNumber numberWithInt:COMMAND_CHANGE_ARTWORK], MARK_COMMAND,
+					nil]];
+		}
 	}
 	else
 	{
@@ -383,6 +407,19 @@
 	[super dealloc];
 }
 
+- (NSController *)doChangeArtwork:(SapphireFileMetaData *)fileMeta
+{
+	SapphirePosterChooser *controller = [[SapphirePosterChooser alloc] initWithScene:[self scene]];
+
+	[controller setListTitle:BRLocalizedString(@"Select cover art", @"Select cover art")];
+	[controller setMovieTitle:@" "];
+	[controller setFile:fileMeta];
+	[controller setPosterImages:[NSImage imagesFromMovie:[fileMeta path] forArraySize:10]];
+	[controller allowRefresh:YES];
+	
+	return [controller autorelease];
+}
+
 - (NSController *)doJoin:(SapphireWaitDisplay *)wait
 {
 	@try {
@@ -703,6 +740,21 @@
 				
 				replaceController = [confirm autorelease];
 			}
+				break;
+			case COMMAND_CHANGE_ARTWORK:
+			{
+				NSInvocation *invoke = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector: @selector(doChangeArtwork:)]];
+				[invoke setSelector: @selector(doChangeArtwork:)];
+				[invoke setTarget:   self];
+				
+				SapphireWaitDisplay *wait = [[SapphireWaitDisplay alloc] initWithScene: [self scene]
+																				 title: BRLocalizedString(@"Getting artwork selection", @"Getting artwork selection")
+																			invokation: invoke];
+				
+				[invoke setArgument: &metaData atIndex: 2];
+				
+				replaceController = [wait autorelease];
+			}
 		}
 	}
 	/*Save and exit*/
Index: SapphireFrappliance/Sapphire.xcodeproj/project.pbxproj
===================================================================
--- SapphireFrappliance/Sapphire.xcodeproj/project.pbxproj	(revision 823)
+++ SapphireFrappliance/Sapphire.xcodeproj/project.pbxproj	(working copy)
@@ -53,6 +53,7 @@
 		38FAF9B60C0129E400853CFE /* BackRow.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38FAF9B50C0129E400853CFE /* BackRow.framework */; };
 		38FAFC320C012A7800853CFE /* SapphireAppliance.m in Sources */ = {isa = PBXBuildFile; fileRef = 38FAFC2F0C012A7800853CFE /* SapphireAppliance.m */; };
 		38FAFC330C012A7800853CFE /* SapphireBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 38FAFC310C012A7800853CFE /* SapphireBrowser.m */; };
+		805420AA0F94FA7E002D2DBF /* NSImage-Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 805420A90F94FA7E002D2DBF /* NSImage-Extensions.m */; };
 		8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };
 		F500400B0D1998B4003FEA08 /* SapphireLeopardOnly.h in Headers */ = {isa = PBXBuildFile; fileRef = F50040090D1998B4003FEA08 /* SapphireLeopardOnly.h */; };
 		F500400C0D1998B4003FEA08 /* SapphireLeopardOnly.m in Sources */ = {isa = PBXBuildFile; fileRef = F500400A0D1998B4003FEA08 /* SapphireLeopardOnly.m */; };
@@ -357,6 +358,8 @@
 		38FAFC2F0C012A7800853CFE /* SapphireAppliance.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SapphireAppliance.m; sourceTree = "<group>"; };
 		38FAFC300C012A7800853CFE /* SapphireAppliance.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SapphireAppliance.h; sourceTree = "<group>"; };
 		38FAFC310C012A7800853CFE /* SapphireBrowser.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SapphireBrowser.m; sourceTree = "<group>"; };
+		805420A80F94FA7E002D2DBF /* NSImage-Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage-Extensions.h"; sourceTree = "<group>"; };
+		805420A90F94FA7E002D2DBF /* NSImage-Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage-Extensions.m"; sourceTree = "<group>"; };
 		8D5B49B6048680CD000E48DA /* Sapphire.frappliance */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Sapphire.frappliance; sourceTree = BUILT_PRODUCTS_DIR; };
 		8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		F5003FF90D19980B003FEA08 /* LeopardOnly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LeopardOnly.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -823,6 +826,8 @@
 				F571B7AD0E9C360500B7FD9D /* NSManagedObject-Extensions.m */,
 				F56B74D40C3753E300E934AA /* NSString-Extensions.h */,
 				F56B74D50C3753E300E934AA /* NSString-Extensions.m */,
+				805420A80F94FA7E002D2DBF /* NSImage-Extensions.h */,
+				805420A90F94FA7E002D2DBF /* NSImage-Extensions.m */,
 			);
 			path = Extension;
 			sourceTree = "<group>";
@@ -1353,6 +1358,7 @@
 				F58C52230F13B18F00DE7A65 /* SapphireTextEntryController.m in Sources */,
 				F52E4E2F0F4397D700AC6C52 /* SapphireWaitDisplay.m in Sources */,
 				F52E4EAA0F43B53F00AC6C52 /* SapphireConfirmPrompt.m in Sources */,
+				805420AA0F94FA7E002D2DBF /* NSImage-Extensions.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
Index: SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.h
===================================================================
--- SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.h	(revision 823)
+++ SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.h	(working copy)
@@ -41,9 +41,17 @@
 	BRMarchingIconLayer		*posterMarch;	/*!< @brief The icon march to display the posters*/
 	BRBlurryImageLayer		*defaultImage;	/*!< @brief The image to use when the poster isn't loaded yet*/
 	SapphireFileMetaData	*meta;			/*!< @brief The file's meta*/
+	BOOL                     allowRefresh;	/*!< @brief Should the chooser allow a refresh of the available cover art*/
 }
 
 /*!
+ * @brief Set if this chooser should allow a refresh option
+ *
+ * @param[in] allow  Yes or no flag
+ */
+- (void)allowRefresh: (BOOL)allow;
+
+/*!
  * @brief check ATV version & poster chooser opt out
  *
  * @return The YES if we can display 
@@ -60,11 +68,18 @@
 /*!
  * @brief Sets the posters to choose from
  *
- * @param posterList The list of movies to choose from
+ * @param posterList The list of movies to choose from specified as paths
  */
 - (void)setPosters:(NSArray *)posterList;
 
 /*!
+ * @brief Sets the posters to choose from
+ *
+ * @param posterList The cover art to choose from specified as image objects
+ */
+- (void)setPosterImages:(const NSArray *)posterList;
+
+/*!
  * @brief Loads the posters from disk
  */
 - (void)loadPosters;
Index: SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.m
===================================================================
--- SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.m	(revision 823)
+++ SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.m	(working copy)
@@ -24,10 +24,13 @@
 #import "SapphireMediaPreview.h"
 #import "SapphireMedia.h"
 #import "SapphireMetaData.h"
+#import "SapphireWaitDisplay.h"
 #import "SapphireDirectoryMetaData.h"
 #import <SapphireCompatClasses/SapphireFrontRowCompat.h>
 #import "SapphireApplianceController.h"
 
+#import "NSImage-Extensions.h"
+
 NSData *CreateBitmapDataFromImage(CGImageRef image, unsigned int width, unsigned int height);
 
 @interface BRListControl (definedin1_1)
@@ -93,6 +96,11 @@
 	[super dealloc];
 }
 
+- (void)allowRefresh: (BOOL)allow
+{
+	allowRefresh = allow;
+}
+
 - (void) resetLayout
 {
     [super resetLayout];
@@ -146,19 +154,40 @@
 	return listFrame;
 }
 
+- (NSController *)doChangeArtwork
+{
+	SapphirePosterChooser *controller = [[SapphirePosterChooser alloc] initWithScene:[self scene]];
+	
+	[controller setListTitle:BRLocalizedString(@"Select cover art", @"Select cover art")];
+	[controller setMovieTitle:@" "];
+	[controller setFile:meta];
+	[controller setPosterImages:[NSImage imagesFromMovie:[meta path] forArraySize:[posters count]]];
+	[controller allowRefresh:YES];
+	
+	return [controller autorelease];
+}
+
 - (void) itemSelected: (long) row
 {
 	/*User made a selection*/
-	//	if(selection==0)
-	//	{
-	/*User requested a menu refresh*/
-	//		[self resetLayout];
-	//	}
-	//	else
-	//	{
-	selectedPoster = row;
-	[[self stack] popController];
-	//	}
+	if ( allowRefresh && row == [posters count] )
+	{
+		NSInvocation *invoke = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector: @selector(doChangeArtwork)]];
+		[invoke setSelector: @selector(doChangeArtwork)];
+		[invoke setTarget:   self];
+		
+		SapphireWaitDisplay *wait = [[SapphireWaitDisplay alloc] initWithScene: [self scene]
+																		 title: BRLocalizedString(@"Getting artwork selection", @"Getting artwork selection")
+																	invokation: invoke];
+		[[self stack] swapController:wait];
+	}
+	else
+	{
+		selectedPoster = row;
+		if ( [[posters objectAtIndex:selectedPoster] isKindOfClass:[NSImage class]] )
+			[[posters objectAtIndex:row] writeToFile:[meta coverArtPath] atomically:YES];
+		[[self stack] popController];
+	}
 }
 
 - (BOOL)okayToDisplay
@@ -187,6 +216,16 @@
 	[[self list] setDatasource:self];
 }
 
+- (void)setPosterImages:(const NSArray *)posterList
+{
+	posters = [posterList retain];
+
+	[posterMarch release];
+	posterMarch = nil;
+
+	[[self list] setDatasource: self];
+}
+
 - (void)loadPosters
 {
 	int i, count = [posters count];
@@ -273,6 +312,9 @@
 
 - (long) itemCount
 {
+	if ( allowRefresh ) 
+		return [posters count] + 1;
+	
 	return [posters count];
 }
 
@@ -280,10 +322,10 @@
 - (id) itemForRow: (long) row
 {
 	BRAdornedMenuItemLayer *result = [SapphireFrontRowCompat textMenuItemForScene:[self scene] folder:NO];
-	//	if(row==0)
-	//		[SapphireFrontRowCompat setTitle:BRLocalizedString(@"< Refresh Posters >", @"Reload poster images") forMenu:result];
-	//	else
-	[SapphireFrontRowCompat setTitle:[NSString stringWithFormat:@"Version %2d",row+1] forMenu:result];
+	if ( allowRefresh && row == [posters count] )
+		[SapphireFrontRowCompat setTitle:BRLocalizedString(@"Refresh", @"Reload images") forMenu:result];
+	else
+		[SapphireFrontRowCompat setTitle:[NSString stringWithFormat:@"Version %2d",row+1] forMenu:result];
 	return result;
 }
 
@@ -291,8 +333,11 @@
 {
 	if(row > [posters count])
 		return nil;
-	else
-		return [NSString stringWithFormat:@"Version %2d",row+1];
+
+	if (allowRefresh && row == [posters count])
+		return BRLocalizedString(@"Refresh", @"Reload images");
+
+	return [NSString stringWithFormat:@"Version %2d",row+1];
 }
 
 - (long) rowForTitle: (NSString *) title
@@ -437,20 +482,38 @@
 {
 	if(posterMarch != nil)
 		return nil;
+
 	SapphireMediaPreview *preview = [[SapphireMediaPreview alloc] initWithScene:[self scene]];
-	SapphireMedia *asset = [[SapphireMedia alloc] initWithMediaURL:[NSURL fileURLWithPath:@"none"]];
-	NSString *poster = [posters objectAtIndex:row];
-	NSString *posterDest=[NSString stringWithFormat:@"%@/%@",
-						  [applicationSupportDir() stringByAppendingPathComponent:@"Poster_Buffer"],
-						  [poster lastPathComponent]];
-	[preview setShowsMetadataImmediately:NO];
-	SapphireDirectoryMetaData *parent = [meta parent];
-	[preview setMetaData:meta inMetaData:parent];
 	[preview setShowsMetadataImmediately:YES];
-	[asset setImagePath:posterDest];
-	[preview setAsset:asset];
-	[asset release];
 	
+	if ( row < [posters count] )
+	{
+		[preview setMetaData:meta inMetaData:[meta parent]];
+		
+		SapphireMedia *asset = [[SapphireMedia alloc] initWithMediaURL:[NSURL fileURLWithPath:@"none"]];
+		id poster = [posters objectAtIndex:row];
+
+		if ( [poster isKindOfClass:[NSString class]] )
+		{
+			NSString *posterDest = [NSString stringWithFormat:@"%@/%@",	[applicationSupportDir() stringByAppendingPathComponent:@"Poster_Buffer"],
+																		[poster lastPathComponent]];
+			[asset setImagePath: posterDest];
+		}
+		else
+		{
+			[asset setImage: poster];
+		}
+
+		[preview setAsset:asset];
+		[asset release];
+	}
+	else if ( row == [posters count] )
+	{
+		NSMutableDictionary *refreshMeta = [[NSMutableDictionary alloc] init];
+		[refreshMeta setObject: BRLocalizedString( @"Refresh the artwork selection", @"Refresh the artwork selection" ) forKey: META_TITLE_KEY];
+		[preview setUtilityData: refreshMeta];
+	}
+
 	return [preview autorelease];
 }
 
Index: SapphireFrappliance/MetaDataImporting/SapphireMovieImporter.m
===================================================================
--- SapphireFrappliance/MetaDataImporting/SapphireMovieImporter.m	(revision 823)
+++ SapphireFrappliance/MetaDataImporting/SapphireMovieImporter.m	(working copy)
@@ -706,7 +706,6 @@
 		lookupName = [[path stringByDeletingLastPathComponent] lastPathComponent];
 	else
 		lookupName = fileName;
-	
 	/*Get the movie title*/
 	NSString *movieDataLink = nil ;
 	/*Check to see if we know this movie*/
Index: SapphireFrappliance/MetaDataImporting/SapphireTVShowImporter.m
===================================================================
--- SapphireFrappliance/MetaDataImporting/SapphireTVShowImporter.m	(revision 823)
+++ SapphireFrappliance/MetaDataImporting/SapphireTVShowImporter.m	(working copy)
@@ -28,7 +28,9 @@
 #import "SapphireTVTranslation.h"
 #import "SapphireEpisode.h"
 #import "SapphireSettings.h"
+#import "NSImage-Extensions.h"
 
+
 /* TVRage XPATHS  */
 #define TVRAGE_SHOWNAME_XPATH @".//font[@size=2][@color=\"white\"]/b/text()"
 #define TVRAGE_EPLIST_XPATH @"//*[@class='b']"
@@ -630,10 +632,7 @@
 	SapphireLog(SAPPHIRE_LOG_IMPORT, SAPPHIRE_LOG_LEVEL_DETAIL, @"Import info is %@", info);
 		
 	/* Lets process the cover art directory structure */
-	NSString * previewArtPath=[NSString stringWithFormat:@"%@/@TV/%@/%@",
-									[SapphireMetaDataSupport collectionArtPath],
-									[info objectForKey:META_SHOW_NAME_KEY],
-									[NSString stringWithFormat:@"Season %d",[[info objectForKey:META_SEASON_NUMBER_KEY] intValue]]];
+	NSString * previewArtPath = [NSFileManager previewArtPathForTV:[info objectForKey:META_SHOW_NAME_KEY] season:[[info objectForKey:META_SEASON_NUMBER_KEY] intValue]];
 						
 	[[NSFileManager defaultManager] constructPath:previewArtPath];
 	/*Check for screen cap locally and on server*/
@@ -655,6 +654,11 @@
 		[[[NSURLDownload alloc] initWithRequest:request delegate:myDelegate] autorelease];
 		[myDelegate release];
 	}
+	else if( !imageExists )
+	{
+		if ( [metaData fileContainerTypeValue ] == FILE_CONTAINER_TYPE_QT_MOVIE )
+			[[NSImage imageFromMovie:path] writeToFile:imageDestination atomically:YES];
+	}
 	
 	/*Import the info*/
 	[info removeObjectForKey:LINK_KEY];
Index: SapphireFrappliance/MetaDataImporting/SapphireXMLFileDataImporter.m
===================================================================
--- SapphireFrappliance/MetaDataImporting/SapphireXMLFileDataImporter.m	(revision 823)
+++ SapphireFrappliance/MetaDataImporting/SapphireXMLFileDataImporter.m	(working copy)
@@ -22,6 +22,7 @@
 #import "SapphireFileMetaData.h"
 #import "SapphireMediaPreview.h"
 #import "SapphireXMLData.h"
+#import "NSImage-Extensions.h"
 #include <sys/types.h>
 #include <sys/stat.h>
 
@@ -45,6 +46,8 @@
 #define SEARCH_SEC_EPISODE_XML_QUERY	@"/media/searchSecondEpisode/text()"
 #define SEARCH_EPISODE_XML_QUERY	@"/media/searchEpisode/text()"
 #define SEARCH_IMDB_XML_QUERY		@"/media/searchIMDB/text()"
+#define SCREENCAP_XML_QUERY			@"/media/imageTime/text()"
+
 //Multi Attributes		
 #define TITLE_XML_QUERY				@"/media/title/text()"
 #define GENRES_XML_QUERY			@"/media/genres/genre/text()"
@@ -176,6 +179,19 @@
 		[newMetaData setObject:newData forKey:[xmlMultiAttributes objectForKey:key]] ;
 	}
 	/*Special cases*/
+	/* Screen Cap */
+	NSArray *imageCaps = [root objectsForXQuery:SCREENCAP_XML_QUERY error:&error];
+	if ( [imageCaps count] && [metaData fileContainerType] == FILE_CONTAINER_TYPE_QT_MOVIE )
+	{
+		unsigned int hour;
+		unsigned int minute;
+		unsigned int second;
+		
+		sscanf( [[[imageCaps objectAtIndex:0] stringValue] cString], "%u:%u:%u", &hour, &minute, &second );
+		const NSData * image = [NSImage imageFromMovie: [metaData path] atTime: ((60*60*hour) + (60*minute) + second)];
+		[image writeToFile:[metaData coverArtPath] atomically:YES];
+	}
+
 	/*The air date*/
 	NSString *value = [newMetaData objectForKey:META_SHOW_AIR_DATE];
 	if(value != nil)
Index: SapphireFrappliance/Extension/NSFileManager-Extensions.m
===================================================================
--- SapphireFrappliance/Extension/NSFileManager-Extensions.m	(revision 823)
+++ SapphireFrappliance/Extension/NSFileManager-Extensions.m	(working copy)
@@ -19,6 +19,7 @@
  */
 
 #import "NSFileManager-Extensions.h"
+#import "SapphireMetaDataSupport.h"
 
 @implementation NSFileManager (SapphireExtensions)
 - (BOOL)constructPath:(NSString *)proposedPath
@@ -122,4 +123,10 @@
 	return ([self isDirectory:path] || [self hasVIDEO_TS:path] || [allExtensions containsObject:[path pathExtension]]);
 }
 
++ (NSString *)previewArtPathForTV:(NSString *)show season:(unsigned int)seasonNum
+{
+	return [NSString stringWithFormat:@"%@/@TV/%@/%@",	[SapphireMetaDataSupport collectionArtPath],
+														show,
+														[NSString stringWithFormat:@"Season %d", seasonNum]];
+}
 @end
Index: SapphireFrappliance/Extension/NSFileManager-Extensions.h
===================================================================
--- SapphireFrappliance/Extension/NSFileManager-Extensions.h	(revision 823)
+++ SapphireFrappliance/Extension/NSFileManager-Extensions.h	(working copy)
@@ -71,4 +71,13 @@
  */
 - (BOOL)acceptFilePath:(NSString *)path;
 
+/*!
+ * @brief Returns the cover art path for a TV show & season
+ *
+ * @param[in] show      TV Show name
+ * @param[in] seasonNum Season number
+ *
+ * @return cover art path
+ */
++ (NSString *)previewArtPathForTV:(NSString *)show season:(unsigned int)seasonNum;
 @end
Index: SapphireCompatibilityClasses/SapphireFrontRowCompat.h
===================================================================
--- SapphireCompatibilityClasses/SapphireFrontRowCompat.h	(revision 823)
+++ SapphireCompatibilityClasses/SapphireFrontRowCompat.h	(working copy)
@@ -87,6 +87,16 @@
 + (id)imageAtPath:(NSString *)path scene:(BRRenderScene *)scene;
 
 /*!
+ * @brief Load an image from an Image Ref
+ *
+ * This returns a CGImageRef or a BRImage, depending on platform.
+ *
+ * @param[in]   imageRef  CGImageRef
+ * @return  BRImage on FrontRow of CGImageRef on ATV
+ */
++ (id)coverartAsImage: (CGImageRef)imageRef;
+
+/*!
  * @brief Get a menu text menu item
  *
  * Menu items are of different classes on the ATV and in frontrow.
Index: SapphireCompatibilityClasses/SapphireFrontRowCompat.m
===================================================================
--- SapphireCompatibilityClasses/SapphireFrontRowCompat.m	(revision 823)
+++ SapphireCompatibilityClasses/SapphireFrontRowCompat.m	(working copy)
@@ -168,6 +168,17 @@
   }
 }
 
++ (id)coverartAsImage: (CGImageRef)imageRef
+{
+	// Non-FR - return CGImageRef
+	if (!usingFrontRow)
+		return (id)imageRef;
+
+	// FR - return BRImage
+	Class cls = NSClassFromString(@"BRImage");
+	return (id)[cls imageWithCGImageRef:imageRef];
+}
+
 + (BRAdornedMenuItemLayer *)textMenuItemForScene:(BRRenderScene *)scene folder:(BOOL)folder
 {
 	if(usingFrontRow)

