#!/bin/bash PROGNAME="$(basename $0)" PWD=$(dirname $0) [ "$PWD" ] || PWD=$(pwd) PWD=$(cd $PWD; pwd) # default values CACHE=$PWD/cache CONFIGS=$PWD/CONFIGS KLICENSE="e4e54fd67c16c316f47829a30484d843" PS2CLASSIC=$PWD/ps2classic/ps2classic PSNPACKAGE=$PWD/psn_package_npdrm/psn_package_npdrm # HAN HEN MODEL="HEN" # formating functions function title () { echo -e "\033[0;1m=== $* ===\033[0;0m"; } function pass () { echo -e "\033[1;32m$*\033[0;0m"; } function warn () { echo -e "\033[1;33m$*\033[0;0m"; } function fail () { echo -e "\033[1;31m$*\033[0;0m"; exit 1; } # defaut values id=0 # get last values [ -f .$PROGNAME ] && source .$PROGNAME # init file="$1" [ -f "$file" ] || fail "can't find file" file "$file" | grep -q UDF || fail "file is not an UDF iso" # get serial serial=$(isoinfo -f -i "$file" | \ grep "^/[A-Z][A-Z][A-Z][A-Z]_[0-9][0-9][0-9]\.[0-9][0-9];" | \ sed 's,[/.],,g;s,_,-,;s,;.*,,') [ "$serial" ] || { serial=$(printf "PS2U-1%04d" $id); let id++; } # store last value echo > .$PROGNAME echo "id=$id" >> .$PROGNAME # get name function getname () { [ -f jlist2.html ] || wget https://psxdatacenter.com/psx2/jlist2.html [ -f plist2.html ] || wget https://psxdatacenter.com/psx2/plist2.html [ -f ulist2.html ] || wget https://psxdatacenter.com/psx2/ulist2.html awk '/>'$file'/, "") sub(/ /, " ") gsub(/^[ \t]*/, "") gsub(/[ \t]*$/, "") print }' [jpu]list2.html } # get game title [ -f "$CACHE/PS2-GAMEID-TITLE-MASTER.csv" ] || ( cd "$CACHE"; wget https://raw.githubusercontent.com/VTSTech/PS2-OPL-CFG/master/test/PS2-GAMEID-TITLE-MASTER.csv ) title=$(awk -F\; '"'$serial'" == $1 {print $2}' "$CACHE/PS2-GAMEID-TITLE-MASTER.csv") [ "$title" ] || title=$(basename "$file" | sed 's/ *(.*//') # create CID title "create CID" cid=2P0001-${serial/-}_00-$(echo ${title}0000111122223333 | \ tr '[a-z]' '[A-Z]' | \ sed 's/[^A-Z0-9]//g;s/\(................\).*$/\1/') # main process title "description" echo "File: '$file'" echo "Serial: $serial" echo "Title: '$title'" echo "CID: $cid" # install skeleton title "install skeleton" mkdir $serial tar -C $serial -xzf $PWD/skeleton.tgz [ -d "$CACHE" ] || mkdir "$CACHE" # images: # - ICON0.PNG 320x176 # - PIC0.PNG 1000x560 # - PIC1.PNG 1920x1080 # get cover image title "get cover image" if [ -f "$CACHE/$serial-ICON0.PNG" ]; then cp "$CACHE/$serial-ICON0.PNG" $serial/ICON0.PNG else wget https://psxdatacenter.com/psx2/images2/covers/$serial.jpg if [ -f $serial.jpg ]; then convert $serial.jpg tmp.png mogrify -resize 320x176 tmp.png mogrify -background transparent -gravity center -extent 320x176 tmp.png mv tmp.png $serial/ICON0.PNG rm $serial.jpg cp $serial/ICON0.PNG "$CACHE/$serial-ICON0.PNG" else warn "can't find cover" fi fi # get screenshot title "get screenshot" if [ -f "$CACHE/$serial-PIC0.PNG" ]; then cp "$CACHE/$serial-PIC0.PNG" $serial/PIC0.PNG else touch .touch find $HOME/.config/PCSX2/snaps/ -type f | xargs rm .touch pcsx2 "$file" capture=$(find $HOME/.config/PCSX2/snaps/ -type f | sort) if [ "$capture" ]; then cp "$capture" tmp.png mogrify -scale 1000x560 tmp.png mogrify -background transparent -gravity center -extent 1000x560 tmp.png mv tmp.png $serial/PIC0.PNG cp $serial/PIC0.PNG "$CACHE/$serial-PIC0.PNG" else warn "can't find screenshot" fi fi # create PARAM.SFO title "create PARAM.SFO" # parameters # - file: PARAM.SFO # 0x120: title # 0x1a0: ${serial/-} # - file: USRDIR/ISO.BIN.EDAT # 0x017: ${serial/-} echo -n $title | xxd | xxd -r -s 0x120 - $serial/PARAM.SFO echo -n ${serial/-} | xxd | xxd -r -s 0x1a0 - $serial/PARAM.SFO echo -n ${serial/-} | xxd | xxd -r -s 0x17- $serial/USRDIR/ISO.BIN.EDAT # generate key title "generate key" dd bs=1 count=$(expr ${#KLICENSE} / 2) if=/dev/zero of=$serial/ps2.key echo "00000000 $KLICENSE" | xxd -r - $serial/ps2.key # find config file title "find config file" if [ ! -f "$CACHE/$serial.CONFIG" ]; then confname=$(echo $serial | sed 's/-/_/;s/_\(...\)/_\1./') case "$MODEL" in HAN) confname=$confname.CONFIG config=$(cd $CONFIGS; find NET GX SOFTCUSTOM -name $confname | head -1) ;; HEN) confname=$confname.ENC config=$(cd $CONFIGS; find ENC -name $confname | head -1) ;; esac if [ "$config" ]; then cp $CONFIGS/$config "$CACHE/$serial.CONFIG" fi fi [ -f "$CACHE/$serial.CONFIG" ] && cp "$CACHE/$serial.CONFIG" $serial/USRDIR/CONFIG || warn "can't find config" # create package config title "create package config" cat > $serial/package.conf << EOF Content-ID = $cid k_licensee = 0x$KLICENSE DRM_Type = Free Content_Type = PS2_Classics_Game PackageVersion = 01.01 EOF # prepare iso title "prepare iso" $PS2CLASSIC prepare "$file" || fail "can't prepare iso" # convert iso title "convert iso" $PS2CLASSIC e cex $serial/ps2.key "$file" $serial/USRDIR/ISO.BIN.ENC ISO.BIN.ENC $cid || fail "can't convert iso" # create package title "create package" $PSNPACKAGE $serial || fail "can't create package" mv $serial/$cid.pkg . # create rap file title "create rap file" cp $PWD/iso2ps2.rap $cid.rap # cleaning title "cleaning" rm -rf $serial