samedi 25 janvier 2020

Retrogaming: Ma méthode pour se faire des "collections" sur Recalbox 6.1.1...

En fait il y a plusieurs manières.... mais celle que je vais sélectionner c'est surtout celle que j'ai réussi à mettre en place et validé avec la version 6.1.1 de Recalbox...

Méthode 1) La manière classique est de venir avec des répertoires et roms supplémentaires avec une architecture de répertoire déjà défini et fait par des passionnés...
Il faut déposer dans le répertoire/partage/support amovible de préférence  //recalbox/share/roms, le repertoire "collections" qui va avoir son propre "gamelist.xml" et ses ROMs par thème dans des répertoires distincts ainsi :


Il faudra aussi copier le fichier un fichier es_systems.cfg modifié dans le  répertoire interne de votre Recalbox ici :  /recalbox/share_init/system/.emulationstation/ mais cette fois en SSH en SFTP parce que cela sera sur la SD et pas accessible à partir du partage.

En général, cela rajoute cela dans la liste des systèmes :


  <system>
    <fullname>COLLECTIONS</fullname>
    <name>snes</name>
    <path>/recalbox/share/roms/collections</path>
        <extension>.smc .sfc .SMC .SFC .zip .ZIP .mgd .MGD .n64 .N64 .z64 .Z64 .v64 .V64 .gb .GB .gbc .GBC .gba .GBA .md .MD .bin .BIN .gen .GEN .smd .SMD .gg .GG .ngc .NGC .ngp .NGP .32x .32X .img .IMG .pbp .PBP .cue .CUE .iso .ISO .ccd .CCD .cbn .CBN .mu3 .MU3 .chd .CHD .cso .CSO</extension>
        <command>python /usr/lib/python2.7/site-packages/configgen/emulatorlauncher.pyc %CONTROLLERSCONFIG% -system %SYSTEM% -rom %ROM% -emulator %EMULATOR% -core %CORE%</command>
        <platform>snes, megadrive, fba_libretro, nes, n64, gb, gbc, gba, sg1000, mastersystem, gamegear, sega32x, segacd, dreamcast, psx, psp, mame, fba, neogeo, ngp, ngpc, lynx</platform>
        <theme>collections</theme>
 <emulators>
     <emulator name="libretro">
         <cores>
      <core>catsfc</core>
      <core>pocketsnes</core>
   <core>snes9x</core>
      <core>snes9x_next</core>
   <core>gpsp</core>
      <core>mgba</core>
      <core>meteor</core>
   <core>gambatte</core>
      <core>tgbdual</core>
      <core>fceunext</core>
      <core>nestopia</core>
            <core>fceumm</core>
      <core>quicknes</core>
            <core>genesisplusgx</core>
      <core>picodrive</core> 
            <core>fba</core> 
            <core>handy</core>
            <core>mednafen_lynx</core> 
            <core>mame2010</core>
            <core>mame078</core>
            <core>imame4all</core> 
            <core>glupen64</core> 
            <core>mednafen_ngp</core> 
            <core>pcsx_rearmed</core>
             
  </cores>
     </emulator>
  <emulator name="mupen64plus">
         <cores>
      <core>gliden64</core>
      <core>n64</core>
      <core>rice</core>
  </cores>
     </emulator>
  <emulator name="fba2x">
        <cores>
          <core>fba2x</core>
        </cores>
      </emulator>
   <emulator name="advancemame">
        <cores>
          <core>advancemame</core>
        </cores>
      </emulator>
    </emulators>
  </system>

Mais j'ai l'impression que cela ne marche plus depuis la version 6 ou 6.1 de Recalbox, mais j'ai peut-être juste pas réussi avec la collection que j'avais :-(

De plus je trouve cela dommage de copier les roms dans un espace particulier quand on a déjà les roms dans les répertoires de chaque système déjà :-(

Méthode 2) donc j'ai cherché une autre méthode.... et finalement j'ai trouvé... il y a un passionné nordicpower qui a fait un truc sympa utilisant un script (gamelistpower) qui filtre par thème en fonction de règle pour faire une collection dynamiquement, mais la contrainte est aussi de mettre à jour es_system.cfg par script en fait mais cela appel dans ce cas des .sh pour lancer les ROMs qui sont dans les répertoires d'origine... (le es_system.cfg se mets à jour par les script mais il y a un petit bug pour l'instant, il faudra rajouter à la main la dernière ligne de ce système surlignée en jaune ci-après)


  <system>
    <fullname>collections</fullname>
    <name>collections</name>
    <path>/recalbox/share/roms/collections</path>
    <extension>.sh .SH</extension>
    <command>%ROM% %CONTROLLERSCONFIG% %RATIO%</command>
    <platform>dreamcast</platform>
    <theme>random</theme>
    <emulators></emulators>
  </system>

