Compare commits

...

10 Commits

Author SHA1 Message Date
agibert
d2d8d4da11 - Add RRFNFS V 1.2 support. 2009-12-07 11:32:06 +00:00
agibert
c3a454144f - Add Release 1.1.1-1:
- Fix Rx3 archive renaming bug...
2009-10-27 18:28:44 +00:00
agibert
4799b1602c - Fix Rx3 archive renaming bug... 2009-10-26 01:35:08 +00:00
agibert
0445022bd8 - Add support for non sorted dsrom.xml file.. 2009-05-09 21:30:53 +00:00
agibert
c1fb24662c - Add fp bug correction. 2009-04-26 00:14:53 +00:00
agibert
ca4259ed43 - Update RRFNFS to 1.1 version. 2009-04-26 00:14:32 +00:00
agibert
dbd9496c4a - Fix a bug in fp reading from file name. 2009-04-26 00:08:50 +00:00
agibert
9553e74e55 - Change the RRFNFS: Region and Language list are separated by an '=' and not a ':' in order to be FAT friendly !
- Add a work around in dsrom.lsg generator: remove the rom name... NinjaPass bug ?!
2009-04-24 22:42:03 +00:00
agibert
6652b7373f - Update doc files for 1.0.0-1 release. 2009-04-12 01:20:14 +00:00
agibert
c38296927a - Rename rnfh into rrfnfs (Rx3 ROM File Name Format Standard). 2009-04-12 00:44:58 +00:00
4 changed files with 228 additions and 54 deletions

View File

