2016-09-12 21:31:16 -07:00
using SabreTools.Helper ;
using System ;
using System.Collections.Generic ;
using System.IO ;
namespace SabreTools
{
public class SimpleSortApp
{
/// <summary>
/// Main entry point for the program
/// </summary>
/// <param name="args">List of arguments to be parsed</param>
public static void Main ( string [ ] args )
{
// If output is being redirected, don't allow clear screens
if ( ! Console . IsOutputRedirected )
{
Console . Clear ( ) ;
}
// Perform initial setup and verification
Logger logger = new Logger ( true , "simplesort.log" ) ;
// Credits take precidence over all
if ( ( new List < string > ( args ) ) . Contains ( "--credits" ) )
{
Build . Credits ( ) ;
return ;
}
// If there's no arguments, show help
if ( args . Length = = 0 )
{
Build . Help ( ) ;
logger . Close ( ) ;
return ;
}
// Output the title
Build . Start ( "SimpleSort" ) ;
2016-10-20 16:00:54 -07:00
// Feature flags
2016-09-12 21:31:16 -07:00
bool help = false ,
2016-10-20 16:33:06 -07:00
convert = false ,
sort = true ,
verify = false ;
2016-10-20 16:00:54 -07:00
// User flags
2016-10-20 16:33:06 -07:00
bool date = false ,
2016-10-09 00:38:27 -07:00
delete = false ,
2016-09-12 21:31:16 -07:00
quickScan = false ,
romba = false ,
toFolder = false ,
2016-10-08 23:28:09 -07:00
tgz = false ,
2016-10-20 16:33:06 -07:00
updateDat = false ;
2016-10-20 16:00:54 -07:00
// User inputs
2016-09-12 21:31:16 -07:00
int sevenzip = 0 ,
gz = 2 ,
rar = 2 ,
zip = 0 ;
2016-10-17 14:28:21 -07:00
string header = "" ,
outDir = "" ,
2016-09-16 16:35:58 -07:00
tempDir = "" ;
2016-09-12 21:31:16 -07:00
List < string > datfiles = new List < string > ( ) ;
2016-10-20 16:33:06 -07:00
List < string > inputs = new List < string > ( ) ;
2016-09-12 21:31:16 -07:00
// Determine which switches are enabled (with values if necessary)
2016-10-16 15:36:15 -07:00
for ( int i = 0 ; i < args . Length ; i + + )
2016-09-12 21:31:16 -07:00
{
2016-10-16 15:36:15 -07:00
switch ( args [ i ] )
2016-09-12 21:31:16 -07:00
{
2016-10-20 16:00:54 -07:00
// Feature flags
2016-09-12 21:31:16 -07:00
case "-?" :
case "-h" :
case "--help" :
help = true ;
break ;
2016-10-20 16:33:06 -07:00
case "-c" :
case "--convert" :
convert = true ;
break ;
2016-10-20 16:00:54 -07:00
case "-ss" :
case "--sort" :
2016-10-20 16:33:06 -07:00
sort = true ;
break ;
case "-v" :
case "--verify" :
verify = true ;
2016-10-16 15:36:15 -07:00
break ;
2016-10-20 16:00:54 -07:00
// User flags
2016-10-14 16:58:15 -07:00
case "-ad" :
case "--add-date" :
date = true ;
break ;
2016-09-12 22:00:25 -07:00
case "-d" :
case "--delete" :
delete = true ;
break ;
2016-10-20 16:00:54 -07:00
case "-do" :
case "--directory" :
toFolder = true ;
break ;
case "-qs" :
case "--quick" :
quickScan = true ;
break ;
case "-r" :
case "--romba" :
romba = true ;
break ;
case "-tgz" :
case "--tgz" :
tgz = true ;
break ;
case "-ud" :
case "--updated-dat" :
updateDat = true ;
break ;
// User inputs
case "-7z" :
case "--7z" :
i + + ;
if ( ! Int32 . TryParse ( args [ i ] , out sevenzip ) )
{
sevenzip = 0 ;
}
break ;
2016-10-16 15:36:15 -07:00
case "-dat" :
case "--dat" :
i + + ;
if ( ! File . Exists ( args [ i ] ) )
{
logger . Error ( "DAT must be a valid file: " + args [ i ] ) ;
Console . WriteLine ( ) ;
Build . Help ( ) ;
logger . Close ( ) ;
return ;
}
datfiles . Add ( args [ i ] ) ;
break ;
case "-gz" :
case "--gz" :
i + + ;
if ( ! Int32 . TryParse ( args [ i ] , out gz ) )
{
gz = 2 ;
}
break ;
2016-10-17 14:28:21 -07:00
case "-he" :
case "--header" :
i + + ;
header = args [ i ] ;
break ;
2016-10-16 15:36:15 -07:00
case "-out" :
case "--out" :
i + + ;
outDir = args [ i ] ;
break ;
case "-rar" :
case "--rar" :
i + + ;
if ( ! Int32 . TryParse ( args [ i ] , out rar ) )
{
rar = 2 ;
}
break ;
case "-t" :
case "--temp" :
i + + ;
tempDir = args [ i ] ;
break ;
case "-zip" :
case "--zip" :
i + + ;
if ( ! Int32 . TryParse ( args [ i ] , out zip ) )
2016-09-12 21:31:16 -07:00
{
2016-10-16 15:36:15 -07:00
zip = 0 ;
2016-09-12 21:31:16 -07:00
}
2016-10-16 15:36:15 -07:00
break ;
default :
string temparg = args [ i ] . Replace ( "\"" , "" ) . Replace ( "file://" , "" ) ;
if ( temparg . StartsWith ( "-" ) & & temparg . Contains ( "=" ) )
2016-09-12 21:31:16 -07:00
{
2016-10-16 15:36:15 -07:00
// Split the argument
string [ ] split = temparg . Split ( '=' ) ;
if ( split [ 1 ] = = null )
2016-09-12 21:31:16 -07:00
{
2016-10-16 15:36:15 -07:00
split [ 1 ] = "" ;
2016-09-12 21:31:16 -07:00
}
2016-10-16 15:36:15 -07:00
switch ( split [ 0 ] )
2016-09-12 21:31:16 -07:00
{
2016-10-16 15:36:15 -07:00
case "-7z" :
case "--7z" :
if ( ! Int32 . TryParse ( split [ 1 ] , out sevenzip ) )
{
sevenzip = 0 ;
}
break ;
case "-dat" :
case "--dat" :
if ( ! File . Exists ( split [ 1 ] ) )
{
logger . Error ( "DAT must be a valid file: " + split [ 1 ] ) ;
Console . WriteLine ( ) ;
Build . Help ( ) ;
logger . Close ( ) ;
return ;
}
datfiles . Add ( split [ 1 ] ) ;
break ;
case "-gz" :
case "--gz" :
if ( ! Int32 . TryParse ( split [ 1 ] , out gz ) )
{
gz = 2 ;
}
break ;
2016-10-17 14:28:21 -07:00
case "-h" :
case "--header" :
header = split [ 1 ] ;
break ;
2016-10-16 15:36:15 -07:00
case "-out" :
case "--out" :
outDir = split [ 1 ] ;
break ;
case "-rar" :
case "--rar" :
if ( ! Int32 . TryParse ( split [ 1 ] , out rar ) )
{
rar = 2 ;
}
break ;
case "-t" :
case "--temp" :
tempDir = split [ 1 ] ;
break ;
case "-zip" :
case "--zip" :
if ( ! Int32 . TryParse ( split [ 1 ] , out zip ) )
{
zip = 0 ;
}
break ;
default :
if ( File . Exists ( temparg ) | | Directory . Exists ( temparg ) )
{
inputs . Add ( temparg ) ;
}
else
{
logger . Error ( "Invalid input detected: " + args [ i ] ) ;
Console . WriteLine ( ) ;
Build . Help ( ) ;
Console . WriteLine ( ) ;
logger . Error ( "Invalid input detected: " + args [ i ] ) ;
logger . Close ( ) ;
return ;
}
break ;
2016-09-12 21:31:16 -07:00
}
}
else if ( File . Exists ( temparg ) | | Directory . Exists ( temparg ) )
{
inputs . Add ( temparg ) ;
}
else
{
2016-10-16 15:36:15 -07:00
logger . Error ( "Invalid input detected: " + args [ i ] ) ;
2016-09-12 21:31:16 -07:00
Console . WriteLine ( ) ;
Build . Help ( ) ;
Console . WriteLine ( ) ;
2016-10-16 15:36:15 -07:00
logger . Error ( "Invalid input detected: " + args [ i ] ) ;
2016-09-12 21:31:16 -07:00
logger . Close ( ) ;
return ;
}
break ;
}
}
// If help is set, show the help screen
if ( help )
{
Build . Help ( ) ;
logger . Close ( ) ;
return ;
}
// If a switch that requires a filename is set and no file is, show the help screen
2016-10-20 16:33:06 -07:00
if ( inputs . Count = = 0 & & ( ( sort & & ! verify ) | | convert ) )
2016-09-12 21:31:16 -07:00
{
logger . Error ( "This feature requires at least one input" ) ;
Build . Help ( ) ;
logger . Close ( ) ;
return ;
}
2016-10-08 23:28:09 -07:00
// If we are converting the folder
2016-09-13 17:05:54 -07:00
else if ( convert )
2016-09-12 22:00:25 -07:00
{
2016-10-08 23:28:09 -07:00
InitConvertFolder ( datfiles , inputs , outDir , tempDir , delete , tgz , romba , sevenzip ,
gz , rar , zip , logger ) ;
2016-09-12 22:00:25 -07:00
}
2016-09-12 21:31:16 -07:00
// If we are doing a simple sort
2016-10-20 16:33:06 -07:00
else if ( sort )
2016-09-12 21:31:16 -07:00
{
if ( datfiles . Count > 0 )
{
2016-10-20 17:24:44 -07:00
InitSort ( datfiles , inputs , outDir , tempDir , quickScan , date , toFolder ,
delete , tgz , romba , sevenzip , gz , rar , zip , updateDat , header , logger ) ;
2016-09-12 21:31:16 -07:00
}
else
{
logger . Error ( "A datfile is required to use this feature" ) ;
Build . Help ( ) ;
logger . Close ( ) ;
return ;
}
}
// If nothing is set, show the help
else
{
Build . Help ( ) ;
}
logger . Close ( ) ;
return ;
}
/// <summary>
2016-10-08 23:28:09 -07:00
/// Wrap converting a folder to TorrentZip or TorrentGZ, optionally filtering by an input DAT(s)
2016-09-12 21:31:16 -07:00
/// </summary>
/// <param name="datfiles">Names of the DATs to compare against</param>
2016-10-05 17:31:09 -07:00
/// <param name="inputs">List of all inputted files and folders</param>
/// <param name="outDir">Output directory (empty for default directory)</param>
2016-09-16 16:35:58 -07:00
/// <param name="tempDir">Temporary directory for archive extraction</param>
2016-09-12 22:00:25 -07:00
/// <param name="delete">True if input files should be deleted, false otherwise</param>
2016-10-08 23:28:09 -07:00
/// <param name="tgz">True to output files in TorrentGZ format, false for TorrentZip</param>
2016-09-12 21:31:16 -07:00
/// <param name="romba">True if files should be output in Romba depot folders, false otherwise</param>
2016-10-05 17:31:09 -07:00
/// <param name="sevenzip">Integer representing the archive handling level for 7z</param>
2016-09-12 21:31:16 -07:00
/// <param name="gz">Integer representing the archive handling level for GZip</param>
/// <param name="rar">Integer representing the archive handling level for RAR</param>
/// <param name="zip">Integer representing the archive handling level for Zip</param>
/// <param name="logger">Logger object for file and console output</param>
2016-10-08 23:28:09 -07:00
public static bool InitConvertFolder ( List < string > datfiles , List < string > inputs , string outDir , string tempDir , bool delete ,
bool tgz , bool romba , int sevenzip , int gz , int rar , int zip , Logger logger )
2016-09-12 21:31:16 -07:00
{
2016-10-05 20:37:51 -07:00
// Get the archive scanning level
ArchiveScanLevel asl = ArchiveTools . GetArchiveScanLevelFromNumbers ( sevenzip , gz , rar , zip ) ;
DateTime start = DateTime . Now ;
logger . User ( "Populating internal DAT..." ) ;
2016-09-12 21:31:16 -07:00
// Add all of the input DATs into one huge internal DAT
2016-09-19 20:08:25 -07:00
DatFile datdata = new DatFile ( ) ;
2016-09-12 21:31:16 -07:00
foreach ( string datfile in datfiles )
{
2016-09-22 17:11:52 -07:00
datdata . Parse ( datfile , 99 , 99 , logger , keep : true , softlist : true ) ;
2016-09-12 21:31:16 -07:00
}
2016-10-05 20:37:51 -07:00
logger . User ( "Populating complete in " + DateTime . Now . Subtract ( start ) . ToString ( @"hh\:mm\:ss\.fffff" ) ) ;
2016-10-05 17:23:44 -07:00
2016-09-12 22:00:25 -07:00
// Get all individual files from the inputs
2016-10-05 20:37:51 -07:00
start = DateTime . Now ;
logger . User ( "Organizing input files..." ) ;
2016-09-12 22:00:25 -07:00
List < string > newinputs = new List < string > ( ) ;
foreach ( string input in inputs )
{
if ( File . Exists ( input ) )
{
newinputs . Add ( Path . GetFullPath ( input ) ) ;
}
else if ( Directory . Exists ( input ) )
{
foreach ( string file in Directory . EnumerateFiles ( input , "*" , SearchOption . AllDirectories ) )
{
newinputs . Add ( Path . GetFullPath ( file ) ) ;
}
}
}
2016-10-05 20:37:51 -07:00
logger . User ( "Organizing complete in " + DateTime . Now . Subtract ( start ) . ToString ( @"hh\:mm\:ss\.fffff" ) ) ;
2016-09-12 22:00:25 -07:00
2016-10-14 16:58:15 -07:00
SimpleSort ss = new SimpleSort ( datdata , newinputs , outDir , tempDir , false , false ,
2016-10-20 17:24:44 -07:00
false , delete , tgz , romba , asl , false , null , logger ) ;
2016-09-12 22:00:25 -07:00
return ss . Convert ( ) ;
}
2016-10-05 17:31:09 -07:00
/// <summary>
/// Wrap sorting files using an input DAT
/// </summary>
/// <param name="datfiles">Names of the DATs to compare against</param>
/// <param name="inputs">List of input files/folders to check</param>
/// <param name="outDir">Output directory to use to build to</param>
/// <param name="tempDir">Temporary directory for archive extraction</param>
/// <param name="quickScan">True to enable external scanning of archives, false otherwise</param>
2016-10-14 16:58:15 -07:00
/// <param name="date">True if the date from the DAT should be used if available, false otherwise</param>
2016-10-05 17:31:09 -07:00
/// <param name="sevenzip">Integer representing the archive handling level for 7z</param>
/// <param name="toFolder">True if files should be output to folder, false otherwise</param>
/// <param name="delete">True if input files should be deleted, false otherwise</param>
2016-10-08 23:28:09 -07:00
/// <param name="tgz">True to output files in TorrentGZ format, false for TorrentZip</param>
2016-10-05 17:31:09 -07:00
/// <param name="romba">True if files should be output in Romba depot folders, false otherwise</param>
/// <param name="gz">Integer representing the archive handling level for GZip</param>
/// <param name="rar">Integer representing the archive handling level for RAR</param>
/// <param name="zip">Integer representing the archive handling level for Zip</param>
/// <param name="updateDat">True if the updated DAT should be output, false otherwise</param>
2016-10-17 14:28:21 -07:00
/// <param name="headerToCheckAgainst">Populated string representing the name of the skipper to use, a blank string to use the first available checker, null otherwise</param>
2016-10-05 17:31:09 -07:00
/// <param name="logger">Logger object for file and console output</param>
2016-10-20 17:24:44 -07:00
private static void InitSort ( List < string > datfiles , List < string > inputs , string outDir , string tempDir , bool quickScan , bool date ,
bool toFolder , bool delete , bool tgz , bool romba , int sevenzip , int gz , int rar , int zip , bool updateDat , string headerToCheckAgainst , Logger logger )
2016-10-05 17:31:09 -07:00
{
// Get the archive scanning level
ArchiveScanLevel asl = ArchiveTools . GetArchiveScanLevelFromNumbers ( sevenzip , gz , rar , zip ) ;
2016-10-05 20:37:51 -07:00
DateTime start = DateTime . Now ;
logger . User ( "Populating internal DAT..." ) ;
2016-10-05 17:31:09 -07:00
// Add all of the input DATs into one huge internal DAT
DatFile datdata = new DatFile ( ) ;
foreach ( string datfile in datfiles )
{
datdata . Parse ( datfile , 99 , 99 , logger , keep : true , softlist : true ) ;
}
2016-10-05 20:37:51 -07:00
logger . User ( "Populating complete in " + DateTime . Now . Subtract ( start ) . ToString ( @"hh\:mm\:ss\.fffff" ) ) ;
2016-10-05 17:31:09 -07:00
2016-10-14 16:58:15 -07:00
SimpleSort ss = new SimpleSort ( datdata , inputs , outDir , tempDir , quickScan , date ,
2016-10-20 17:24:44 -07:00
toFolder , delete , tgz , romba , asl , updateDat , headerToCheckAgainst , logger ) ;
ss . RebuildToOutput ( ) ;
}
/// <summary>
/// Wrap verifying files using an input DAT
/// </summary>
/// <param name="datfiles">Names of the DATs to compare against</param>
/// <param name="inputs">Input directories to compare against</param>
/// <param name="tempDir">Temporary directory for archive extraction</param>
/// <param name="headerToCheckAgainst">Populated string representing the name of the skipper to use, a blank string to use the first available checker, null otherwise</param>
/// <param name="logger">Logger object for file and console output</param>
private static void InitVerify ( List < string > datfiles , List < string > inputs , string tempDir , string headerToCheckAgainst , Logger logger )
{
// Get the archive scanning level
ArchiveScanLevel asl = ArchiveTools . GetArchiveScanLevelFromNumbers ( 1 , 1 , 1 , 1 ) ;
DateTime start = DateTime . Now ;
logger . User ( "Populating internal DAT..." ) ;
// Add all of the input DATs into one huge internal DAT
DatFile datdata = new DatFile ( ) ;
foreach ( string datfile in datfiles )
{
datdata . Parse ( datfile , 99 , 99 , logger , keep : true , softlist : true ) ;
}
logger . User ( "Populating complete in " + DateTime . Now . Subtract ( start ) . ToString ( @"hh\:mm\:ss\.fffff" ) ) ;
FileTools . VerifyDirectory ( datdata , inputs , tempDir , headerToCheckAgainst , logger ) ;
2016-10-05 17:31:09 -07:00
}
2016-09-12 21:31:16 -07:00
}
}