sympa mais pas de bol... depuis la 6.1... cela ne marche pas dans tout les cas... si on a un disque amovible USB pour mettre les roms... on ne peut pas utiliser les .SH parce que c'est des exécutables non exécutables/gérables sur du NTFS, FAT32 et EXFAT :-( J'ai essayé de bidouiller Recalbox pour faire passer la commande "chmod +x..." mais sans succès et j'ai fait pleins de truc :-( et même un dev de recalbox a confirmé pour les éxecutables, impossible maintenant donc sur un support amovible :

Michael Baudino authored 
This commit explicitely mounts FAT32, ExFAT and NTFS external devices
with 755 as directory rights and 644 as file rights.

For NTFS and ExFAT, the default before that was 777 (for both files and
directories), which was an issue for dropbear (it's insecure, so
dropbear wouldn't use `~/.ssh/authorized_keys` with 777 rights, thus
disabling key-based SSH login).

More accurately, they use `umask=0` as default. See their man pages.

For FAT32, it was already the default, but the more explicit the better
(and the more futureproof: who knows if default won't change someday).*

Méthode 2 - en bidouillant ;-) J'ai finalement bidouillé les scripts de boot de recalbox (je sais c'est mal :-().
J'ai changé dans un script qui est dans /recalbox/scripts/, c'est le script recalbox-mount.sh
J'ai donc changé les droits (voir le caractère surligné en jaune), pour au lieu de mettre 644 mais 744 sur les fichiers pour que je puisse executer les .sh généré par les scripts (gamelistpower) que je parlais dans la méthode 2 ;-) :


#!/bin/bash

# rbmount [FSTYPE] [RWREQUIRED] [MOUNTDEVICE] [MOUNTPOINT]

print_usage() {
    echo "${0} [FSTYPE] [RWREQUIRED] [MOUNTDEVICE] [MOUNTPOINT]" >&2
}

if test $# -ne 4
then
    print_usage "${0}"
    exit 1
fi

FSTYPE="$1"
RWREQUIRED="$2"
MOUNTDEVICE="$3"
MOUNTPOINT="$4"
FSMOUNTOPT="noatime"
TESTFILE="${MOUNTPOINT}/recalbox.fsrw.test"

# for non vfat and ntfs systems, it's easy
if test "${FSTYPE}" != "vfat" -a "${FSTYPE}" != "ntfs" -a "${FSTYPE}" != "exfat"
then
    if mount "${MOUNTDEVICE}" "${MOUNTPOINT}" -o "${FSMOUNTOPT}"
    then
 exit 0
    fi
    exit 1
fi

# vfat and ntfs

# Set correct access rights (755 for directories, 644 for files) -> change to 744 to permit .sh execution for collections
#   default is 777 for NTFS and ExFAT otherwise (umask=0)
FSMOUNTOPT="${FSMOUNTOPT},fmask=0033,dmask=0022"
.
.
.

Et après il faut rebooter bien sur.... et voilà.

Pour rappel, il faudra exécuter la commande "mount -o remount,rw /" au préalable lors de votre session SSH pour mettre à jour ce fichier ;-)

En fait, j'ai du aussi corriger les scripts de gamerlistpower (désolé NordicPower, tu as fait du bon boulot mais recalbox a du evoluer je pense et il faut modifier quelques trucs maintenant, rien de grave ;-)

1) j'ai modifier le script python (/recalbox/scripts/gamelistpower/glplib/glpES.py) qui génére le XML 'es_systems.cfg' de emulationstation , j'ai du rajouter la génération du tag vide si besoin () sinon cela ne s'affiche pas dans le menu de recalbox. Dans ce script python (que j'ai recompilé en .pyc au passage), j'ai rajouté les 3 lignes dans ce fichier, ce sont celles surlignées en jaune :

