@Lolonois it's functional but still have some minor issue. It does process just the one new game now instead of trying to run through all existing ones, and entries are no longer duplicated on rebuild.
But in specific circumstance (change relativePaths="true" to false, add 1 or more new game, then rebuild list with unattendSkip) then the existing games end up with media entries looking like:
<image>/home/pi/RetroPie/roms/snes/../../../.emulationstation/downloaded_media/snes/screenshots/ActRaiser (USA).png</image>
<marquee>/home/pi/RetroPie/roms/snes/../../../.emulationstation/downloaded_media/snes/marquees/ActRaiser (USA).png</marquee>
Note how it path into the roms directory first, before it reverse back out and then go into .emulationstation/downloaded_media.
Self-corrects if ran with unattend:
<image>/home/pi/.emulationstation/downloaded_media/snes/screenshots/ActRaiser (USA).png</image>
<marquee>/home/pi/.emulationstation/downloaded_media/snes/marquees/ActRaiser (USA).png</marquee>
...
Re: unattend - in order to speed up this step of testing I ran with flags skipexisting on for screenshots, marquees, and videos, as to not unnecessarily reprocess/copy these assets -- and it seems that skipexistingvideos is broken, it results in empty video tags every time:
<video/>
If ran again without skipexistingvideos, then the video tags are restored:
<video>/home/pi/.emulationstation/downloaded_media/snes/videos/ActRaiser (USA).mp4</video>
This happens either I have symlinks="true" or not.