Recalbox Forum

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • recalbox.com
    • Gitlab repository
    • Documentation
    • Discord

    [TIPS] Générer une liste complete des jeux

    Recalbox Général
    [tips] générer liste complete
    6
    20
    5749
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • manatlan
      manatlan last edited by

      Voilà un script python (besoin de la librairie "lxml") pour lister l'ensemble des jeux (et qques infos supplémentaires : date, genre, console ...). ça se base sur les fameux "gamelist.xml". Il suffit juste de configurer le chemin vers votre répertoire "roms", et ça produit un CSV (fichier excel) qui contient le tout.

      #!/usr/bin/python
      # -*- coding: utf-8 -*-
      import os,glob,collections
      from lxml.etree import pa**e
      
      Game = collections.namedtuple('Game', 'console name genre date image path')
      
      def genCSV(ll):
          with open("liste.csv","w+") as fid:
              for i in ll:
                  fid.write(
                      '%s;"%s";%s;%s\n' % (
                          i.console,
                          i.name,
                          i.genre or "",
                          i.date or ""
                      )
                  )
      
      def listgames(p,opt="*"):
      
          def get(i,e):
              ll=i.xpath(e)
              return ll[0].text if ll else None
      
          ll=[]
          for f in sorted(glob.glob( os.path.join(p,opt,"gamelist.xml") )):
              for i in pa**e(f).xpath("//game"):
                  fpath=os.path.dirname(f)
                  console=os.path.basename(fpath)
      
                  name,genre,date,image=get(i,"name"),get(i,"genre"),get(i,"releasedate"),get(i,"image")
                  path = os.path.realpath(os.path.join(fpath,get(i,"path")))
      
                  if genre and genre.strip().lower().startswith("bios"): continue     # zap bios file
                  if image: image = os.path.join( fpath, image )                      # create realpath to image
                  if date: date=date.strip()[:4]                                      # keep just the year
      
                  ll.append( Game(console,name,genre,date,image,path) )
          return ll
      
      if __name__ == "__main__":
      
          ll=listgames("/media/recalbox/roms")    # <--- just edit here !!!
      
          genCSV(ll)
          print( len(ll) )
      

      ça devrait pouvoir marcher partout, pour peu que python (2.7) et la lib externe "lxml" soit installée.

      C'est pratique pour moi, alors ça le sera peut être pour d'autres 😉

      voljega 1 Reply Last reply Reply Quote 2
      • Substring
        Substring last edited by

        Sympa le partage 🙂

        Former dev - Please reply with @substring so that i am notified when you answer me
        Ex dev - Merci de me répondre en utilisant @substring pour que je sois notifé

        1 Reply Last reply Reply Quote 0
        • voljega
          voljega Banned @manatlan last edited by

          @manatlan said in [TIPS] Générer une liste complete des jeux:

          Voilà un script python (besoin de la librairie "lxml")

          Cool script merci, comment on installe une librarie python sous Recalbox ? (je précise que je n'ai pas regardé si elle était déjà pas installé par défaut)

          manatlan 1 Reply Last reply Reply Quote 0
          • acris
            acris last edited by acris

            Semble qu'elle est installé : https://github.com/recalbox/recalbox-buildroot/search?utf8=✓&q=lxml&type=

            si quelque chose manque pas le choix

            • créer d'un package
            • compilation de recalboxOS
            voljega 1 Reply Last reply Reply Quote 0
            • voljega
              voljega Banned @acris last edited by

              @acris merci 🙂

              1 Reply Last reply Reply Quote 0
              • manatlan
                manatlan @voljega last edited by

                @voljega Faut pas l'utiliser à partir de la recalbox ; mais à partir d'un ordi, soit sous win, soit sous linux (moi) ... C'est beaucoup plus simple (et plus simple d'installer lxml 😉

                Il faut juste que t'as SD soit visible de l'ordi (soit par reseau (wifi), soit en partoche)
                et après, faut adapter le path (ligne : listgames("<PATH>")), en remplaçant ce dernier par le chemin vers ton répertoire "roms".

                Ca genère un CSV (pour excel ou libreoffice) ...

                Cependant, j'ai fait bien mieux depuis, je génère un HTML/JS, qui présente un tableau dans lequel tu peux filtrer par nom, console, genre, année ... bien plus pratique ...
                si ça interesse qqu'un, je le posterai ici

                voljega 1 Reply Last reply Reply Quote 0
                • acris
                  acris last edited by

                  @manatlan
                  pourquoi pas voir avec @DjLeChuck si il serait possible d'ajouter cette fonctionnalité dans le recalbox Manager
                  https://forum.recalbox.com/topic/3768/wip-recalbox-manager

                  ça pourrait peut être intéressant

                  DjLeChuck 1 Reply Last reply Reply Quote 0
                  • voljega
                    voljega Banned @manatlan last edited by

                    @manatlan en fait je demandai car je me mets à Python en ce moment et j'ai deux trois idées de scripts avec les fichiers xml de recalbox

                    manatlan 1 Reply Last reply Reply Quote 0
                    • DjLeChuck
                      DjLeChuck @acris last edited by

                      @acris Quoi quoi on m'appelle ? \o/
                      Mettre l'export CSV ? Ça peut être sympa en effet !

                      @manatlan pour que ton script soit encore un peu plus simple à utiliser, tu pourrais mettre le chemin vers les ROMs en arguments et récupérer sa valeur via sys.argv (https://www.tutorialspoint.com/python/python_command_line_arguments.htm)

                      manatlan 1 Reply Last reply Reply Quote 0
                      • acris
                        acris last edited by

                        @DjLeChuck oui tout à fait 😄
                        j'ajouterai pour ajouter la possibilité de créer une liste en utilisant gamelist.xml pour extraire les jeux de 2 joueurs, 4 joueurs et par type (plateforme, shoot em up) etc.. pourraient être intéressant 😄

                        DjLeChuck manatlan 2 Replies Last reply Reply Quote 0
                        • DjLeChuck
                          DjLeChuck @acris last edited by

                          @acris À rajouter sur la TODO list: https://github.com/DjLeChuck/recalbox-manager/issues ^^

                          1 Reply Last reply Reply Quote 0
                          • acris
                            acris last edited by

                            @DjLeChuck
                            voila fait : https://github.com/DjLeChuck/recalbox-manager/issues/40
                            désolé en français car encore bien réveillé pour de l'anglais.

                            DjLeChuck 1 Reply Last reply Reply Quote 0
                            • DjLeChuck
                              DjLeChuck @acris last edited by

                              @acris Oh je ne demande pas à ce que mes tickets soient en anglais de toute façon, ils peuvent aussi être en français ! 😄

                              1 Reply Last reply Reply Quote 0
                              • manatlan
                                manatlan @voljega last edited by

                                @voljega a ce moment là, pas la peine d'utiliser LXML, python est installée avec d'autres libs natives pour pa**er la dom xml ...
                                moi, j'ai utilisé lxml, car c'est la plus rapide, et celle que j'utilise tout le temps 😉

                                voljega 1 Reply Last reply Reply Quote 0
                                • manatlan
                                  manatlan @DjLeChuck last edited by

                                  @DjLeChuck ... j'ai un bon niveau en python, je connais tout ça 😉
                                  je ne l'ai pas mis en arg, car pour un utilisateur donné, il n'y a qu'un seul path (aka ça change pas tout le temps 😉

                                  Sinon, si le "manager" est en python, je veux bien mettre les mains dedans, avec plaisir. J'ai 20ans de python, de web/http/js et j'en passe 😉

                                  1 Reply Last reply Reply Quote 0
                                  • manatlan
                                    manatlan @acris last edited by

                                    @acris le hic, c'est que les scrapping sont rarement bons ... le genre, ça passe encore (mais il y a plein de genre pour un même genre (je me comprends ;-)) ... mais le nb de joueurs est très rarement juste ;-(
                                    Mais dans l'absolu, c'est clair que ce serait géant ...

                                    voilà un exemple de ce que je genere :
                                    http://in-the.appspot.com/recalbox/

                                    1 Reply Last reply Reply Quote 0
                                    • acris
                                      acris last edited by acris

                                      On utilise screenscraper dont la base de donnée est relativement nouvelle, je pense que les informations sont correctes.
                                      autant faire un truc complet que partiel.

                                      @manatlan pas mal ton exemple, tout ne fonctionne pas mais c'est super intéressant sur des romsets complets no-intro ça doit bien donnée.
                                      manquerait plus de pouvoir créer un dat pour faire le tri avec clrmamepro comme il le fait avec les roms parent et clones ahaha

                                      1 Reply Last reply Reply Quote 0
                                      • voljega
                                        voljega Banned @manatlan last edited by

                                        @manatlan ben je me mets tout juste au python donc bon là j'ai un exemple, c'est aussi bien pour commencer... on peut écrire aussi du xml avec lxml ?

                                        sinon des exemples d'autres libs ou fonctions faciles à utiliser ?

                                        manatlan 1 Reply Last reply Reply Quote 0
                                        • manatlan
                                          manatlan @voljega last edited by

                                          @voljega Oui, avec lxml tu peux sans soucis, c'est même conseillé. Cependant, même les libs internes de python le peuvent (elles sont juste un poil plus lentes (aucune n'est plus rapide que lxml))

                                          Voilà mon script qui génère un fichier "liste.js" :

                                          #!/usr/bin/python
                                          # -*- coding: utf-8 -*-
                                          import os,glob,collections,json
                                          from lxml.etree import pa&ast;&ast;e
                                          
                                          Game = collections.namedtuple('Game', 'console name genre date image path')
                                          
                                          def listgames(p,opt="*"):
                                          
                                              def get(i,e):
                                                  ll=i.xpath(e)
                                                  return ll[0].text if ll else None
                                          
                                              ll=[]
                                              for f in sorted(glob.glob( os.path.join(p,opt,"gamelist.xml") )):
                                                  try:
                                                      for i in pa&ast;&ast;e(f).xpath("//game"):
                                                          fpath=os.path.dirname(f)
                                                          console=os.path.basename(fpath)
                                          
                                                          name,genre,date,image=get(i,"name"),get(i,"genre"),get(i,"releasedate"),get(i,"image")
                                                          path = os.path.realpath(os.path.join(fpath,get(i,"path")))
                                          
                                                          if get(i,"hidden")=="true": continue                                # zap hidden
                                                          if genre and genre.strip().lower().startswith("bios"): continue     # zap bios file
                                                          if image: image = os.path.join( fpath, image )                      # create realpath to image
                                                          if date: date=date.strip()[:4]                                      # keep just the year
                                          
                                                          ll.append( Game(console,name,genre,date,image,path) )
                                                  except Exception as e:
                                                      print "Fichier XML invalide:",f,e
                                              return ll
                                          
                                          def genJS(ll):
                                              ll=[{"name":i.name,"console":i.console,"genre":i.genre or "NO GENRE","year":i.date or "NO YEAR","image":i.image} for i in ll]
                                              with open('liste.js', 'w') as fid:
                                                  fid.write("var liste=");
                                                  json.dump(ll, fid)
                                          
                                          if __name__ == "__main__":
                                              ll=listgames("/media/recalbox/roms")    # <--- just edit here !!!
                                          
                                              print( len(ll) )
                                              genJS(ll)
                                          

                                          Ce fichier est chargé par https://in-the.appspot.com/recalbox/index.html ...
                                          (du coup, si vous voulez le faire chez vous, suffit de recupérer cet "index.html" (show source, ou le télécharger, et de mettre le liste.js généré par le script python)

                                          C'est juste un "index.html" de base (y a juste le css minimum, mais on peut trier les colonnes 😉

                                          1 Reply Last reply Reply Quote 0
                                          • alex28700
                                            alex28700 last edited by

                                            Bonjour tous ! Je trouve la fonction hyper intéressante, y a t-il eu des développements sur cette idée ? Elle semble être tombée aux oubliettes car ce sujet a 3 ans et la fonctionnalité n'est pas apparue depuis sur recalbox manager...

                                            Je n'ai pas réussi à tirer quelque chose du script de @manatlan (merci au passage du partage, je suis assez mauvais en programmation mais je ne lâche pas l'affaire !)

                                            J'ai utilisé le premier script, celui qui sort un csv.

                                            • Install de Python 3.8.1 et librairie lxml 4.4.2
                                            • J'édite le script pour y inclure vers le répertoire des roms que j'ai copié sur mon bureau "E:\Bureau\roms"
                                            • Je lance le script
                                            • Ca me sort un csv mais il est vide...

                                            Si vous avez des pistes pour faire fonctionner le script je suis preneur, ou si depuis quelque chose d'autre a été developpé encore mieux, merci d'avance !

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Want to support us ?

                                            72
                                            Online

                                            98.7k
                                            Users

                                            28.1k
                                            Topics

                                            187.0k
                                            Posts

                                            Copyright © 2021 recalbox.com