Pour la création de la collection...

  #Ecriture des noeuds emulators/emulator/cores/core
  if not addsys.emulators == []:
   new_dom_emulators_element = self._XmlDom.createElement(self._CLASS_EMULATORS_NODENAME)
   for emulator in addsys.emulators:
    new_dom_emulator_element = self._XmlDom.createElement(self._CLASS_EMULATOR_NODENAME)
    new_dom_emulator_element.setAttribute("name",emulator.name)
    if not emulator.cores == []:
     new_dom_cores_element = self._XmlDom.createElement(self._CLASS_CORES_NODENAME)
     for core in emulator.cores:
      new_dom_core_element = self._XmlDom.createElement(self._CLASS_CORE_NODENAME)
      new_dom_core_element_text = self._XmlDom.createTextNode(core)
      new_dom_core_element.appendChild(new_dom_core_element_text)
      new_dom_cores_element.appendChild(new_dom_core_element)
     new_dom_emulator_element.appendChild(new_dom_cores_element)
    new_dom_emulators_element.appendChild(new_dom_emulator_element)
   newdom_system_element.appendChild(new_dom_emulators_element)
  else:
   new_dom_emulators_element = self._XmlDom.createElement(self._CLASS_EMULATORS_NODENAME)
   newdom_system_element.appendChild(new_dom_emulators_element)

Mais aussi pour sa mise à jour:


    if not updsys.emulators == []:
     new_dom_emulators_element = self._XmlDom.createElement(self._CLASS_EMULATORS_NODENAME)
     for emulator in updsys.emulators:
      new_dom_emulator_element = self._XmlDom.createElement(self._CLASS_EMULATOR_NODENAME)
      new_dom_emulator_element.setAttribute("name",emulator.name)
      if not emulator.cores == []:
       new_dom_cores_element = self._XmlDom.createElement(self._CLASS_CORES_NODENAME)
       for core in emulator.cores:
        new_dom_core_element = self._XmlDom.createElement(self._CLASS_CORE_NODENAME)
        new_dom_core_element_text = self._XmlDom.createTextNode(core)
        new_dom_core_element.appendChild(new_dom_core_element_text)
        new_dom_cores_element.appendChild(new_dom_core_element)
       new_dom_emulator_element.appendChild(new_dom_cores_element)
      new_dom_emulators_element.appendChild(new_dom_emulator_element)
     systemp_node.appendChild(new_dom_emulators_element)
    else:
     new_dom_emulators_element = self._XmlDom.createElement(self._CLASS_EMULATORS_NODENAME)
     systemp_node.appendChild(new_dom_emulators_element)

2) pour être compatible avec les vidéos/thumbnails qui sont utilisé dans les menus (si scrappé bien sur), j'ai modifié aussi pour avoir le bon chemin complet vers ces ressources : (/recalbox/scripts/gamelistpower/glplib/glpGAMEGEN.py), j'ai rajouté les 4 lignes dans ce fichier, ce sont celles surlignées en jaune :


     #Ajout du resultat
     if rom_to_exclude==False:
      result_game.path = result_game.path.replace('.'+os.sep,GameListDirectory+os.sep)
      if result_game.image != default_game_picture and result_game.image !='':
       result_game.image = result_game.image.replace('.'+os.sep,GameListDirectory+os.sep)
      if result_game.video !='':
       result_game.video = result_game.video.replace('.'+os.sep,GameListDirectory+os.sep)
      if result_game.thumbnail !='':
       result_game.thumbnail = result_game.thumbnail.replace('.'+os.sep,GameListDirectory+os.sep)
      local_emulator = result_game.emulator
      if local_emulator=='':
       local_emulator = es_config_default_emulator
      local_core = result_game.core
      if local_core=='':
       local_core = es_config_default_core
      local_ratio = result_game.ratio
      if local_ratio=='':
       local_ratio = 'auto'

Ensuite par defaut cela utilise le theme "favorites", mais dans mon cas, j'ai aussi re-modifier le fichier es_systems.cfg  pour pointer sur un theme "collections" et non "favorites"; J'utilise ce set de thèmes pour avoir un thème "collections" : https://www.youtube.com/watch?v=B1GcGG_yiDM&feature=youtu.be

Pour finir, dans le repertoire \\RECALBOX\share\roms\collections, j'ai viré le script installé "Z - refresh.sh", je préfère le faire en SSH quand j'ai besoin.

Quand j'ai besoin de rajouter une collection ou de la refaire :

1) je me connecte en SSH à mon Rpi 3

2) Je debloque l'écriture avec la commande suivante:


# mount -o remount,rw /

3) Je vais dans le répertoire des script gemalistpower

# cd /recalbox/scripts/gamelistpower

4) J'édite ou pas le fichier de rules avec nano ou avec un outil de mise à jour du fichier par sftp

# nano rules_gensh.xml

Voici ce que j'ai dans le mien pour l'instant :


