2011-02-03 22:46:54 +01:00
# include <gccore.h>
# include <string.h>
# include "ImageDownloader.h"
# include "network/networkops.h"
# include "prompts/PromptWindows.h"
# include "prompts/ProgressWindow.h"
# include "prompts/CheckboxPrompt.hpp"
# include "FileOperations/fileops.h"
# include "settings/CSettings.h"
# include "settings/GameTitles.h"
# include "language/gettext.h"
# include "usbloader/GetMissingGameFiles.hpp"
# include "utils/StringTools.h"
# include "gecko.h"
# define VALID_IMAGE(x) (!(x.size == 36864 || x.size <= 1024 || x.size == 7386 || x.size <= 1174 || x.size == 4446 || x.data == NULL))
2011-10-21 20:48:10 +02:00
static const char * serverURL3D = " http://art.gametdb.com/wii/cover3D/ " ;
static const char * serverURL2D = " http://art.gametdb.com/wii/cover/ " ;
static const char * serverURLFullHQ = " http://art.gametdb.com/wii/coverfullHQ/ " ;
static const char * serverURLFull = " http://art.gametdb.com/wii/coverfull/ " ;
static const char * serverURLOrigDiscs = " http://art.gametdb.com/wii/disc/ " ;
static const char * serverURLCustomDiscs = " http://art.gametdb.com/wii/disccustom/ " ;
2011-02-03 22:46:54 +01:00
void ImageDownloader : : DownloadImages ( )
{
2011-07-26 00:28:22 +02:00
int choice = CheckboxWindow ( tr ( " Cover Download " ) , 0 , tr ( " 3D Covers " ) , tr ( " Flat Covers " ) , tr ( " Full HQ Covers " ) , tr ( " Full LQ Covers " ) , tr ( " Original Discarts " ) , tr ( " Custom Discarts " ) ) ; // ask for download choice
if ( choice = = 0 )
return ;
2011-02-03 22:46:54 +01:00
2011-07-26 00:28:22 +02:00
ImageDownloader Downloader ;
Downloader . SetChoices ( choice ) ;
Downloader . Start ( ) ;
2011-02-03 22:46:54 +01:00
}
void ImageDownloader : : Start ( )
{
2011-07-26 00:28:22 +02:00
gprintf ( " CoverDownload start - choices: %04X \n " , choices ) ;
2011-02-03 22:46:54 +01:00
2011-07-26 00:28:22 +02:00
MissingImagesCount = 0 ;
FindMissingImages ( ) ;
2011-02-03 22:46:54 +01:00
2011-07-26 00:28:22 +02:00
if ( MissingImagesCount = = 0 )
{
WindowPrompt ( tr ( " No file missing! " ) , 0 , tr ( " OK " ) ) ;
return ;
}
2011-02-03 22:46:54 +01:00
2011-07-26 00:28:22 +02:00
u32 TotalDownloadCount = MissingImagesCount ;
2011-02-03 22:46:54 +01:00
2011-07-26 00:28:22 +02:00
if ( WindowPrompt ( tr ( " Found missing images. " ) , fmt ( tr ( " %i missing files " ) , TotalDownloadCount ) , tr ( " Yes " ) , tr ( " No " ) ) = = 0 )
return ;
2011-02-03 22:46:54 +01:00
2011-07-26 00:28:22 +02:00
if ( ! IsNetworkInit ( ) & & ! NetworkInitPrompt ( ) )
{
gprintf ( " No network \n " ) ;
return ;
}
2011-02-03 22:46:54 +01:00
2011-10-01 12:41:00 +02:00
ProgressCancelEnable ( true ) ;
2011-02-03 22:46:54 +01:00
2011-07-26 00:28:22 +02:00
DownloadProcess ( TotalDownloadCount ) ;
2011-02-03 22:46:54 +01:00
2011-10-01 12:41:00 +02:00
ProgressCancelEnable ( false ) ;
2011-07-26 00:28:22 +02:00
ProgressStop ( ) ;
2011-02-03 22:46:54 +01:00
2011-07-26 00:28:22 +02:00
if ( MissingImagesCount = = 0 )
WindowPrompt ( tr ( " Download finished " ) , tr ( " All images downloaded successfully. " ) , tr ( " OK " ) ) ;
else
{
int res = WindowPrompt ( tr ( " Download finished " ) , fmt ( tr ( " %i files not found on the server! " ) , MissingImagesCount ) , tr ( " Save List " ) , tr ( " OK " ) ) ;
if ( res )
CreateCSVLog ( ) ;
}
2011-02-03 22:46:54 +01:00
}
void ImageDownloader : : FindMissingImages ( )
{
2011-07-26 00:28:22 +02:00
if ( choices & CheckedBox1 )
FindMissing ( Settings . covers_path , serverURL3D , NULL , tr ( " Downloading 3D Covers " ) ) ;
if ( choices & CheckedBox2 )
FindMissing ( Settings . covers2d_path , serverURL2D , NULL , tr ( " Downloading Flat Covers " ) ) ;
if ( choices & CheckedBox3 )
FindMissing ( Settings . coversFull_path , serverURLFullHQ , ( choices & CheckedBox4 ) ? serverURLFull : NULL , tr ( " Downloading Full HQ Covers " ) ) ;
if ( choices & CheckedBox4 )
FindMissing ( Settings . coversFull_path , serverURLFull , NULL , tr ( " Downloading Full LQ Covers " ) ) ;
if ( choices & CheckedBox5 )
{
const char * downloadURL = ( Settings . discart = = DISCARTS_ORIGINALS_CUSTOMS | | ! ( choices & CheckedBox6 ) ) ? serverURLOrigDiscs : serverURLCustomDiscs ;
const char * backupURL = ( choices & CheckedBox6 ) ? ( ( Settings . discart = = DISCARTS_ORIGINALS_CUSTOMS ) ? serverURLCustomDiscs : serverURLOrigDiscs ) : NULL ;
const char * progressTitle = ( Settings . discart = = DISCARTS_ORIGINALS_CUSTOMS | | ! ( choices & CheckedBox6 ) ) ? tr ( " Downloading original Discarts " ) : tr ( " Downloading custom Discarts " ) ;
FindMissing ( Settings . disc_path , downloadURL , backupURL , progressTitle ) ;
}
if ( choices & CheckedBox6 )
{
const char * downloadURL = ( Settings . discart = = DISCARTS_ORIGINALS_CUSTOMS | | ! ( choices & CheckedBox5 ) ) ? serverURLCustomDiscs : serverURLOrigDiscs ;
const char * progressTitle = ( Settings . discart = = DISCARTS_ORIGINALS_CUSTOMS | | ! ( choices & CheckedBox5 ) ) ? tr ( " Downloading custom Discarts " ) : tr ( " Downloading original Discarts " ) ;
FindMissing ( Settings . disc_path , downloadURL , NULL , progressTitle ) ;
}
2011-02-03 22:46:54 +01:00
}
void ImageDownloader : : FindMissing ( const char * writepath , const char * downloadURL , const char * backupURL , const char * progressTitle )
{
2011-07-26 00:28:22 +02:00
if ( ! CreateSubfolder ( writepath ) )
{
WindowPrompt ( tr ( " Error ! " ) , fmt ( " %s %s " , tr ( " Can't create directory " ) , writepath ) , tr ( " OK " ) ) ;
return ;
}
std : : vector < std : : string > MissingFilesList ;
GetMissingGameFiles ( writepath , " .png " , MissingFilesList ) ;
int size = MissingImages . size ( ) ;
MissingImages . resize ( size + MissingFilesList . size ( ) ) ;
for ( u32 i = 0 , n = size ; i < MissingFilesList . size ( ) ; + + i , + + n )
{
MissingImages [ n ] . gameID = MissingFilesList [ i ] ;
MissingImages [ n ] . downloadURL = downloadURL ;
MissingImages [ n ] . backupURL = backupURL ;
MissingImages [ n ] . writepath = writepath ;
MissingImages [ n ] . progressTitle = progressTitle ;
}
if ( ! backupURL )
MissingImagesCount + = MissingFilesList . size ( ) ;
2011-02-03 22:46:54 +01:00
}
int ImageDownloader : : DownloadProcess ( int TotalDownloadCount )
{
2011-07-26 00:28:22 +02:00
char progressMsg [ 255 ] ;
for ( u32 i = 0 , pos = 0 ; i < MissingImages . size ( ) ; + + i , + + pos )
{
2011-10-01 12:41:00 +02:00
if ( ProgressCanceled ( ) )
2011-07-26 00:28:22 +02:00
break ;
2011-10-21 20:48:10 +02:00
snprintf ( progressMsg , sizeof ( progressMsg ) , " http://gametdb.com : %s.png " , MissingImages [ i ] . gameID . c_str ( ) ) ;
2011-07-26 00:28:22 +02:00
ShowProgress ( MissingImages [ i ] . progressTitle , fmt ( " %i %s " , TotalDownloadCount - pos , tr ( " files left " ) ) , progressMsg , pos , TotalDownloadCount ) ;
if ( MissingImages [ i ] . gameID . size ( ) < 4 )
continue ;
struct block file = DownloadImage ( MissingImages [ i ] . downloadURL , MissingImages [ i ] . gameID . c_str ( ) ) ;
if ( ! file . data )
{
if ( MissingImages [ i ] . backupURL )
{
MissingImages . erase ( MissingImages . begin ( ) + i ) ;
- - i ;
- - pos ;
}
continue ;
}
char imgPath [ 200 ] ;
snprintf ( imgPath , sizeof ( imgPath ) , " %s/%s.png " , MissingImages [ i ] . writepath , MissingImages [ i ] . gameID . c_str ( ) ) ;
FILE * pfile = fopen ( imgPath , " wb " ) ;
if ( pfile ! = NULL )
{
fwrite ( file . data , 1 , file . size , pfile ) ;
fclose ( pfile ) ;
MissingImagesCount - - ;
}
free ( file . data ) ;
if ( MissingImages [ i ] . backupURL )
{
//! Find and remove the backup download image.
//! The backup image is always further in the vector, so let's save cpu time.
for ( u32 n = i + 1 ; n < MissingImages . size ( ) ; + + n )
{
if ( MissingImages [ n ] . downloadURL = = MissingImages [ i ] . backupURL & &
MissingImages [ n ] . gameID = = MissingImages [ i ] . gameID )
{
MissingImages . erase ( MissingImages . begin ( ) + n ) ;
break ;
}
}
}
//! Remove the image from the vector since it's done
MissingImages . erase ( MissingImages . begin ( ) + i ) ;
- - i ;
}
return MissingImages . size ( ) ;
2011-02-03 22:46:54 +01:00
}
struct block ImageDownloader : : DownloadImage ( const char * url , const char * gameID )
{
2011-07-26 00:28:22 +02:00
char CheckedRegion [ 10 ] ;
char downloadURL [ 512 ] ;
bool PAL = false ;
//Creates URL depending from which Country the game is
switch ( gameID [ 3 ] )
{
case ' J ' :
sprintf ( downloadURL , " %sJA/%s.png " , url , gameID ) ;
sprintf ( CheckedRegion , " JA " ) ;
break ;
case ' W ' :
sprintf ( downloadURL , " %sZH/%s.png " , url , gameID ) ;
sprintf ( CheckedRegion , " ZH " ) ;
break ;
case ' K ' :
sprintf ( downloadURL , " %sKO/%s.png " , url , gameID ) ;
sprintf ( CheckedRegion , " KO " ) ;
break ;
case ' P ' :
case ' D ' :
case ' F ' :
case ' I ' :
case ' S ' :
case ' H ' :
case ' U ' :
case ' X ' :
case ' Y ' :
case ' Z ' :
sprintf ( downloadURL , " %s%s/%s.png " , url , Settings . db_language , gameID ) ;
sprintf ( CheckedRegion , " %s " , Settings . db_language ) ;
PAL = true ;
break ;
case ' E ' :
sprintf ( downloadURL , " %sUS/%s.png " , url , gameID ) ;
sprintf ( CheckedRegion , " US " ) ;
break ;
default :
strcpy ( downloadURL , " " ) ;
strcpy ( CheckedRegion , " " ) ;
break ;
}
struct block file = downloadfile ( downloadURL ) ;
if ( VALID_IMAGE ( file ) )
return file ;
free ( file . data ) ;
file . data = NULL ;
if ( PAL & & strcmp ( CheckedRegion , " EN " ) ! = 0 )
{
snprintf ( downloadURL , sizeof ( downloadURL ) , " %sEN/%s.png " , url , gameID ) ;
file = downloadfile ( downloadURL ) ;
if ( VALID_IMAGE ( file ) )
return file ;
}
else if ( strcmp ( CheckedRegion , " " ) = = 0 )
{
const char * lang = Settings . db_language ;
if ( strcmp ( lang , " EN " ) = = 0 & & CONF_GetRegion ( ) = = CONF_REGION_US )
lang = " US " ;
snprintf ( downloadURL , sizeof ( downloadURL ) , " %s%s/%s.png " , url , lang , gameID ) ;
file = downloadfile ( downloadURL ) ;
if ( VALID_IMAGE ( file ) )
return file ;
free ( file . data ) ;
snprintf ( downloadURL , sizeof ( downloadURL ) , " %sOTHER/%s.png " , url , gameID ) ;
file = downloadfile ( downloadURL ) ;
if ( VALID_IMAGE ( file ) )
return file ;
}
free ( file . data ) ;
memset ( & file , 0 , sizeof ( struct block ) ) ;
return file ;
2011-02-03 22:46:54 +01:00
}
void ImageDownloader : : CreateCSVLog ( )
{
2011-07-26 00:28:22 +02:00
char path [ 200 ] ;
snprintf ( path , sizeof ( path ) , " %s/MissingImages.csv " , Settings . update_path ) ;
FILE * f = fopen ( path , " wb " ) ;
if ( ! f ) return ;
const char * ImageType = " 3D Cover " ;
fprintf ( f , " \" ID \" , \" Name \" , \" ImageType \" \n " ) ;
for ( u32 i = 0 ; i < MissingImages . size ( ) ; + + i )
{
if ( MissingImages [ i ] . downloadURL = = serverURL3D )
{
ImageType = " 3D Cover " ;
}
else if ( MissingImages [ i ] . downloadURL = = serverURL2D )
{
ImageType = " 2D Cover " ;
}
else if ( MissingImages [ i ] . downloadURL = = serverURLFullHQ )
{
ImageType = " Full HQ Cover " ;
}
else if ( MissingImages [ i ] . downloadURL = = serverURLFull )
{
ImageType = " Full LQ Cover " ;
}
else if ( MissingImages [ i ] . downloadURL = = serverURLOrigDiscs )
{
ImageType = " Original Discart " ;
}
else if ( MissingImages [ i ] . downloadURL = = serverURLCustomDiscs )
{
ImageType = " Custom Discart " ;
}
fprintf ( f , " \" %s \" , \" %s \" , \" %s \" \n " , MissingImages [ i ] . gameID . c_str ( ) , GameTitles . GetTitle ( MissingImages [ i ] . gameID . c_str ( ) ) , ImageType ) ;
}
fclose ( f ) ;
2011-02-03 22:46:54 +01:00
}