@ -1,7 +1,7 @@
# $RCSfile: ReadMe.txt,v $
# $Revision: 1.1 $
# $Revision: 1.5 $
# $Name: $
# $Date: 2009/03/21 18:55:50 $
# $Date: 2009/12/07 11:32:06 $
# $Author: agibert $
@ -10,10 +10,149 @@
Welcome to NDS2RM:Nintendo DS Simple ROM Manger !
This little shell script (BASH) is designed for automatise simple Nintendo DS ROM Management.
This little shell script (BASH) is designed for automatize simple Nintendo DS ROM Management.
There is three modes available
------------------------------
- Test Mode (-T | --test):
In this mode, nds2rm will load rom data from dsrom.xml, scan the roms repository and finally report info and statistics about what would be done in correct mode. No file are modified.
- Correct Mode (-C | --correct):
In this mode, nds2rm will load rom data from dsrom.xml, scan the roms repository, perform action on rom files (extract / rename / compress) and finally report info and statistics about what have been done.
- dsrom.lst dump Mode (-D | --dsrom):
In this mode, nds2rm will load rom data from dsrom.xml, scan the roms repository and finally dump on stdout the dsrom.lst file.
This file is used by NinjaPass cards (http://www.ninjapass.com).
Repository structure
--------------------
The repository is minimally composed by two directory: roms and misc.
The rom directory is full of rom files. These file can be uncompressed (.nds) or compressed. Three compressors are supported: zip, rar and 7zip. Next to a nds2rm run, the rom file names and rom archive file names follow the RRFNFS 1.2 format. Before a nds2rn run, the rom file names must start with a number followed by a space.
In the misc directory, nds2rm is looking for the dat file: dsrom.xml. This file is comming from http://www.advanscene.com/offline/datas/ADVANsCEne_NDS.zip
RRFNFS 1.2: Rx3 Rom File Name Format Standard version 1.2
---------------------------------------------------------
nds2rm stores ROMs in a .nds file with a standardized file name format:
XXXX - NNNNNNNNNN (R=L1-...-Ln) [SS].nds
with
XXXX: id
NNNNNNNNN: name
R: region
L1-...-Ln: language list
SS: status (OK,KO)
nds2rm compresses each ROM file in an archive file with a standardized file name format:
XXXX - NNNNNNNNNN (R=L1-...-Ln) [SS] {CCCCCCCC} _FFFF_.ccc
or this form for a duplicate archive:
XXXX - NNNNNNNNNN (R=L1-...-Ln) [SS] {CCCCCCCC} _FFFF_-Y.ccc
with:
XXXX: id
NNNNNNNNN: name
R: region
L1-...-Ln: language list
SS: status (OK,KO)
CCCCCCCC: checksum
FFFF: fingerprint
Y: dup id
ccc: archive suffix (zip, rar, 7z)
Statistics explanations
-----------------------
Example:
run statistics:
1 roms set to OK
0 roms changed to OK
3560 roms kept to OK
0 roms set to KO
0 roms changed to KO
61 roms kept to KO
0 roms are renumbered
This details in term of status and renumbering what has been (or would be) done.
global statistics:
3600 roms are in dsrom.dat Number of entry in the XML dat file
3622 roms are found Number of ROMs found in the input repository
0 roms are ignored Number of ROMs ignored by the "max idx" option
3622 roms are proceeded Number of ROMs proceed (found - ignored)
22 roms are duplicated Number of ROMs with the same id and the same status
3561 total roms are OK Total number of ROMs which have the OK status
6 roms are dup OK Number of duplacted OK ROMs
3555 roms are OK Number of unique ROMs which have the OK status (total - duplicated)
61 total roms are KO Total number of ROMs which have the KO status
16 roms are dup KO Number of duplacted KO ROMs
45 roms are KO Number of unique ROMs which have the OK status (total - duplicated)
39 roms are KO not OK Number of unique ROMs which have the OK and not the OK status
6 roms are missing Number of missing ROMs (ROMs found in the dat file and not found in the repository)
The four more important numbers are:
3600 roms are in dsrom.dat
3555 roms are OK
39 roms are KO not OK
6 roms are missing
This means that on 3600 ROMs found in the dat file, 6 are missing in the repository, 3555 are found OK and 39 are found KO.
Command line help
-----------------
Path options:
-i | --repo_in <path>: input repository path (default: /opt/public/nds)
-o | --repo_out <path>: output repository path (default: /opt/public/nds)
Mode selection
-C | --correct: corect output repository
-T | --test: test input repository (default mode)
-D | --dsrom: dsrom.lst will be dumped
-h | --help: print this help and exit
-V | --version: print the version and exit
Global options
-m | --max <id>: maximum rom id to load from dat file (default: 9999)
-v | --verbose: switch on verbosity
-c | --compressor <c>: set archive compressor (zip, rar or 7z) (default: 7z)
Test and Correct Mode options:
-j | --jobs <jobs>: nuber of parallel jobs to run (default: 1)
-r | --rebuild: don't trust archive file name (test & correct mode)
rebuild archives (correct mode)
-n | --renum: try to renumber archives
--list_ok: list roms with ok status
--list_ko: list roms with ko status
--list_miss: list missing roms
Examples
--------
- nds2rm -T -i /opt/public/nds.new -o /opt/public/nds.new -m 3600 -n
it will ask nds2rm to tests the repository (/opt/public/nds.new) with renum option. Only the 3600 first roms will be used.
- nds2rm -C -i /opt/public/nds.old -o /opt/public/nds.new -m 3600 -n
it will ask nds2rm to create a new repository in /opt/public/nds.new by reading an existing one from /opt/public/nds.old. Only the 3600 first roms will be processed. The roms archive with the right name format (RRNF) will not be extracted / recompressed. If needed roms will be renumbered.
- nds2rm -C -i /opt/public/nds.old -o /opt/public/nds.new -m 3600 -r -n
it will ask nds2rm to create a new repository in /opt/public/nds.new by reading an existing one from /opt/public/nds.old. Only the 3600 first roms will be processed. The roms archive name format (RRNF) will not be trusted and systematically extracted / recompressed. If needed roms will be renumbered.
License
-------
NDS2RM is licensed under the GPL GNU Licenses.
For more information, please read the corresponding source file headers.
The license details can be found in the GNU-GPL.txt and GNU-FDL.txt files.

View File

@ -1,7 +1,7 @@
# $RCSfile: ReleaseNotes.txt,v $
# $Revision: 1.1 $
# $Revision: 1.7 $
# $Name: $
# $Date: 2009/03/21 18:55:50 $
# $Date: 2009/12/07 11:32:07 $
# $Author: agibert $
@ -9,7 +9,38 @@
--------------------------------------------------------------------------------
nds2rm V 1.0.0-1 - A. Gibert - 2009/??/??
nds2rm V 1.2.0-1 - A. Gibert - 2009/11/23
--------------------------------------------------------------------------------
Initial public release.
- Update RRFNFS to 1.2: replace angle bracket by _ to enclose fingerprint, in order to be FAT/NTFS friendly !
--------------------------------------------------------------------------------
nds2rm V 1.1.1-1 - A. Gibert - 2009/10/27
--------------------------------------------------------------------------------
- Fix Rx3 archive renaming bug (during renumbering pass)...
--------------------------------------------------------------------------------
nds2rm V 1.1.0-1 - A. Gibert - 2009/05/09
--------------------------------------------------------------------------------
- Change the RRFNFS: Region and Language list are separated by an '=' and not a ':' in order to be FAT friendly !
- Add a work around in dsrom.lst generator: remove the rom name... NinjaPass bug ?! Help Me !
- Fix a bug in fp reading (visible in rom listing),
- Add support for non sorted dsrom.xml file...
--------------------------------------------------------------------------------
nds2rm V 1.0.0-1 - A. Gibert - 2009/04/12
--------------------------------------------------------------------------------
- Initial public release,
- Zip, Rar and 7zip support,
- Rx3 ROM Name Format Standard Support (RRFNFS)
- NDS XML dat file support: ADVANsCEne (http://www.advanscene.com/offline/datas/ADVANsCEne_NDS.zip)
- NinjaPass dsrom.lst generator.

View File

@ -1,7 +1,7 @@
# $RCSfile: ToDo.txt,v $
# $Revision: 1.1 $
# $Revision: 1.2 $
# $Name: $
# $Date: 2009/03/21 18:55:50 $
# $Date: 2009/04/12 01:20:14 $
# $Author: agibert $
@ -9,4 +9,7 @@
- Write a better documentation !
- Add Patched ROM support (PT Status) ?
- Add multi input repository,
- Add status mode (stats only),
- ...

91
nds2rm
View File

@ -5,9 +5,9 @@
# (C) 2009 Arnaud G. Gibert
#-----------------------------------------------------------------------------------------------------------------------------------
# $RCSfile: nds2rm,v $
# $Revision: 1.14 $
# $Revision: 1.21 $
# $Name: $
# $Date: 2009/04/11 22:57:02 $
# $Date: 2009/12/07 11:32:07 $
# $Author: agibert $
#-----------------------------------------------------------------------------------------------------------------------------------
@ -251,7 +251,7 @@ function env_setup()
;;
esac
rnfh_regex=".... - .* \(.*:.*\) \[..\] \{........} <....>[-]*[0-9]*\.${csfx}$"
rrfnfs_regex=".... - .* \(.*=.*\) \[..\] \{........} _...._[-]*[0-9]*\.${csfx}$"
}
@ -373,27 +373,23 @@ function xml_load()
if [[ "${idx}" != "xxxx" ]]
then
count_print ${idx}
dat_rn[${idx}]="${rn}"
dat_id[${idx}]="${id}"
dat_title[${idx}]="${title}"
dat_region[${idx}]="${reg_tab[${location}]}"
dat_lang[${idx}]="${lang}"
dat_save_type[${idx}]="${save_type}"
dat_crc[${idx}]="${crc}"
dat_fp[${idx}]="????"
dat_status[${idx}]="?"
dat_dup[${idx}]="0"
loaded_cnt=$((${loaded_cnt} + 1))
if [[ ${loaded_cnt} -ge ${max_idx} ]]
if [[ ${idx} -le ${max_idx} ]]
then
echo "max rom id reached: skipping loading !" 1>&2
break;
count_print ${idx}
dat_rn[${idx}]="${rn}"
dat_id[${idx}]="${id}"
dat_title[${idx}]="${title}"
dat_region[${idx}]="${reg_tab[${location}]}"
dat_lang[${idx}]="${lang}"
dat_save_type[${idx}]="${save_type}"
dat_crc[${idx}]="${crc}"
dat_fp[${idx}]="????"
dat_status[${idx}]="?"
dat_dup[${idx}]="0"
loaded_cnt=$((${loaded_cnt} + 1))
fi
fi
;;
@ -531,7 +527,7 @@ function rom_list_dump()
do
if [[ ${dat_status[${i}]} == "${status}" ]]
then
echo "${dat_id[${i}]} - ${dat_title[${i}]} (${dat_region[${i}]}:${dat_lang[${i}]}) {${dat_crc[${i}]}} <${dat_fp[${i}]}>"
echo "${dat_id[${i}]} - ${dat_title[${i}]} (${dat_region[${i}]}=${dat_lang[${i}]}) {${dat_crc[${i}]}} _${dat_fp[${i}]}_"
fi
i=$(( ${i} + 1 ))
@ -574,6 +570,8 @@ function dsrom_dump()
{
echo "dumping ds rom list..." 1>&2
echo "${dat_id[${loaded_cnt}]}"
i=1
while [[ ${i} -le ${loaded_cnt} ]]
@ -582,7 +580,10 @@ function dsrom_dump()
then
mask=$(mask_get "${dat_save_type[${i}]}")
echo "${dat_id[${i}]} ${dat_fp[${i}]}-0 $mask ${dat_title[${i}]} (${dat_region[${i}]}:${dat_lang[${i}]}) [${dat_status[${i}]}] {${dat_crc[${i}]}}"
# echo "${dat_id[${i}]} ${dat_fp[${i}]}-0 $mask ${dat_title[${i}]} (${dat_region[${i}]}:${dat_lang[${i}]}) [${dat_status[${i}]}] {${dat_crc[${i}]}}"
# Try to fix non working dsrom.lst by removing rom name... :^(
echo "${dat_id[${i}]} ${dat_fp[${i}]}-0 $mask"
fi
i=$(( ${i} + 1 ))
@ -657,7 +658,7 @@ function arc_mkfn()
dup_id=${9}
file_prefix="${id} - ${title} (${reg}:${lang}) [${status}] {${crc}} <${fp}>"
file_prefix="${id} - ${title} (${reg}=${lang}) [${status}] {${crc}} _${fp}_"
if [[ ${dup_id} == "" ]]
then
@ -877,7 +878,7 @@ function arc_ident()
# Type of archive ?
if [[ ${file} =~ ${rnfh_regex} ]]
if [[ ${file} =~ ${rrfnfs_regex} ]]
then
eval ${arc_type_ptr}="rx3"
else
@ -933,15 +934,15 @@ function arc_proceed()
if [[ "${extract}" == "yes" ]]
then
rom="${id} - ${title} (${reg}:${lang}).nds"
rom="${id} - ${title} (${reg}=${lang}).nds"
rom_extract "${rom}" "${file}"
crc2=$(check -n <"${rom}" 2>&1 | sed -e 's/,.*//' -e 's/.*= //' | tr [:lower:] [:upper:])
fp=$(dd skip=12 count=4 bs=1 <"${rom}" 2>/dev/null)
else
crc2=${file/*\{/}; crc2=${crc2/\}*/}
fp=${file/*\} \</}; fp=${fp/\>*/}
crc2=${file/*\{/}; crc2=${crc2/\} _*/}
fp=${file/*\} _/}; fp=${fp/_*/}
fi
@ -999,13 +1000,13 @@ function arc_proceed()
crc=${dat_crc[${idx}]}
status2="OK"
# Rename the ROM file
rom2="${id} - ${title} (${reg}:${lang}) [${status2}].nds"
# Extract ROM file if not yet done
if [[ "${rom}" == "" ]]
then
rom="${id} - ${title} (${reg}=${lang}).nds"
print_verbose "moving ${rom} to ${rom2}"
mv "${rom}" "${rom2}"
rom=${rom2}
rom_extract "${rom}" "${file}"
fi
if [[ "${arc_type}" == "rx3" ]]
then
@ -1029,9 +1030,9 @@ function arc_proceed()
# Rename ROM if needed
if [[ ( "${renumed}" != "yes") && ( ( "${arc_type}" != "rx3" ) || ( "${rebuild}" == "yes" ) ) ]]
if [[ ( "${renumed}" == "yes") || ( "${arc_type}" != "rx3" ) || ( "${rebuild}" == "yes" ) ]]
then
rom2="${id} - ${title} (${reg}:${lang}) [${status}].nds"
rom2="${id} - ${title} (${reg}=${lang}) [${status}].nds"
print_verbose "moving ${rom} to ${rom2}"
@ -1049,7 +1050,7 @@ function arc_proceed()
# Make / Rename Archive
if [[ ( "${arc_type}" != "rx3" ) || ( ${rebuild} == "yes" ) ]]
if [[ ( "${renumed}" == "yes") || ( "${arc_type}" != "rx3" ) || ( ${rebuild} == "yes" ) ]]
then
arc_build "${file_name}" "${rom}" "${file}" "${mode}" "${idx}"
else
@ -1161,8 +1162,8 @@ function suffix_mng()
ignored_cnt=$((${ignored_cnt} + 1))
else
status=${file/* \[/}; status=${status/\] \{*/}
crc=${file/*\] \{/}; crc=${crc/\} \<*/}
fp=${file/*\} \</}; fp=${fp/\>-*/}
crc=${file/*\] \{/}; crc=${crc/\} _*/}
fp=${file/*\} _/}; fp=${fp/_*/}
dat_dup[${idx}]="${dup_id}"
@ -1175,7 +1176,7 @@ function suffix_mng()
idx_old=${idx}
status_old=${status}
dup_id=0
file_name="${file/) \[*/}) [${status}] {${crc}} <${fp}>.${csfx}"
file_name="${file/) \[*/}) [${status}] {${crc}} _${fp}_.${csfx}"
dat_fp[${idx}]="${fp}"
dat_status[${idx}]="${status}"
@ -1188,7 +1189,7 @@ function suffix_mng()
# Duplicate rom
dup_id=$((${dup_id} + 1))
file_name="${file/) \[*/}) [${status}] {${crc}} <${fp}>-${dup_id}.${csfx}"
file_name="${file/) \[*/}) [${status}] {${crc}} _${fp}_-${dup_id}.${csfx}"
dup_cnt=$((${dup_cnt} + 1))
@ -1419,9 +1420,9 @@ function fp_scan()
# Type of archive ?
if [[ ${file} =~ ${rnfh_regex} ]]
if [[ ${file} =~ ${rrfnfs_regex} ]]
then
fp=${file/*\} \</}; fp=${fp/\>*/}
fp=${file/*\} _/}; fp=${fp/_*/}
status=${file/* \[/}; status=${status/\] \{*/}
if [[ ( "${dat_fp[${idx}]}" == "????" ) || ( ( "${dat_status[${idx}]}" == "KO" ) && ( "${status}" == "OK" ) ) ]]