<?xml version="1.0" encoding="utf-8"?>
<!--NORDIC POWER-->
<rules>
 <options>
  <!-- AUTORISE %%NAME% %%name%% %%PLATEFORM%% %region%% %REGION%% -->
  <titleformat>%%NAME%% (%%PLATEFORM%%)</titleformat>
  <path>/recalbox/share/roms/collections</path>
 </options>
  <rule>
    <name>outrun1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>outrun</searchValue>
    <destination>/recalbox/share/roms/collections/outrun</destination>
    <destinationName>OUTRUN</destinationName>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>outrun2</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>out run</searchValue>
    <destination>/recalbox/share/roms/collections/outrun</destination>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>mario1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>mario</searchValue>
    <destination>/recalbox/share/roms/collections/mario</destination>
    <destinationName>MARIO</destinationName>
    <exclusions>
     <exclusion>Mario Lemieux Hockey.zip</exclusion>
     <exclusion>Mario Andretti Racing (USA, Europe).zip</exclusion>
     <exclusion>/recalbox/share/roms/mario</exclusion>
     <exclusion>/recalbox/share/roms/collections2</exclusion>
    </exclusions>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>mario2</name>
    <searchAttribute>genre</searchAttribute>
    <searchValue>mario</searchValue>
    <destination>/recalbox/share/roms/collections/mario</destination>
    <destinationName>MARIO</destinationName>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>pinball1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>pinball</searchValue>
    <destination>/recalbox/share/roms/collections/pinball</destination>
    <destinationName>PINBALL</destinationName>
    <preserveFavorite>false</preserveFavorite>
    <!--<gamelistInfoFile>/recalbox/share/roms/collections/pinball.txt</gamelistInfoFile>-->
  </rule>
  <rule>
    <name>pinball2</name>
    <searchAttribute>genre</searchAttribute>
    <searchValue>pinball</searchValue>
    <destination>/recalbox/share/roms/collections/pinball</destination>
    <preserveFavorite>false</preserveFavorite>
    <!--<gamelistInfoFile>/recalbox/share/roms/collections/pinball.txt</gamelistInfoFile>-->
  </rule>
  <rule>
    <name>streetfighter1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>street fighter</searchValue>
    <destination>/recalbox/share/roms/collections/streetfighter</destination>
    <destinationName>STREET FIGHTER</destinationName>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>streetfighter2</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>streetfighter</searchValue>
    <destination>/recalbox/share/roms/collections/streetfighter</destination>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>tetris1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>tetris</searchValue>
    <destination>/recalbox/share/roms/collections/tetris</destination>
    <destinationName>TETRIS</destinationName>
    <preserveFavorite>false</preserveFavorite>
    <exclusions>
     <exclusion>/recalbox/share/roms/collections2</exclusion>
    </exclusions>
  </rule>
  <rule>
    <name>tetris2</name>
    <searchAttribute>genre</searchAttribute>
    <searchValue>tetris</searchValue>
    <destination>/recalbox/share/roms/collections/tetris</destination>
    <preserveFavorite>false</preserveFavorite>
    <exclusions>
     <exclusion>/recalbox/share/roms/collections2</exclusion>
    </exclusions>
  </rule>
  <rule>
    <name>metalslug1</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>metalslug</searchValue>
    <destination>/recalbox/share/roms/collections/metalslug</destination>
    <destinationName>METAL SLUG</destinationName>
    <exclusions>
     <exclusion>/recalbox/share/roms/metal</exclusion>
    </exclusions>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>metalslug2</name>
    <searchAttribute>name</searchAttribute>
    <searchValue>metal slug</searchValue>
    <destination>/recalbox/share/roms/collections/metalslug</destination>
    <exclusions>
     <exclusion>/recalbox/share/roms/metal</exclusion>
    </exclusions>
    <preserveFavorite>false</preserveFavorite>
  </rule>
  <rule>
    <name>players4</name>
    <searchAttribute>players</searchAttribute>
    <searchValue>4</searchValue>
    <destination>/recalbox/share/roms/collections/players4</destination>
    <destinationName>PLAYERS 4</destinationName>
    <preserveFavorite>false</preserveFavorite>
  </rule>  
</rules>

5) Puis je lance la recreation de la collection mais sans faire un full install (j'évite de lancer ./install.sh)

# python gamelistpower.py generate_sh info

6)  Et pour finir, je ne reboot pas (pas besoin) mais je relance simplement emulation station via l'interface de dépannage du manager de recalbox et le bouton "Redémarrer ES" accessible à partir de http://recalbox/help:


Et voilà, c'est pas simple mais c'est le plus sympa que j'ai trouvé et le résultat est vraiment super.

Enjoy !

Aucun commentaire :

Enregistrer un commentaire