diff --git a/backend/resources/2-collection.csv b/backend/resources/2-collection.csv deleted file mode 100644 index f222abc..0000000 --- a/backend/resources/2-collection.csv +++ /dev/null @@ -1,1514 +0,0 @@ -Nom du jeu;Plateforme;Studio de développement;Date de sortie -Freedom Wars Remastered;Playstation5;Dimps;2025-01-10 -Tales of Graces f Remastered;Playstation5;TOSE / Bandai Namco Studios;2025-01-17 -Dynasty Warriors: Origins;Playstation5;Omega Force;2025-01-17 -Cuisineer;Playstation5;BattleBrew Productions;2025-01-28 -Sniper Elite: Resistance;Playstation5;Rebellion Developments;2025-01-30 -Phantom Brave: The Lost Hero;Playstation5;Nippon Ichi Software;2025-01-30 -Kingdom Come: Deliverance II;Playstation5;Warhorse Studios;2025-02-04 -Sid Meier's Civilization VII;Playstation5;Firaxis Games;2025-02-11 -The Legend of Heroes: Trails Through Daybreak II;Playstation5;Nihon Falcom;2025-02-14 -Tomb Raider IV-VI Remastered;Playstation5;Aspyr / Crystal Dynamics;2025-02-14 -Rugby 25;Playstation5;Big Ant Studios;2025-02-13 -Afterlove EP;Playstation5;Pikselnesia;2025-02-14 -Like a Dragon: Pirate Yakuza in Hawaii;Playstation5;Ryu Ga Gotoku Studio;2025-02-21 -Monster Hunter Wilds;Playstation5;Capcom;2025-02-28 -1917: The Alien Invasion DX Remastered;Playstation5;Andrade Games;2025-02-28 -Two Point Museum;Playstation5;Two Point Studios;2025-03-04 -Split Fiction;Playstation5;Hazelight Studios;2025-03-06 -Suikoden I & II HD Remaster: Gate Rune and Dunan Unification Wars;Playstation5;Konami;2025-03-06 -WWE 2K25;Playstation5;Visual Concepts;2025-03-14 -MLB The Show 25;Playstation5;San Diego Studio;2025-03-18 -Assassin's Creed Shadows;Playstation5;Ubisoft Quebec;2025-03-20 -Atelier Yumia: The Alchemist of Memories & the Envisioned Land;Playstation5;Gust;2025-03-21 -Bleach: Rebirth of Souls;Playstation5;Tamsoft;2025-03-21 -Atomfall;Playstation5;Rebellion Developments;2025-03-27 -The First Berserker: Khazan;Playstation5;Neople;2025-03-27 -South of Midnight;Playstation5;Compulsion Games;2025-04-08 -Amerzone: The Explorer's Legacy;Playstation5;Microids Studio Paris;2025-04-24 -Clair Obscur: Expedition 33;Playstation5;Sandfall Interactive;2025-04-24 -Fatal Fury: City of the Wolves;Playstation5;SNK;2025-04-24 -Days Gone Remastered;Playstation5;Bend Studio;2025-04-25 -Forza Horizon 5;Playstation5;Playground Games;2025-04-29 -MotoGP 25;Playstation5;Milestone;2025-04-30 -Doom: The Dark Ages;Playstation5;id Software;2025-05-15 -Capcom Fighting Collection 2;Playstation5;Capcom;2025-05-16 -Onimusha 2: Samurai's Destiny;Playstation5;Capcom;2025-05-23 -F1 25;Playstation5;Codemasters;2025-05-30 -Elden Ring Nightreign;Playstation5;FromSoftware;2025-05-30 -Raidou Remastered: The Mystery of the Soulless Army;Playstation5;Atlus;2025-06-19 -Death Stranding 2: On the Beach;Playstation5;Kojima Productions;2025-06-26 -The Alters;Playstation5;11 bit studios;2025-06-13 -Tony Hawk's Pro Skater 3 + 4;Playstation5;Iron Galaxy Studios;2025-07-11 -RoboCop: Rogue City - Unfinished Business;Playstation5;Teyon;2025-07-17 -Wuchang: Fallen Feathers;Playstation5;Leenzee;2025-07-24 -Ninja Gaiden: Ragebound;Playstation5;The Game Kitchen;2025-07-31 -Mafia: The Old Country;Playstation5;Hangar 13;2025-08-08 -Gears of War: Reloaded;Playstation5;The Coalition;2025-08-26 -Metal Gear Solid Delta: Snake Eater;Playstation5;Konami / Virtuos;2025-08-28 -Lost Soul Aside;Playstation5;Ultizero Games;2025-08-29 -Hell is Us;Playstation5;Rogue Factor;2025-09-04 -Cronos: The New Dawn;Playstation5;Bloober Team;2025-09-05 -Class of Heroes 3 Remaster;Playstation5;Acquire / Zerodiv;2025-09-05 -Borderlands 4;Playstation5;Gearbox Software;2025-09-12 -The Legend of Heroes: Trails in the Sky 1st Chapter;Playstation5;Nihon Falcom;2025-09-19 -Sonic Racing: CrossWorlds;Playstation5;Sonic Team;2025-09-25 -Silent Hill f;Playstation5;NeoBards Entertainment;2025-09-25 -Agatha Christie: Death on the Nile;Playstation5;Microids Studio Lyon;2025-09-25 -EA Sports FC 26;Playstation5;EA Vancouver / EA Romania;2025-09-26 -Ghost of Yotei;Playstation5;Sucker Punch Productions;2025-10-02 -Digimon Story: Time Stranger;Playstation5;Media.Vision;2025-10-03 -Little Nightmares III;Playstation5;Supermassive Games;2025-10-10 -Battlefield 6;Playstation5;Battlefield Studios;2025-10-10 -Ninja Gaiden 4;Playstation5;Team Ninja / PlatinumGames;2025-10-21 -Jurassic World Evolution 3;Playstation5;Frontier Developments;2025-10-21 -The Outer Worlds 2;Playstation5;Obsidian Entertainment;2025-10-29 -Dragon Quest I & II HD-2D Remake;Playstation5;Artdink / Square Enix;2025-10-30 -Football Manager 26;Playstation5;Sports Interactive;2025-11-04 -Age of Empires IV: Anniversary Edition;Playstation5;Relic Entertainment / World's Edge;2025-11-04 -Syberia Remastered;Playstation5;Microids Studio Paris;2025-11-06 -Anno 117: Pax Romana;Playstation5;Ubisoft Mainz;2025-11-13 -Call of Duty: Black Ops 7;Playstation5;Treyarch / Raven Software;2025-11-14 -1000xResist;Playstation5;Sunset Visitor;2025-11-04 -Dying Light: The Beast;Playstation5;Techland;2025-12-31 -Dead End City;Playstation5;Pixel Licker;2025-12-31 -Amber Alert;Playstation5;MEATBREAD;2025-12-31 -Oxide Room 208;Playstation5;WildSphere;2025-12-31 -Darksiders Warmastered Edition;Playstation5;KAIKO / Vigil Games;2025-12-31 -System Shock 2: Remastered;Playstation5;Nightdive Studios;2025-12-31 -Tiny Bookshop;Playstation5;neoludic games;2025-12-31 -Dead of Darkness;Playstation5;Retrofiction Games;2025-12-31 -Forgive Me Father 2;Playstation5;Byte Barrel;2025-12-31 -Total Chaos;Playstation5;Trigger Happy Interactive;2025-12-31 -Rushing Beat X: Return of the Brawl Brothers;Playstation5;City Connection;2025-12-31 -The Bearer & the Last Flame;Playstation5;Dark Reaper Studio;2025-12-31 -Portrait of a Torn;Playstation5;Somepx;2025-12-31 -The Last Case of John Morley;Playstation5;Blyts;2025-12-31 -Necrophosis: Full Consciousness;Playstation5;Dragonis Games;2025-12-31 -I Hate This Place;Playstation5;Rock Square Thunder;2025-12-31 -Sworn;Playstation5;Windwalk Games;2025-12-31 -Naiad;Playstation5;HiWarp;2025-12-31 -Ereban: Shadow Legacy;Playstation5;Baby Robot Games;2025-12-31 -Hunt the Night;Playstation5;Moonlight Games;2025-12-31 -Inspector Waffles Early Days;Playstation5;Goloso Games;2025-12-31 -Koira;Playstation5;Studio Tolima;2025-12-31 -Windswept;Playstation5;WeatherFell;2025-12-31 -Formation Z;Playstation5;City Connection;2025-12-31 -Taxi Chaos 2;Playstation5;Team6 Game Studios;2025-12-31 -This is Fine: Maximum Cope;Playstation5;Numskull Games;2025-12-31 -Detective Collection Vol. 2;Playstation5;Various;2025-12-31 -Hood Story: Kaito Yamazaki;Playstation5;Zerouno Games;2025-12-31 -Frank and Drake;Playstation5;Appnormals Team;2025-12-31 -Gobliiins Collection;Playstation5;Pierre Gilhodes / Red Art Studios;2025-12-31 -Dungeon Drafters;Playstation5;Manalith Studios;2025-12-31 -City Hunter;Playstation5;Red Art Studios;2025-12-31 -Astral Ascent: Stellar Edition;Playstation5;Hibernian Workshop;2025-12-31 -Monster Crown: Sin Eater;Playstation5;Studio Aurum;2025-12-31 -Metal Suits: Counter-Attack;Playstation5;Eggtart;2025-12-31 -16-Bit Collection: Data East Vol. 1;Super Nintendo;;2017-09-30 -2020 Super Baseball;Super Nintendo;SNK;1993-03-12 -3 Ninjas Kick Back;Super Nintendo;;1994-06-01 -3rd Super Robot Wars;Super Nintendo;Banpresto;1993-07-23 -3×3 Eyes: Jūma Hōkan;Super Nintendo;;1995-12-22 -3×3 Eyes: Seima Kōrinden;Super Nintendo;Yutaka;1992-07-28 -4th Super Robot Wars;Super Nintendo;Banpresto;1995-03-17 -90 Minutes European Prime Goal;Super Nintendo;;1995-01-01 -A-Train III - Super Version;Super Nintendo;;1995-09-29 -A.S.P. Air Strike Patrol;Super Nintendo;;1994-02-18 -Aaahh!!! Real Monsters;Super Nintendo;Realtime Associates;1995-08-15 -ABC Monday Night Football;Super Nintendo;Kuusoukagaku;1989-01-01 -Accele Brid;Super Nintendo;Genki;1993-11-26 -Ace o Nerae!;Super Nintendo;Telenet Japan;1993-01-01 -Acme Animation Factory;Super Nintendo;Acclaim Studios London;1994-01-01 -Acrobat Mission;Super Nintendo;UPL;1991-01-01 -Action Pachio;Super Nintendo;;1993-04-09 -ActRaiser;Super Nintendo;;1990-12-16 -ActRaiser 2;Super Nintendo;;1993-10-29 -Addams Family Values;Super Nintendo;Ocean Software;1995-01-01 -Advanced V.G.;Super Nintendo;Giga;1993-01-01 -Adventures of Rocky & Bullwinkle and Friends;Super Nintendo;;1992-01-01 -Adventures of Yogi Bear;Super Nintendo;;1994-10-01 -Aero Fighters;Super Nintendo;Video System;1993-06-30 -Aero the Acro-Bat;Super Nintendo;Acclaim Studios Austin;1993-08-01 -Aero the Acro-Bat 2;Super Nintendo;Acclaim Studios Austin;1994-01-01 -Aerobiz;Super Nintendo;Koei;1992-02-01 -Aerobiz Supersonic;Super Nintendo;Koei;1993-04-02 -Aguri Suzuki F-1 Super Driving;Super Nintendo;Genki;1992-07-14 -Aim for the Ace!;Super Nintendo;Telenet Japan;1993-12-22 -Air Cavalry;Super Nintendo;Synergistic Software;1995-01-01 -Akira;Super Nintendo;Black Pearl Software; -Al Unser Jr.'s Road to the Top;Super Nintendo;Radical Entertainment;1994-11-01 -Albert Odyssey;Super Nintendo;Sun Corporation;1993-03-05 -Albert Odyssey 2: Jashin no Taidou;Super Nintendo;Sun Corporation; -Albert Odyssey II: Jashin no Taidou;Super Nintendo;;1996-01-01 -Alcahest;Super Nintendo;HAL Laboratory;1993-12-17 -Alfred Chicken;Super Nintendo;Twilight;1993-01-01 -Alice no Paint Adventure;Super Nintendo;;1995-09-15 -Alien 3;Super Nintendo;Acclaim Studios London / Bits Studios;1992-01-01 -Alien vs. Predator;Super Nintendo;;1993-01-01 -America Ōdan Ultra Quiz;Super Nintendo;;1992-11-20 -American Battle Dome;Super Nintendo;;1995-12-08 -American Gladiators;Super Nintendo;Incredible Technologies;1991-01-01 -An American Tail: Fievel Goes West;Super Nintendo;Hudson Soft;1994-01-01 -Ancient Magic: Bazoe! Mahou Sekai;Super Nintendo;;1993-01-01 -Andre Agassi Tennis;Super Nintendo;;1994-03-31 -Angelique;Super Nintendo;Koei Tecmo Holdings;1994-09-23 -Animaniacs;Super Nintendo;Konami;1994-11-01 -Another World;Super Nintendo;Delphine Software International / Éric Chahi;1991-01-01 -Aoki Densetsu Shoot!;Super Nintendo;Affect;1994-12-16 -Appleseed;Super Nintendo;;1994-08-26 -Arabian Nights: Sabaku no Seirei-ō;Super Nintendo;;1996-06-14 -Arcade's Greatest Hits: The Atari Collection 1;Super Nintendo;;1996-12-31 -Arcana;Super Nintendo;HAL Laboratory;1992-03-27 -Arcus Odyssey;Super Nintendo;Namco Tales Studio;1993-10-22 -Ardy Lightfoot;Super Nintendo;ASCII Corporation;1993-11-26 -Aretha II: Ariel no Fushigi na Tabi;Super Nintendo;Game Arts / Japan Art Media;1990-01-01 -Arkanoid;Super Nintendo;Taito;1986-01-01 -Arkanoid: Doh It Again;Super Nintendo;Taito;1997-01-15 -Armored Police Metal Jack;Super Nintendo;;1992-07-31 -Art of Fighting 2;Super Nintendo;SNK;1994-01-01 -Asameshimae Nyanko;Super Nintendo;;1994-03-18 -Ashita no Joe;Super Nintendo;;1992-11-27 -Assault Suits Valken 2;Super Nintendo;Nippon Computer Systems;1992-12-18 -Asterix;Super Nintendo;Bit Managers;1993-01-01 -Astral Bout;Super Nintendo;;1992-06-26 -Axelay;Super Nintendo;Konami;1992-09-01 -B.O.B.;Super Nintendo;;1993-06-01 -Bahamut Lagoon;Super Nintendo;Square;1996-02-09 -Bakushou!! Kinsey Gekijou;Super Nintendo;Taito;1989-03-17 -Ball Bullet Gun: Survival Game Simulation;Super Nintendo;;1995-12-01 -Ballz;Super Nintendo;PF Magic;1994-01-01 -Banshee's Last Cry;Super Nintendo;Chunsoft;1994-11-25 -Barbarossa;Super Nintendo;SystemSoft Alpha;1992-11-27 -Barbie: Super Model;Super Nintendo;;1993-01-01 -Barbie: Vacation Adventure;Super Nintendo;Software Creations;1994-01-01 -Barcode Battler Senki: Super Senshi Shutsugeki Seyo!;Super Nintendo;;1993-01-01 -Barkley Shut Up and Jam!;Super Nintendo;Accolade;1993-01-01 -Bass Fishing;Super Nintendo;;1993-01-01 -Bass Masters Classic;Super Nintendo;;1994-01-01 -Bass Masters Classic: Pro Edition;Super Nintendo;Black Pearl Software;1996-01-01 -Bassin's Black Bass with Hank Parker;Super Nintendo;;1994-09-23 -Bastard‼;Super Nintendo;;1994-01-28 -Batman Forever;Super Nintendo;Acclaim Studios London;1995-01-01 -Batman Returns;Super Nintendo;;1993-02-26 -Batman: The Animated Series;Super Nintendo;Konami;1993-11-01 -Battle Blaze;Super Nintendo;Aicom;1992-05-01 -Battle Cars;Super Nintendo;;1993-10-01 -Battle Clash;Super Nintendo;Nintendo Research & Development 1;1992-10-01 -Battle Commander: Hachibushu, Shura no Heihou;Super Nintendo;; -Battle Cross;Super Nintendo;;1994-12-09 -Battle Dodge Ball: Toukyuu Daigekitotsu!;Super Nintendo;;1991-07-20 -Battle Dodgeball II;Super Nintendo;;1993-01-01 -Battle Grand Prix;Super Nintendo;;1992-03-27 -Battle Jockey;Super Nintendo;;1994-12-22 -Battle Master: Kyuukyoku no Senshitachi;Super Nintendo;;1993-01-01 -Battle Pinball;Super Nintendo;;1995-02-24 -Battle Racers;Super Nintendo;;1995-03-17 -Battle Robot Retsuden;Super Nintendo;Winkysoft;1995-09-01 -Battle Soccer 2;Super Nintendo;;1994-11-25 -Battle Soccer: Field no Hasha;Super Nintendo;;1992-12-11 -Battle Submarine;Super Nintendo;Office Koukan;1995-12-22 -Battle Zeque Den;Super Nintendo;Arsys Software;1994-07-15 -Battletoads & Double Dragon;Super Nintendo;Rare Ltd.;1993-01-01 -Battletoads in Battlemaniacs;Super Nintendo;Rare Ltd.;1993-06-01 -Bazooka Blitzkrieg;Super Nintendo;Tose Co.;1992-11-01 -Beavis and Butt-head;Super Nintendo;Radical Entertainment;1994-01-01 -Bebe's Kids;Super Nintendo;Radical Entertainment;1994-01-01 -Beethoven's 2nd;Super Nintendo;;1993-12-01 -Beethoven: The Ultimate Canine Caper;Super Nintendo;;1993-01-01 -Best of the Best: Championship Karate;Super Nintendo;Loriciels;1992-01-01 -Best Shot Pro Golf;Super Nintendo;;1996-06-14 -Big Run;Super Nintendo;Jaleco;1989-01-01 -Big Sky Trooper;Super Nintendo;Lucasfilm Games;1995-09-01 -Bike Daisuki! Hashiriya Kon – Rider's Spirits;Super Nintendo;Genki;1994-09-30 -Biker Mice from Mars;Super Nintendo;Konami;1994-03-04 -Bill Walsh College Football;Super Nintendo;Electronic Arts;1993-01-01 -Bing Bing! Bingo;Super Nintendo;;1993-12-22 -BioMetal;Super Nintendo;Athena;1993-01-01 -Bishoujo Senshi Sailor Moon R;Super Nintendo;;1993-12-29 -Bishoujo Wrestler Retsuden: Blizzard Yuki Rannyuu!!;Super Nintendo;; -Bishōjo Senshi Sailor Moon: Another Story;Super Nintendo;;1995-01-01 -Blackthorne;Super Nintendo;Blizzard Entertainment;1994-01-01 -BlaZeon;Super Nintendo;;1992-01-01 -Bobby's World;Super Nintendo;RSP, Inc.;1994-01-01 -Bomberman B-Daman;Super Nintendo;;1996-01-01 -Bomberman: Panic Bomber;Super Nintendo;Eighting / Hudson Soft;1994-12-22 -Bombuzal;Super Nintendo;Image Works;1988-01-01 -Bonkers;Super Nintendo;Capcom;1994-01-01 -Boogerman: A Pick and Flick Adventure;Super Nintendo;Interplay Entertainment;1994-11-14 -Boxing Legends of the Ring;Super Nintendo;Sculptured Software;1993-09-01 -Brain Lord;Super Nintendo;Produce!;1994-01-28 -Bram Stoker's Dracula;Super Nintendo;Traveller's Tales;1993-01-01 -Brandish;Super Nintendo;;1991-01-01 -Brawl Brothers;Super Nintendo;Jaleco;1992-12-22 -BreakThru!;Super Nintendo;Zoo Corporation;1994-06-01 -Breath of Fire;Super Nintendo;Capcom;1993-04-03 -Breath of Fire II;Super Nintendo;Capcom;1994-12-02 -Brett Hull Hockey;Super Nintendo;Radical Entertainment;1994-01-01 -Brett Hull Hockey '95;Super Nintendo;Radical Entertainment;1995-01-01 -Bronkie the Bronchiasaurus;Super Nintendo;;1995-09-01 -Brunswick World: Tournament of Champions;Super Nintendo;Tiertex Design Studios;1997-08-01 -Brutal: Paws of Fury;Super Nintendo;GameTek;1994-01-01 -BS F-Zero 2 Grand Prix;Super Nintendo;Nintendo;1996-01-01 -BS F-Zero Grand Prix;Super Nintendo;;1996-01-01 -BS Fire Emblem: Archanea Senki-hen;Super Nintendo;Intelligent Systems;1997-01-01 -BS Tantei Club: Yuki ni Kieta Kako;Super Nintendo;Nintendo Research & Development 1;1997-02-09 -BS The Legend of Zelda;Super Nintendo;Nintendo Research & Development 2;1995-08-06 -BS The Legend of Zelda: Ancient Stone Tablets;Super Nintendo;Nintendo Research & Development 2;1997-01-01 -Bubsy 2;Super Nintendo;Accolade;1994-10-28 -Bubsy in: Claws Encounters of the Furred Kind;Super Nintendo;Accolade;1993-01-01 -Bugs Bunny Rabbit Rampage;Super Nintendo;Viacom;1994-02-01 -Bulls vs. Blazers and the NBA Playoffs;Super Nintendo;Electronic Arts;1992-01-01 -Bushi Seiryūden: Futari no Yūsha;Super Nintendo;Game Freak;1997-01-17 -Cacoma Knight in Bizyland;Super Nintendo;;1992-11-21 -Caesars Palace;Super Nintendo;Realtime Associates;1992-12-01 -Cal Ripken Jr. Baseball;Super Nintendo;Krome Studios Melbourne;1992-12-01 -California Games II;Super Nintendo;Epyx;1990-01-01 -Cameltry;Super Nintendo;Taito;1989-01-01 -Cannon Fodder;Super Nintendo;Sensible Software;1993-01-01 -Capcom's MVP Football;Super Nintendo;;1993-01-01 -Captain America and The Avengers;Super Nintendo;Data East / Realtime Associates;1991-01-01 -Captain Commando;Super Nintendo;Capcom;1991-09-01 -Captain Novolin;Super Nintendo;Sculptured Software;1992-01-01 -Captain Tsubasa 3: Koutei no Chousen;Super Nintendo;Tecmo;1992-07-17 -Captain Tsubasa 4: Pro no Rival Tachi;Super Nintendo;Tecmo;1993-04-03 -Captain Tsubasa 5: Hasha no Shōgō Campione;Super Nintendo;Tecmo;1994-12-09 -Captain Tsubasa J: The Way to World Youth;Super Nintendo;;1995-11-17 -Caravan Shooting Collection;Super Nintendo;Hudson Soft;1995-07-07 -Carrier Aces;Super Nintendo;Synergistic Software;1995-01-01 -Carrier Aces Model SNSP-ACAP-EUR;Super Nintendo;;1995-01-01 -Casper;Super Nintendo;Imagineering;1996-12-01 -Castlevania: Dracula X;Super Nintendo;Konami;1995-07-21 -Castlevania: Rondo of Blood;Super Nintendo;Konami;1993-10-29 -CB Chara Wars: Ushinawareta Gag;Super Nintendo;;1992-01-01 -Champions World Class Soccer;Super Nintendo;Park Place Productions;1993-12-10 -Championship Pool;Super Nintendo;Bitmasters;1993-10-01 -Chaos Seed;Super Nintendo;Neverland;1996-03-15 -Chester Cheetah: Too Cool to Fool;Super Nintendo;Kaneko;1992-12-01 -Chester Cheetah: Wild Wild Quest;Super Nintendo;Kaneko;1993-01-01 -Chibi Maruko-chan: Harikiri 365-Nichi no Maki;Super Nintendo;;1991-12-13 -Chibi Maruko-chan: Mezase! Minami no Island!!;Super Nintendo;Konami;1995-12-01 -Choplifter III;Super Nintendo;Krome Studios Melbourne;1994-01-01 -Chrono Trigger;Super Nintendo;Square;1995-03-11 -Chrono Trigger: Crimson Echoes;Super Nintendo;;2009-05-31 -Chō Aniki: Bakuretsu Rantō-hen;Super Nintendo;Masaya;1995-09-22 -Civilization;Super Nintendo;MicroProse;1991-09-01 -Classic Road;Super Nintendo;;1993-10-29 -Classic Road II;Super Nintendo;;1995-02-24 -ClayFighter;Super Nintendo;Visual Concepts;1993-11-01 -ClayFighter 2: Judgment Clay;Super Nintendo;Interplay Entertainment;1995-01-01 -Claymates;Super Nintendo;Visual Concepts;1993-04-26 -Cliffhanger;Super Nintendo;Rockstar Lincoln;1993-10-01 -Clock Tower;Super Nintendo;Human Entertainment;1995-09-14 -ClockWerx;Super Nintendo;Callisto Corporation;1995-01-01 -Clue;Super Nintendo;Sculptured Software;1992-09-01 -College Slam;Super Nintendo;Acclaim Studios Austin;1996-01-31 -Columns;Super Nintendo;Sega;1990-06-29 -Computer Nouryoku Kaiseki: Ultra Baken;Super Nintendo;Culture Brain;1995-05-26 -Congo's Caper;Super Nintendo;Data East;1992-12-18 -Contra III: The Alien Wars;Super Nintendo;Konami;1992-02-28 -Cool Spot;Super Nintendo;Virgin Interactive;1993-09-01 -Cool World;Super Nintendo;;1993-02-01 -Coron Land;Super Nintendo;;1995-08-25 -Cosmo Gang the Puzzle;Super Nintendo;Namco;1992-11-26 -Cosmo Gang the Video;Super Nintendo;Namco;1992-03-01 -Cosmo Police Galivan II: Arrow of Justice;Super Nintendo;;1993-01-01 -Crayon Shin-Chan 2: Dai Maou no Gyakushuu;Super Nintendo;;1994-01-01 -Crayon Shin-Chan: Arashi wo Yobu Enji;Super Nintendo;;1993-01-01 -Crystal Beans: From Dungeon Explorer;Super Nintendo;;1995-10-27 -Cutthroat Island;Super Nintendo;Software Creations;1995-01-01 -Cyber Citizen Shockman Zero;Super Nintendo;Masaya;1997-03-20 -Cyber Knight;Super Nintendo;Group SNE;1992-10-30 -Cyber Knight II: Chikyū Teikoku no Yabō;Super Nintendo;;1994-01-01 -Cyber Spin;Super Nintendo;Arc System Works;1992-03-19 -Cyborg 009;Super Nintendo;Riot Games;1993-01-01 -D-Force;Super Nintendo;Asmik Ace Entertainment;1991-12-20 -Daffy Duck: The Marvin Missions;Super Nintendo;ICOM Simulations;1994-04-28 -Daibakushou!! Jinsei Gekijou;Super Nintendo;;1992-01-01 -Daibakushou!! Jinsei Gekijou: Dokidoki Seishun Hen;Super Nintendo;;1993-01-01 -Daibakushou!! Jinsei Gekijou: Ooedo Nikki;Super Nintendo;;1994-01-01 -Daibakushou!! Jinsei Gekijou: Zukkoke Salaryman Hen;Super Nintendo;;1995-12-29 -Daikaijū Monogatari;Super Nintendo;Birthday;1994-12-22 -Daikaijū Monogatari II;Super Nintendo;Birthday;1996-08-02 -Daisenryaku;Super Nintendo;Genki / Sega / SystemSoft Alpha;1991-06-17 -Darius Force;Super Nintendo;Taito;1993-09-24 -Darius Twin;Super Nintendo;Taito;1991-03-29 -Dark Half;Super Nintendo;;1996-01-01 -Dark Kingdom;Super Nintendo;;1994-04-29 -Dark Law: Meaning of Death;Super Nintendo;;1997-03-28 -Daruma Dōjō;Super Nintendo;; -Date Kimiko no Virtual Tennis;Super Nintendo;Jorudan;1994-05-13 -David Crane's Amazing Tennis;Super Nintendo;Absolute Entertainment;1992-01-01 -Daze Before Christmas;Super Nintendo;Funcom;1994-01-01 -Dear Boys;Super Nintendo;; -Dekitate High School;Super Nintendo;;1995-07-07 -Demolition Man;Super Nintendo;Virgin Interactive;1994-11-23 -Demon's Crest;Super Nintendo;Capcom;1994-01-01 -Denjinmakai;Super Nintendo;Winkysoft;1993-01-01 -Dennis the Menace;Super Nintendo;Ocean Software;1993-01-01 -Desert Strike;Super Nintendo;Electronic Arts;1992-02-01 -Dezaemon;Super Nintendo;;1994-09-20 -Dig & Spike Volleyball;Super Nintendo;Tose Co.;1992-11-27 -Dino Dini's Goal;Super Nintendo;Dino Dini;1993-01-01 -Dino Dini's Soccer;Super Nintendo;Dino Dini;1994-01-01 -DinoCity;Super Nintendo;Irem;1992-01-01 -Dirt Racer;Super Nintendo;; -Dirt Trax FX;Super Nintendo;Sculptured Software;1995-01-01 -Disney's Aladdin;Super Nintendo;Capcom;1993-01-01 -Disney's Beauty and the Beast;Super Nintendo;;1994-07-01 -Disney's Magical Quest 3 Starring Mickey & Donald;Super Nintendo;Capcom;1995-12-01 -Dolucky no Kusayakiu;Super Nintendo;Zoom;1993-12-17 -Dolucky no Puzzle Tour '94;Super Nintendo;Zoom;1994-10-28 -Dolucky's A-League Soccer;Super Nintendo;Zoom;1994-07-08 -Donald In the Magic Cap;Super Nintendo;;1995-08-11 -Donkey Kong Country;Super Nintendo;Rare Ltd.;1994-11-18 -Donkey Kong Country 2: Diddy's Kong Quest;Super Nintendo;Rare Ltd.;1995-11-20 -Donkey Kong Country 3: Dixie Kong's Double Trouble!;Super Nintendo;Rare Ltd.;1996-11-18 -Doom Troopers: Mutant Chronicles;Super Nintendo;;1995-01-01 -Doomsday Warrior;Super Nintendo;;1992-03-01 -Doraemon 2: Nobita no Toys Land Daibouken;Super Nintendo;SAS Sakata;1993-12-17 -Doraemon 3;Super Nintendo;Fortyfive;1994-12-16 -Doraemon 4;Super Nintendo;Agenda;1995-12-15 -Doraemon: Nobita to Yousei no Kuni;Super Nintendo;;1993-02-19 -DoReMi Fantasy;Super Nintendo;Hudson Soft;1996-03-22 -Dossun! Ganseki Battle;Super Nintendo;;1994-12-16 -Double Dragon V: The Shadow Falls;Super Nintendo;Leland Interactive Media;1994-07-10 -Down the World: Mervil's Ambition;Super Nintendo;;1994-09-30 -Downtown Nekketsu Baseball Monogatari;Super Nintendo;;1993-01-01 -Dr. Mario;Super Nintendo;Nintendo Research & Development 1;1990-07-27 -Dragon Ball Z: Hyper Dimension;Super Nintendo;Bandai;1996-01-01 -Dragon Ball Z: Super Butōden;Super Nintendo;Bandai;1993-01-01 -Dragon Ball Z: Super Butōden 2;Super Nintendo;Bandai;1993-01-01 -Dragon Ball Z: Super Butōden 3;Super Nintendo;Bandai;1994-01-01 -Dragon Ball Z: Super Gokuden - Kakusei-Hen;Super Nintendo;;1995-09-22 -Dragon Ball Z: Super Gokuden - Totsugeki-Hen;Super Nintendo;;1995-03-24 -Dragon Ball Z: Super Saiya Densetsu;Super Nintendo;Tose Co.;1992-01-25 -Dragon Knight 4;Super Nintendo;ELF Corporation;1994-02-25 -Dragon Quest;Super Nintendo;Chunsoft;1986-01-01 -Dragon Quest II;Super Nintendo;Chunsoft;1987-01-26 -Dragon Quest III;Super Nintendo;Chunsoft;1988-02-10 -Dragon Quest V;Super Nintendo;Chunsoft;1992-09-27 -Dragon Quest VI;Super Nintendo;Heartbeat;1995-12-09 -Dragon Slayer: The Legend of Heroes;Super Nintendo;;1989-12-10 -Dragon Slayer: The Legend of Heroes II;Super Nintendo;;1992-03-19 -Dragon Squadron: Danzarb;Super Nintendo;;1993-01-01 -Dragon's Earth;Super Nintendo;Human Entertainment;1993-01-22 -Dragon's Lair;Super Nintendo;;1992-01-01 -Dragon: The Bruce Lee Story;Super Nintendo;Virgin Interactive;1994-01-01 -Drakkhen;Super Nintendo;;1989-01-01 -Dream Basketball: Dunk & Hoop;Super Nintendo;;1994-11-18 -Dream TV;Super Nintendo;;1994-04-01 -Dual Orb;Super Nintendo;;1993-03-05 -Dual Orb II;Super Nintendo;Nippon Ichi Software;1994-12-29 -Dungeon Master;Super Nintendo;FTL Games;1987-01-01 -Dynamic Stadium;Super Nintendo;; -DynamiTracer;Super Nintendo;Square;1996-01-27 -Dōkyūsei 2;Super Nintendo;ELF Corporation;1995-01-01 -E.V.O.: Search for Eden;Super Nintendo;Givro;1992-12-21 -Earth Defense Force;Super Nintendo;Jaleco;1991-10-25 -Earth Light;Super Nintendo;Hudson Soft;1992-07-24 -EARTH LIGHT LUNA STRIKE;Super Nintendo;;1996-01-01 -EarthBound 64;Super Nintendo;Nintendo;2000-03-22 -Earthworm Jim;Super Nintendo;Shiny Entertainment;1994-01-01 -Earthworm Jim 2;Super Nintendo;Shiny Entertainment;1995-01-01 -Edo no Kiba;Super Nintendo;Riot;1993-03-12 -Eek! The Cat;Super Nintendo;;1994-08-01 -Elfaria;Super Nintendo;Hudson Soft / Red Entertainment;1993-01-03 -Elfaria II: The Quest of the Meld;Super Nintendo;;1995-06-09 -Elite Soccer;Super Nintendo;;1994-01-01 -Emerald Dragon;Super Nintendo;Alfa System;1995-07-28 -Emit;Super Nintendo;Koei;1994-03-25 -Emmitt Smith Football;Super Nintendo;;1995-11-01 -Energy Breaker;Super Nintendo;Neverland;1996-07-26 -Equinox;Super Nintendo;Software Creations;1993-11-12 -ESPN Baseball Tonight;Super Nintendo;Park Place Productions;1994-09-01 -ESPN National Hockey Night;Super Nintendo;Sony Imagesoft;1994-11-01 -ESPN SpeedWorld;Super Nintendo;Park Place Productions;1994-01-01 -ESPN Sunday Night NFL;Super Nintendo;Absolute Entertainment;1994-08-01 -Eternal Filena;Super Nintendo;Tokuma Shoten;1995-01-01 -Excitebike: Bun Bun Mario Battle Stadium;Super Nintendo;; -Extra Innings;Super Nintendo;Sting;1991-08-09 -Eye of the Beholder;Super Nintendo;Strategic Simulations / Westwood Studios;1990-01-01 -F - ZERO;Super Nintendo;;1990-01-01 -F-1 Grand Prix;Super Nintendo;Video System;1991-04-28 -F-1 Grand Prix Part II;Super Nintendo;Video System;1992-02-14 -F-1 Grand Prix Part III;Super Nintendo;Video System;1994-04-22 -F-Zero;Super Nintendo;Nintendo Entertainment Analysis & Development;1990-11-21 -F1 Pole Position;Super Nintendo;Human Entertainment;1992-11-20 -F1 Pole Position 2;Super Nintendo;Human Entertainment;1993-12-24 -F1 ROC II: Race of Champions;Super Nintendo;SETA Corporation;1993-03-05 -F1 ROC: Race of Champions;Super Nintendo;SETA Corporation;1992-01-01 -Famicom Bunko: Hajimari no Mori;Super Nintendo;;1999-01-01 -Famicom Tantei Club Part II: Ushiro ni Tatsu Shōjo;Super Nintendo;Tose Co.;1989-05-23 -Family Feud;Super Nintendo;Imagineering;1993-01-01 -Fatal Fury 2;Super Nintendo;SNK;1992-12-12 -Fatal Fury Special;Super Nintendo;SNK;1993-09-16 -Fatal Fury: King of Fighters;Super Nintendo;SNK;1991-11-25 -Feda: The Emblem of Justice;Super Nintendo;;1994-10-28 -Feudal Bros: Tonosama #1;Super Nintendo;;1995-03-31 -Fever Pitch Soccer;Super Nintendo;U.S. Gold;1995-01-01 -FIFA 97;Super Nintendo;EA Vancouver;1996-01-01 -FIFA Soccer 96;Super Nintendo;Acclaim Studios London;1995-01-01 -FIFA: Road to World Cup 98;Super Nintendo;EA Vancouver;1997-01-01 -Fighter's History;Super Nintendo;;1993-01-01 -Fighter's History: Mizoguchi Kiki Ippatsu !!;Super Nintendo;;1995-01-01 -Final Fantasy IV;Super Nintendo;Square;1991-07-19 -Final Fantasy Mystic Quest;Super Nintendo;Square;1992-10-05 -Final Fantasy V;Super Nintendo;Square;1992-12-06 -Final Fantasy VI;Super Nintendo;Square;1994-04-02 -Final Fight;Super Nintendo;Capcom;1989-11-25 -Final Fight 2;Super Nintendo;Capcom;1993-01-01 -Final Fight 3;Super Nintendo;Capcom;1995-12-21 -Final Set;Super Nintendo;;1993-09-17 -Final Stretch;Super Nintendo;Genki;1993-11-12 -Fire Emblem: Genealogy of the Holy War;Super Nintendo;Intelligent Systems;1996-05-14 -Fire Emblem: Mystery of the Emblem;Super Nintendo;Intelligent Systems;1994-01-21 -Fire Emblem: Thracia 776;Super Nintendo;Intelligent Systems;1999-09-01 -Firestriker;Super Nintendo;;1993-12-17 -Fireteam Rogue;Super Nintendo;Accolade; -First Queen;Super Nintendo;Kure Software Koubou;1988-01-01 -First Samurai;Super Nintendo;Vivid Image;1991-01-01 -Flash Hiders;Super Nintendo;Right Stuff;1993-12-19 -Flashback;Super Nintendo;Delphine Software International;1992-01-01 -Flying Hero;Super Nintendo;Sting;1992-12-18 -Football Fury;Super Nintendo;;1992-07-24 -Foreman For Real;Super Nintendo;Software Creations;1995-11-27 -Frank Thomas' Big Hurt Baseball;Super Nintendo;Acclaim Studios Austin;1995-12-01 -Frantic Flea;Super Nintendo;;1996-04-01 -Frog Feast;Super Nintendo;;2005-01-01 -Frogger;Super Nintendo;Konami;1981-01-01 -From TV animation - Slam Dunk SD Heat Up!!;Super Nintendo;;1995-01-01 -Front Mission;Super Nintendo;G-Craft;1995-02-24 -Front Mission Series: Gun Hazard;Super Nintendo;;1996-02-23 -Full Throttle: All-American Racing;Super Nintendo;Gremlin Interactive;1994-12-16 -Fun 'n Games;Super Nintendo;Leland Interactive Media;1993-01-01 -Funaki Masakatsu: Hybrid Wrestler;Super Nintendo;;1994-10-21 -Furuta Atsuya no Simulation Pro Yakyuu 2;Super Nintendo;Hect;1996-08-24 -Future Basketball;Super Nintendo;Hudson Soft;1991-11-01 -G.O.D: Mezameyo to Yobu Koe ga Kikoe;Super Nintendo;;1996-01-01 -Gaia Saver;Super Nintendo;Arc System Works;1994-01-28 -Gakkou de atta Kowai Hanashi;Super Nintendo;Pandora Box;1995-08-04 -Galaxy Wars;Super Nintendo;Universal Entertainment;1979-01-01 -Game no Tatsujin;Super Nintendo;;1995-06-09 -Game no Tetsujin - The Shanghai;Super Nintendo;;1995-06-30 -Ganbare Goemon 2: Kiteretsu Shōgun Magginesu;Super Nintendo;Konami;1993-12-22 -Ganbare Goemon 3: Shishijūrokubē no Karakuri Manji Gatame;Super Nintendo;Konami;1994-12-16 -Ganbare Goemon Kirakira Dōchū: Boku ga Dancer ni Natta Wake;Super Nintendo;Konami;1995-12-22 -Ganpuru: Gunman's Proof;Super Nintendo;Lenar;1997-01-01 -Gdleen;Super Nintendo;;1991-01-01 -Gekisou Sentai Carranger: Zenkai! Racer Senshi;Super Nintendo;Winning Entertainment Group;1996-08-23 -Gekitotsu Dangan Jidōsha Kessen: Battle Mobile;Super Nintendo;;1993-06-25 -Gemfire;Super Nintendo;Koei;1991-08-29 -Genghis Khan II: Clan of the Gray Wolf;Super Nintendo;Koei;1992-07-30 -Genjū Ryodan;Super Nintendo;Crea-Tech;1995-06-30 -Genocide;Super Nintendo;Zoom;1989-07-23 -Genocide 2;Super Nintendo;;1994-08-05 -George Foreman's KO Boxing;Super Nintendo;Krome Studios Melbourne;1992-01-01 -Getsumen no Anubis;Super Nintendo;;1995-12-22 -Ghost Sweeper Mikami: Joreishi wa Nice Body;Super Nintendo;Winning Entertainment Group;1993-01-01 -Ghoul Patrol;Super Nintendo;Lucasfilm Games;1994-01-01 -Ginga Sengoku Gun'yūden Rai;Super Nintendo;;1996-03-29 -Gionbana;Super Nintendo;;1994-12-16 -Go Go Ackman;Super Nintendo;;1994-01-01 -Go Go Ackman 2;Super Nintendo;Aspect;1995-01-01 -Goal! Two;Super Nintendo;Tose Co.;1992-01-01 -Gods;Super Nintendo;The Bitmap Brothers;1991-01-01 -Godzilla: Monster War;Super Nintendo;Alfa System;1994-12-09 -Gokinjo Bōkentai;Super Nintendo;;1996-01-01 -Gokujo Parodius;Super Nintendo;Konami;1994-04-26 -Gon;Super Nintendo;Tose Co.;1994-11-11 -Goof Troop;Super Nintendo;Capcom;1993-07-01 -Gourmet Warriors;Super Nintendo;;1995-09-29 -GP-1;Super Nintendo;Genki;1993-06-25 -GP-1: Part II;Super Nintendo;Genki;1994-08-05 -Granhistoria: Genshi Sekaiki;Super Nintendo;;1995-06-30 -GT Racing;Super Nintendo;Lenar;1996-03-29 -GunForce;Super Nintendo;Irem;1992-11-01 -Habu Meijin no Omoshiro Shōgi;Super Nintendo;;1995-03-31 -Hagane: The Final Conflict;Super Nintendo;Red Entertainment;1994-11-18 -Hal's Hole in One Golf;Super Nintendo;;1991-02-23 -HammerLock Wrestling;Super Nintendo;Jaleco;1994-09-30 -Hanjuku Hero;Super Nintendo;Neverland / Square / Square Enix;1988-12-02 -Hanna Barbera's Turbo Toons;Super Nintendo;Empire Interactive;1994-01-01 -HardBall III;Super Nintendo;;1992-01-01 -Harley's Humongous Adventure;Super Nintendo;Visual Concepts;1993-02-01 -Harvest Moon;Super Nintendo;Pack-In-Video;1996-08-09 -Hashire Hebereke;Super Nintendo;Sun Corporation;1994-01-01 -Hat Trick Hero 2;Super Nintendo;Neverland;1994-07-29 -Hatayama Hatch no Pro Yakyuu News! Jitsumei Han;Super Nintendo;;1993-08-06 -Hebereke's Popoitto;Super Nintendo;Sun Corporation;1995-03-03 -Hebereke's Popoon;Super Nintendo;Sun Corporation;1993-12-22 -Heiankyo Alien;Super Nintendo;;1990-01-14 -Heisei Inu Monogatari Bow Pop'n Smash!!;Super Nintendo;;1994-04-28 -Heiwa Pachinko World;Super Nintendo;Office Koukan;1995-02-24 -Heiwa Pachinko World 2;Super Nintendo;Office Koukan;1995-09-29 -Heiwa Pachinko World 3;Super Nintendo;Office Koukan;1996-04-26 -Hero Senki: Project Olympus;Super Nintendo;Winkysoft;1992-11-20 -Hiryu no Ken S: Golden Fighter;Super Nintendo;;1992-01-01 -Hit the Ice;Super Nintendo;Taito;1990-01-01 -Hiōden: Mamono-tachi tono Chikai;Super Nintendo;Namco Tales Studio;1992-06-26 -Hokuto no Ken 6: Gekitō Denshōken - Haō heno Michi;Super Nintendo;;1992-01-01 -Hokuto no Ken 7: Seiken Retsuden - Denshōsha e no Michi;Super Nintendo;;1993-12-24 -Home Alone;Super Nintendo;;1991-01-01 -Home Alone 2: Lost in New York;Super Nintendo;Imagineering;1992-01-01 -Home Improvement: Power Tool Pursuit!;Super Nintendo;Imagineering;1994-11-01 -Hong Kong 97;Super Nintendo;;1995-01-01 -Hook;Super Nintendo;Core Design / Rockstar Lincoln / Ukiyotei;1992-01-01 -Human Baseball;Super Nintendo;;1993-08-06 -Human Grand Prix IV: F1 Dream Battle;Super Nintendo;Human Entertainment;1995-08-25 -Hyper Iria;Super Nintendo;TamTam Co., Ltd.;1995-10-13 -Hyper Zone;Super Nintendo;HAL Laboratory;1991-08-31 -Idea no Hi;Super Nintendo;Office Koukan;1994-03-18 -Idol Janshi Suchie-Pai;Super Nintendo;;1993-01-01 -Ihatovo Monogatari;Super Nintendo;Hect;1993-03-05 -Illusion of Gaia;Super Nintendo;;1993-11-27 -Imperium;Super Nintendo;Tokai Communications;1992-02-01 -Incantation;Super Nintendo;Titus Interactive;1996-01-01 -Indiana Jones' Greatest Adventures;Super Nintendo;Factor 5 / Lucasfilm Games;1994-10-01 -Inindo: Way of the Ninja;Super Nintendo;Koei;1991-01-01 -Inspector Gadget;Super Nintendo;Fortyfive;1993-12-01 -International Sensible Soccer;Super Nintendo;;1993-01-01 -International Superstar Soccer;Super Nintendo;Konami;1994-11-11 -International Superstar Soccer Deluxe;Super Nintendo;Konami;1995-09-22 -International Tennis Tour;Super Nintendo;;1993-01-01 -Ippatsu Gyakuten: Keiba Keirin Kyōtei;Super Nintendo;;1996-04-26 -Iron Commando;Super Nintendo;Arcade Zone;1995-01-01 -Isozuri: Ritou Hen;Super Nintendo;;1996-01-19 -Itadaki Street 2: Neon Sign wa Bara Iro ni;Super Nintendo;ASCII Corporation;1994-02-26 -Itoi Shigesato no Bass Tsuri No. 1;Super Nintendo;HAL Laboratory;1997-02-21 -Ivan 'Ironman' Stewart's Super Off Road;Super Nintendo;Leland Corporation;1989-01-01 -J.League Excite Stage;Super Nintendo;;1994-01-01 -J.League Soccer Prime Goal;Super Nintendo;;1993-08-06 -J.League Super Soccer '95 Jikkyō Stadium;Super Nintendo;;1995-03-17 -J.R.R. Tolkien's The Lord of the Rings, Vol. I;Super Nintendo;Interplay Entertainment;1994-10-01 -Jack Nicklaus' Unlimited Golf & Course Design;Super Nintendo;; -Jaki Crush;Super Nintendo;Kaga Create;1992-01-01 -James Bond Jr.;Super Nintendo;;1992-01-01 -James Pond 2: Codename: RoboCod;Super Nintendo;;1991-01-01 -James Pond 3: Operation Starfish;Super Nintendo;;1993-01-01 -Jammes;Super Nintendo;;1995-02-10 -Jammit;Super Nintendo;;1994-09-01 -JB The Super Bass;Super Nintendo;Gaps;1995-12-15 -Jelly Boy;Super Nintendo;Acclaim Studios London;1994-01-01 -Jeopardy! Sports Edition;Super Nintendo;; -Jikkyō Keiba Simulation: Stable Star;Super Nintendo;KCEO;1996-03-22 -Jikkyō Oshaberi Parodius;Super Nintendo;Konami;1995-12-15 -Jikkyō Power Pro Wrestling '96: Max Voltage;Super Nintendo;;1996-01-01 -Jikkyō Powerful Pro Yakyū '94;Super Nintendo;;1994-03-11 -Jikkyō Powerful Pro Yakyū 2;Super Nintendo;;1995-02-24 -Jikkyō Powerful Pro Yakyū 3;Super Nintendo;;1996-01-01 -Jim Lee's Wild C.A.T.S: Covert Action Teams;Super Nintendo;Krome Studios Melbourne;1995-11-01 -Jim Power in Mutant Planet;Super Nintendo;;1993-03-19 -Jim Power: The Lost Dimension in 3-D;Super Nintendo;Loriciels;1993-12-01 -Jimmy Connors Pro Tennis Tour;Super Nintendo;Ubisoft Blue Byte;1993-01-01 -Jissen Kyōtei;Super Nintendo;;1995-06-23 -Joe & Mac;Super Nintendo;Data East;1991-12-06 -Joe & Mac 2: Lost in the Tropics;Super Nintendo;Data East;1994-02-18 -John Madden Football;Super Nintendo;Park Place Productions;1990-01-01 -John Madden Football '93;Super Nintendo;Looking Glass Studios;1992-01-01 -JoJo's Bizarre Adventure;Super Nintendo;Winkysoft;1993-03-05 -Judge Dredd;Super Nintendo;Acclaim Studios London;1995-01-01 -Jumbo Ozaki no Hole In One;Super Nintendo;;1991-01-01 -Jumpin' Derby;Super Nintendo;;1995-02-10 -Jungle Strike;Super Nintendo;Electronic Arts;1993-01-01 -JUNGLE WARS;Super Nintendo;;1993-01-01 -Jurassic Park;Super Nintendo;Ocean Software;1993-11-01 -Jurassic Park 2: The Chaos Continues;Super Nintendo;Ocean Software;1994-11-01 -Justice League Task Force;Super Nintendo;Sun Corporation;1995-06-01 -Justice Ninja Casey;Super Nintendo;Sun Corporation;1994-01-01 -JWP Joshi Pro Wrestling: Pure Wrestle Queens;Super Nintendo;;1994-01-01 -Jyutei Senki;Super Nintendo;;1993-08-27 -Kabuki Rocks;Super Nintendo;Red Entertainment;1994-03-04 -Kachō Kōsaku Shima: Super Business Adventure;Super Nintendo;;1993-09-17 -Kaizou Choujin Schbibinman Zero;Super Nintendo;;1997-01-01 -Kakinoki Shogi;Super Nintendo;Yoshikazu Kakinoki;1994-10-21 -Kamen Rider SD: Sortie!! Rider Machines;Super Nintendo;;1993-01-01 -Kat's Run: All Japan K-Car Championship;Super Nintendo;Atlus;1995-07-14 -Kawa no Nushi Tsuri 2;Super Nintendo;;1995-04-28 -Kawasaki Caribbean Challenge;Super Nintendo;Park Place Productions;1993-06-01 -Kawasaki Superbike Challenge;Super Nintendo;Lankhor;1994-01-01 -Ken Griffey, Jr. Presents Major League Baseball;Super Nintendo;Software Creations;1994-03-01 -Ken Griffey, Jr.'s Winning Run;Super Nintendo;Rare Ltd.;1996-06-01 -Kendo Rage;Super Nintendo;;1993-01-22 -Kero Kero Keroppi no Bōken Nikki: Nemureru Mori no Keroleen;Super Nintendo;;1994-03-25 -Kevin Keegan's Player Manager;Super Nintendo;Anco Software;1993-01-01 -Kick Off;Super Nintendo;Dino Dini;1989-01-01 -Kid Klown in Crazy Chase;Super Nintendo;Kemco;1994-09-10 -Kidō Butoden G Gundam;Super Nintendo;Bandai;1994-01-01 -Kidō Keisatsu Patlabor;Super Nintendo;;1994-04-22 -Kidō Senshi V Gundam;Super Nintendo;Bandai;1994-01-01 -Kidō Senshi Z Gundam: Away to the Newtype;Super Nintendo;Bandai;1996-01-01 -Killer Instinct;Super Nintendo;Rare Ltd.;1994-10-28 -King Arthur & the Knights of Justice;Super Nintendo;EA Seattle;1995-04-01 -King Arthur's World;Super Nintendo;Argonaut Games;1993-01-01 -King of the Monsters;Super Nintendo;SNK;1991-01-01 -King of the Monsters 2;Super Nintendo;SNK;1992-01-01 -Kingyo Chūihō! Tobidase Game Gakuen;Super Nintendo;Jaleco;1994-01-01 -Kinnikuman: Dirty Challenger;Super Nintendo;;1992-01-01 -Kirby Super Star;Super Nintendo;HAL Laboratory;1996-03-21 -Kirby's Avalanche;Super Nintendo;HAL Laboratory;1995-02-01 -Kirby's Dream Course;Super Nintendo;HAL Laboratory;1994-09-21 -Kirby's Dream Land 3;Super Nintendo;HAL Laboratory;1997-11-27 -Kirby's Star Stacker;Super Nintendo;HAL Laboratory;1997-03-18 -Kishin Dōji Zenki FX: Vajra Fight;Super Nintendo;Hudson Soft;1995-12-22 -Kishin Dōji Zenki: Battle Raiden;Super Nintendo;;1995-08-04 -Kishin Dōji Zenki: Den'ei Live;Super Nintendo;;1995-11-24 -Kishin Dōji Zenki: Tenchi Meidō;Super Nintendo;;1995-09-29 -Kiteretsu Daihyakka: Chōjikū Sugoroku;Super Nintendo;;1995-01-27 -Knights of the Round;Super Nintendo;Capcom;1991-11-27 -Konpeki no Kantai;Super Nintendo;;1995-04-21 -Kouryaku Casino Bar;Super Nintendo;;1995-07-14 -Koutetsu no Kishi;Super Nintendo;;1991-01-25 -Koutetsu no Kishi 2: Sabaku no Rommel Shougun;Super Nintendo;;1994-01-28 -Koutetsu no Kishi 3: Gekitotsu Europe Sensen;Super Nintendo;;1995-01-27 -Krusty's Fun House;Super Nintendo;Audiogenic;1992-01-01 -Krusty's Super Fun House;Super Nintendo;;1992-06-01 -Kunio no Oden;Super Nintendo;;1994-05-27 -Kunio-kun no Dodge Ball da yo: Zenin Shūgo;Super Nintendo;;1993-08-06 -Kyle Petty's No Fear Racing;Super Nintendo;Leland Interactive Media;1995-01-01 -Kōryū no Mimi;Super Nintendo;VAP Inc.;1995-09-29 -Kōshien 4;Super Nintendo;;1995-07-14 -Kūsō Kagaku Sekai Gulliver Boy;Super Nintendo;;1996-05-31 -Lady Stalker: Challenge from the Past;Super Nintendo;Climax Entertainment;1995-04-01 -Lagoon;Super Nintendo;Zoom;1990-09-12 -Lamborghini American Challenge;Super Nintendo;Titus Interactive;1992-01-01 -Langrisser II;Super Nintendo;Career Soft;1994-08-26 -Laplace no Ma;Super Nintendo;Group SNE;1993-03-30 -Last Bible III;Super Nintendo;;1995-01-01 -Leading Company;Super Nintendo;;1993-02-26 -Legend;Super Nintendo;Arcade Zone;1994-01-01 -Lemmings 2: The Tribes;Super Nintendo;DMA Design;1993-01-01 -Lennus II;Super Nintendo;;1996-07-26 -Lester the Unlikely;Super Nintendo;Visual Concepts;1994-01-01 -Lethal Enforcers;Super Nintendo;Konami Digital Entertainment, Inc.;1992-09-01 -Lethal Weapon;Super Nintendo;Eurocom;1992-01-01 -Libble Rabble;Super Nintendo;Namco;1983-12-16 -Liberty or Death;Super Nintendo;Koei;1994-03-18 -Light Fantasy;Super Nintendo;;1992-07-03 -Light Fantasy II;Super Nintendo;;1995-10-27 -Little Master;Super Nintendo;;1991-04-19 -Little Master: Nijiiro no Maseki;Super Nintendo;;1995-06-30 -Live A Live;Super Nintendo;Square;1994-09-02 -Logos Panic;Super Nintendo;;1995-11-17 -Looney Tunes B-Ball;Super Nintendo;Sculptured Software;1995-01-01 -Love Quest;Super Nintendo;;1995-03-17 -Lucky Luke;Super Nintendo;;1997-01-01 -Lufia & the Fortress of Doom;Super Nintendo;Neverland;1993-06-25 -Lufia II: Rise of the Sinistrals;Super Nintendo;Neverland;1995-02-24 -Lupin III: Densetsu no Hihō o Oe!;Super Nintendo;;1994-11-25 -Madden NFL '94;Super Nintendo;EA Orlando;1993-10-01 -Madden NFL '95;Super Nintendo;Electronic Arts;1994-11-18 -Madden NFL '96;Super Nintendo;EA Orlando;1995-11-01 -Madden NFL 97;Super Nintendo;EA Orlando;1996-01-01 -Madden NFL 98;Super Nintendo;EA Orlando;1997-01-01 -Madō Monogatari: Hanamaru Daiyōchienji;Super Nintendo;;1996-01-12 -Magic Boy;Super Nintendo;Empire Interactive;1993-01-01 -Magic Knight Rayearth;Super Nintendo;;1995-01-01 -Magic Sword: Heroic Fantasy;Super Nintendo;Capcom;1990-01-01 -Magical Drop;Super Nintendo;Data East;1995-01-01 -Magical Drop II;Super Nintendo;;1996-01-01 -Magical Pop'n;Super Nintendo;;1995-03-10 -Magical Tarurūto-kun: Magic Adventure;Super Nintendo;Game Freak;1992-01-01 -Magna Braban: Henreki no Yusha;Super Nintendo;;1994-11-18 -Mahōjin Guru Guru;Super Nintendo;;1995-04-21 -Mahōjin Guru Guru 2;Super Nintendo;;1996-01-01 -Majin Tensei;Super Nintendo;;1994-01-28 -Majin Tensei II: Spiral Nemesis;Super Nintendo;;1995-02-19 -Majo-tachi no Nemuri;Super Nintendo;;1995-11-24 -Major Title;Super Nintendo;Irem;1992-12-04 -Majyūō;Super Nintendo;KSS;1995-08-25 -Maka Maka;Super Nintendo;Office Koukan / Shōei System;1992-04-24 -Makeruna! Makendō 2: Kimero Youkai Souri;Super Nintendo;Success;1995-03-17 -Manchester United Championship Soccer;Super Nintendo;Krisalis Software; -Mario & Wario;Super Nintendo;Game Freak;1993-08-27 -Mario Is Missing!;Super Nintendo;The Software Toolworks;1993-01-01 -Mario Paint;Super Nintendo;Nintendo Research & Development 1;1992-07-14 -Mario's Early Years! Fun with Letters;Super Nintendo;;1993-01-01 -Mario's Early Years! Fun with Numbers;Super Nintendo;;1994-01-01 -Mario's Early Years! Preschool Fun;Super Nintendo;;1994-01-01 -Mario's Picross;Super Nintendo;Ape, Inc. / Jupiter;1995-03-14 -Mario's Super Picross;Super Nintendo;Creatures;1995-09-14 -Mario's Time Machine;Super Nintendo;Mindscape;1993-12-01 -Mark Davis' The Fishing Master;Super Nintendo;Winning Entertainment Group;1995-06-30 -Marvel Super Heroes in War of the Gems;Super Nintendo;Capcom;1996-10-18 -Marvelous: Mōhitotsu no Takarajima;Super Nintendo;Nintendo Research & Development 2;1996-10-26 -Mary Shelley's Frankenstein;Super Nintendo;Bits Studios;1994-11-01 -Math Blaster Episode I: In Search of Spot;Super Nintendo;;1994-01-01 -Matsukata Hiroki no Super Trawling;Super Nintendo;;1995-08-25 -Matsumura Kunihiro Den: Saikyō no Rekishi o Nurikaero!;Super Nintendo;;1994-08-26 -Maui Mallard in Cold Shadow;Super Nintendo;Disney Interactive Studios;1995-12-01 -Mazinger Z;Super Nintendo;Winkysoft;1993-06-25 -Mecarobot Golf;Super Nintendo;;1992-12-04 -MechWarrior;Super Nintendo;Krome Studios Melbourne;1993-01-01 -Mega Lo Mania;Super Nintendo;Sensible Software;1991-01-01 -Mega Man & Bass;Super Nintendo;Capcom;1998-04-24 -Mega Man 7;Super Nintendo;Capcom;1995-03-24 -Mega Man X;Super Nintendo;Capcom;1993-12-17 -Mega Man X2;Super Nintendo;Capcom;1994-12-16 -Mega Man X3;Super Nintendo;Capcom;1995-12-01 -Melfand Stories;Super Nintendo;;1994-03-25 -Metal Combat: Falcon's Revenge;Super Nintendo;Intelligent Systems;1993-12-01 -Metal Marines;Super Nintendo;Namco;1993-12-01 -Metal Max;Super Nintendo;Crea-Tech;1991-05-24 -Metal Max 2;Super Nintendo;Crea-Tech;1993-03-05 -Metal Morph;Super Nintendo;Origin Systems;1994-12-01 -Metal Slader Glory;Super Nintendo;HAL Laboratory;1991-08-30 -Metal Warriors;Super Nintendo;Lucasfilm Games;1995-01-01 -Michael Andretti's Indy Car Challenge;Super Nintendo;Genki;1994-09-01 -Michael Jordan: Chaos in the Windy City;Super Nintendo;Electronic Arts;1994-11-01 -Mickey Mania;Super Nintendo;Traveller's Tales;1994-10-01 -Mickey no Tokyo Disneyland Daibōken;Super Nintendo;;1994-12-16 -Mickey's Ultimate Challenge;Super Nintendo;Disney Interactive Studios;1994-01-01 -Micro Machines 2: Turbo Tournament;Super Nintendo;Codemasters;1994-01-01 -MIDI Maze;Super Nintendo;;1987-01-01 -Might and Magic II: Gates to Another World;Super Nintendo;New World Computing;1988-01-01 -Might and Magic III: Isles of Terra;Super Nintendo;New World Computing;1991-01-01 -Mighty Morphin Power Rangers;Super Nintendo;Winning Entertainment Group;1994-11-01 -Mighty Morphin Power Rangers: The Fighting Edition;Super Nintendo;Winning Entertainment Group;1995-09-01 -Mighty Morphin Power Rangers: The Movie;Super Nintendo;Winning Entertainment Group;1995-01-01 -Military Multipurpose Arcade Combat Simulator;Super Nintendo;; -Miracle Girls;Super Nintendo;Now Production;1993-01-01 -Miracle Piano Teaching System;Super Nintendo;Mindscape;1990-01-01 -MLBPA Baseball;Super Nintendo;;1995-07-01 -Mobile Fighter G Gundam;Super Nintendo;;1994-01-01 -Mobile Suit Gundam F91: Formula Report 0122;Super Nintendo;Bandai;1991-07-06 -Mobile Suit Gundam: Cross Dimension 0079;Super Nintendo;Bandai;1995-02-10 -Mobile Suit V Gundam;Super Nintendo;;1994-01-01 -Mobile Suit Z Gundam: Away to the Newtype;Super Nintendo;;1996-01-01 -Mohawk & Headphone Jack;Super Nintendo;;1996-08-01 -Momotaro Dentetsu HAPPY;Super Nintendo;;1996-01-01 -Monopoly;Super Nintendo;;1992-09-01 -Moon Cresta;Super Nintendo;Nichibutsu;1980-05-01 -Mortal Kombat;Super Nintendo;Midway Games;1992-10-08 -Mortal Kombat 3;Super Nintendo;Midway Games;1995-01-01 -Motoko-chan no Wonder Kitchen;Super Nintendo;Nintendo;1993-01-01 -Mountain Bike Rally;Super Nintendo;Radical Entertainment;1994-10-01 -Mr. Do!;Super Nintendo;Universal Entertainment;1995-06-23 -Mr. Nutz;Super Nintendo;Ocean Software;1994-01-01 -Mr. Tuff;Super Nintendo;The Sales Curve;1994-01-01 -Ms. Pac-Man;Super Nintendo;Midway Games;1982-01-13 -Mujintō Monogatari;Super Nintendo;;1994-08-05 -Musya;Super Nintendo;Jorudan;1992-04-21 -Mutant Fighter;Super Nintendo;Data East;1992-01-01 -Mystery Circle;Super Nintendo;;1992-12-04 -Mystery Dungeon: Shiren the Wanderer;Super Nintendo;Chunsoft;1995-12-01 -Mystic Ark;Super Nintendo;Produce!;1995-07-14 -Märchen Adventure Cotton 100%;Super Nintendo;Success;1994-01-01 -Mōko Densetsu 95: Hanshin Tigers;Super Nintendo;;1995-04-28 -Mōryō Senki Madara 2;Super Nintendo;Konami;1993-07-16 -Nage Libre: Seijaku no Suishin;Super Nintendo;;1995-02-24 -Nakajima Satoru F-1 Hero '94;Super Nintendo;;1994-09-22 -Nakano Kōichi Kanshū: Keirin Ō;Super Nintendo;;1994-11-18 -Namco Open;Super Nintendo;Tose Co.;1993-01-29 -Naruhodo! The World;Super Nintendo;Tomy;1994-01-01 -Natsuki Crisis Battle;Super Nintendo;Tose Co.;1995-04-21 -Natsume Championship Wrestling;Super Nintendo;Winning Entertainment Group;1994-01-01 -NBA All-Star Challenge;Super Nintendo;Krome Studios Melbourne;1993-05-21 -NBA Give 'n Go;Super Nintendo;Konami;1995-08-11 -NBA Hangtime;Super Nintendo;Midway Games;1996-04-16 -NBA Jam;Super Nintendo;Midway Games;1994-03-01 -NBA Jam: Tournament Edition;Super Nintendo;Midway Games;1994-01-01 -NBA Live 95;Super Nintendo;Electronic Arts;1994-01-01 -NBA Live 96;Super Nintendo;EA Sports;1995-01-01 -NBA Live 97;Super Nintendo;EA Sports;1996-01-01 -NBA Live 98;Super Nintendo;EA Sports;1997-01-01 -NBA Showdown;Super Nintendo;Electronic Arts;1993-10-01 -NCAA Basketball;Super Nintendo;Sculptured Software;1992-06-19 -NCAA Final Four Basketball;Super Nintendo;;1994-01-01 -NCAA Football;Super Nintendo;;1994-01-01 -Nekketsu Tairiku Burning Heroes;Super Nintendo;;1995-03-17 -New 3D Golf Simulation: Harukanaru Augusta;Super Nintendo;;1991-01-01 -New Yatterman: Nandai Kandai Yajirobee;Super Nintendo;;1996-01-01 -NFL Football;Super Nintendo;;1993-01-01 -NFL Quarterback Club;Super Nintendo;Acclaim Studios Austin;1994-11-01 -NFL Quarterback Club 96;Super Nintendo;Acclaim Studios Austin;1995-10-27 -NHL '94;Super Nintendo;EA Vancouver;1993-10-01 -NHL 95;Super Nintendo;Visual Concepts;1994-11-01 -NHL 96;Super Nintendo;EA Orlando;1995-09-01 -NHL 97;Super Nintendo;;1996-08-31 -NHL 98;Super Nintendo;EA Vancouver;1997-09-30 -NHL Stanley Cup;Super Nintendo;Sculptured Software;1993-01-01 -NHLPA Hockey '93;Super Nintendo;Park Place Productions;1992-12-01 -Nice de Shot;Super Nintendo;Magical Company;1994-04-29 -Nichibutsu Arcade Classics;Super Nintendo;;1995-05-26 -Nickelodeon GUTS;Super Nintendo;; -Nigel Mansell's World Championship Racing;Super Nintendo;Gremlin Interactive;1993-01-01 -Nightmare Busters;Super Nintendo;;2013-12-23 -Ninja Gaiden;Super Nintendo;Tecmo;1988-12-09 -Ninja Gaiden Trilogy;Super Nintendo;Team Ninja;1995-08-01 -Ninja Kid;Super Nintendo;Bandai;1993-01-01 -Nintendo PowerFest '94;Super Nintendo;;1994-01-01 -No Escape;Super Nintendo;Bits Studios;1994-01-01 -Nobunaga's Ambition;Super Nintendo;Koei Tecmo Games;1986-01-01 -Nobunaga's Ambition: Haouden;Super Nintendo;Koei;1992-01-01 -Nobunaga's Ambition: Lord of Darkness;Super Nintendo;;1995-03-31 -Nolan Ryan's Baseball;Super Nintendo;Affect;1991-07-02 -Nontan to Issho: KuruKuru Puzzle;Super Nintendo;Game Freak;1994-11-25 -Nosferatu;Super Nintendo;SETA Corporation;1994-10-07 -O-Chan no Oekaki Logic;Super Nintendo;;1995-09-08 -Obitus;Super Nintendo;;1991-01-01 -Ogre Battle: The March of the Black Queen;Super Nintendo;;1993-03-12 -Oishii Puzzle wa Irimasen ka?;Super Nintendo;;1996-03-08 -Okamoto Ayako to Match Play Golf;Super Nintendo;;1994-09-23 -Old Testament Megami-Tensei;Super Nintendo;;1995-01-01 -Olympic Summer Games;Super Nintendo;Silicon Dreams Studios / Tiertex Design Studios;1996-01-01 -Ongaku Tsukūru: Kanadeeru;Super Nintendo;Success;1996-04-12 -Onita Atsushi FMW;Super Nintendo;;1993-08-06 -Onizuka Katsuya Super Virtual Boxing;Super Nintendo;Sting;1993-11-26 -Operation Europe: Path to Victory;Super Nintendo;Koei;1993-01-16 -Operation Logic Bomb;Super Nintendo;Jaleco;1993-04-23 -Operation Thunderbolt;Super Nintendo;Taito;1988-01-01 -Original Japanese Release of Chrono Trigger;Super Nintendo;;1995-03-11 -Oscar;Super Nintendo;Flair Software;1993-01-01 -Osu!! Karate Bu;Super Nintendo;;1994-08-26 -Otoboke Ninja Colosseum;Super Nintendo;;1995-02-25 -Otogirisō;Super Nintendo;Chunsoft;1992-03-07 -Out to Lunch;Super Nintendo;Mindscape;1993-01-01 -Outlander;Super Nintendo;Mindscape;1993-04-01 -P.T.O.;Super Nintendo;Koei;1989-01-01 -P.T.O. II;Super Nintendo;Koei;1994-02-18 -Pac-Attack;Super Nintendo;Namco;1993-01-01 -Pac-In-Time;Super Nintendo;Kalisto Entertainment;1994-12-01 -Pac-Man;Super Nintendo;Namco;1980-05-22 -Pac-Man 2: The New Adventures;Super Nintendo;Namco;1994-01-01 -Packy and Marlon;Super Nintendo;;1995-06-01 -Paladin's Quest;Super Nintendo;;1992-11-13 -Panel de Pon;Super Nintendo;Intelligent Systems;1995-10-27 -Panic in Nakayoshi World;Super Nintendo;;1994-11-18 -Paperboy 2;Super Nintendo;Tengen;1991-01-01 -Papuwa;Super Nintendo;;1994-01-01 -Parodius! From Myth to Laughter;Super Nintendo;Konami;1990-04-25 -Pastel Jan;Super Nintendo;; -Pawapuro;Super Nintendo;;1995-02-24 -PGA European Tour;Super Nintendo;;1994-01-01 -PGA Tour 96;Super Nintendo;NuFX;1995-09-23 -PGA Tour Golf;Super Nintendo;BlueSky Software;1990-01-01 -Phalanx;Super Nintendo;Zoom;1992-01-01 -Phantom 2040;Super Nintendo;Sun Corporation;1995-05-04 -Pieces;Super Nintendo;Nippon Ichi Software;1994-07-22 -Pikiinya!;Super Nintendo;Crea-Tech;1997-01-31 -Pilotwings;Super Nintendo;Nintendo Entertainment Analysis & Development;1990-12-21 -Pinkie;Super Nintendo;Data Design Interactive;1994-09-01 -Pinocchio;Super Nintendo;Bit Managers;1996-01-01 -Pit-Fighter;Super Nintendo;Atari Games;1990-01-01 -Pitfall: The Mayan Adventure;Super Nintendo;;1994-11-01 -Plok;Super Nintendo;Software Creations;1993-09-01 -Pocky & Rocky;Super Nintendo;Winning Entertainment Group;1992-12-22 -Pocky & Rocky 2;Super Nintendo;Winning Entertainment Group;1994-06-17 -Pop'n TwinBee;Super Nintendo;Konami;1993-01-01 -Pop'n TwinBee: Rainbow Bell Adventures;Super Nintendo;Konami;1994-01-01 -Popeye: Ijiwaru Majo Seahag no Maki;Super Nintendo;Technōs Japan Corporation;1994-08-12 -Popful Mail;Super Nintendo;;1991-12-20 -Populous;Super Nintendo;Bullfrog Productions;1989-06-05 -Populous II: Trials of the Olympian Gods;Super Nintendo;Bullfrog Productions;1991-01-01 -Porky Pig's Haunted Holiday;Super Nintendo;Phoenix Studio;1995-01-01 -Power Athlete;Super Nintendo;;1992-08-14 -Power Instinct;Super Nintendo;;1993-01-01 -Power of the Hired;Super Nintendo;;1994-01-01 -Power Piggs of the Dark Age;Super Nintendo;Radical Entertainment;1994-01-01 -Power Rangers Zeo: Battle Racers;Super Nintendo;Winning Entertainment Group;1996-09-17 -Power Slide;Super Nintendo;Motivetime Ltd.;1994-04-12 -Power Soukoban;Super Nintendo;;1999-01-01 -Powermonger;Super Nintendo;Bullfrog Productions;1990-01-01 -Powerslide;Super Nintendo;Ratbag Games;1998-01-01 -Prehistorik Man;Super Nintendo;Titus Interactive;1995-06-23 -Primal Rage;Super Nintendo;Atari Games;1995-01-01 -Prince of Persia 2: The Shadow and the Flame;Super Nintendo;Broderbund;1993-01-01 -Princess Minerva;Super Nintendo;Riverhillsoft;1992-12-18 -Pro Kishi Jinsei Simulation: Shōgi no Hanamichi;Super Nintendo;Access;1996-02-16 -Pro Quarterback;Super Nintendo;Leland Interactive Media;1992-01-01 -Pro Sport Hockey;Super Nintendo;Tose Co.;1993-03-06 -Pro Yakyū Nettō: Puzzle Stadium;Super Nintendo;;1997-04-25 -Pro Yakyū Star;Super Nintendo;Culture Brain;1997-01-17 -Project Dream;Super Nintendo;Rare Ltd.;1998-01-01 -Psycho Dream;Super Nintendo;Riot;1992-12-11 -Push-Over;Super Nintendo;Red Rat Software;1992-01-01 -Putty;Super Nintendo;System 3;1992-01-01 -Putty Squad;Super Nintendo;System 3;1994-01-01 -Puyo Puyo;Super Nintendo;;1991-10-25 -Puyo Puyo 2;Super Nintendo;;1994-07-06 -Puzzle Bobble;Super Nintendo;Taito;1994-01-01 -Puzzle'N Desu!;Super Nintendo;;1995-04-14 -Q*bert 3;Super Nintendo;;1992-01-01 -R-Type III: The Third Lightning;Super Nintendo;Irem;1993-12-10 -R.B.I. Baseball 3;Super Nintendo;;1991-01-01 -Race Drivin';Super Nintendo;Atari Games;1990-08-01 -Radical Dreamers;Super Nintendo;Square;1996-02-03 -Radical Rex;Super Nintendo;Krome Studios Melbourne / Piko Interactive;1994-09-01 -Raiden;Super Nintendo;Seibu Kaihatsu;1991-07-06 -Rampart;Super Nintendo;Atari Games;1990-01-01 -Ranma ½: Chougi Ranbu Hen;Super Nintendo;;1994-04-28 -Ranma ½: Chōnai Gekitōhen;Super Nintendo;Nippon Computer Systems;1992-03-27 -Ranma ½: Hard Battle;Super Nintendo;Nippon Computer Systems;1992-12-25 -Ranma ½: Hidden Treasures of the Crimson Cats;Super Nintendo;;1993-10-22 -Rap Jam: Volume One;Super Nintendo;; -Realm;Super Nintendo;Titus Interactive;1997-02-27 -Record of Lodoss War;Super Nintendo;;1995-01-01 -Recruit Simulation: Shuushoku Game;Super Nintendo;;1995-07-28 -Rejoice: Aretha Ōkoku no Kanata;Super Nintendo;Japan Art Media;1995-04-21 -Relief Pitcher;Super Nintendo;;1992-01-01 -Rendering Ranger: R2;Super Nintendo;Rainbow Arts;1995-11-17 -Revolution X;Super Nintendo;Midway Games;1994-05-23 -Rex Ronan: Experimental Surgeon;Super Nintendo;Sculptured Software;1994-01-01 -Riddick Bowe Boxing;Super Nintendo;Malibu Comics;1994-12-18 -Ring ni Kakero;Super Nintendo;;1998-06-01 -Rise of the Phoenix;Super Nintendo;Koei;1993-01-01 -Rise of the Robots;Super Nintendo;;1994-01-01 -Rival Turf!;Super Nintendo;Jaleco;1992-01-01 -Road Riot 4WD;Super Nintendo;;1991-01-01 -Road Runner's Death Valley Rally;Super Nintendo;ICOM Simulations;1992-12-22 -RoboCop 3;Super Nintendo;Ocean Software;1992-10-01 -RoboCop Versus The Terminator;Super Nintendo;Virgin Interactive;1993-01-01 -Robotrek;Super Nintendo;;1994-07-08 -Rock n' Roll Racing;Super Nintendo;Blizzard Entertainment;1993-06-04 -Rocko's Modern Life: Spunky's Dangerous Day;Super Nintendo;Viacom;1994-04-01 -Rocky Rodent;Super Nintendo;Irem;1993-07-30 -Roger Clemens' MVP Baseball;Super Nintendo;Sculptured Software;1991-01-01 -Romance of the Three Kingdoms II;Super Nintendo;Koei;1989-10-01 -Romance of the Three Kingdoms III: Dragon of Destiny;Super Nintendo;Koei;1992-02-05 -Romance of the Three Kingdoms IV: Wall of Fire;Super Nintendo;Koei;1994-12-09 -Romancing SaGa;Super Nintendo;Square;1992-01-28 -Romancing SaGa 2;Super Nintendo;Square;1993-12-10 -Romancing SaGa 3;Super Nintendo;Square;1995-11-11 -RPG Tsukūru 2;Super Nintendo;Success;1996-01-31 -RPG Tsukūru: Super Dante;Super Nintendo;Kuusoukagaku;1995-03-31 -RPM Racing;Super Nintendo;Blizzard Entertainment;1992-03-19 -Ruin Arm;Super Nintendo;Tose Co.;1995-06-23 -Run Saber;Super Nintendo;GameFAQs;1993-01-01 -Saikyou: Takada Nobuhiko;Super Nintendo;; -Sailor Moon;Super Nintendo;Bandai;1993-01-01 -Sailor Moon R;Super Nintendo;;1993-01-01 -Sailor Moon S - Jougai Rantou!? Shuyaku Soudatsusen;Super Nintendo;;1994-01-01 -Sailor Moon S: Jōgai rantō!? Shuyaku sōdatsusen;Super Nintendo;Arc System Works;1994-12-14 -Samurai Shodown;Super Nintendo;SNK;1993-08-11 -Sangokushi Eiketsuden;Super Nintendo;;1995-12-28 -Sanrio World Smash Ball!;Super Nintendo;;1993-07-16 -Sansara Naga;Super Nintendo;;1990-03-23 -Sansara Naga 2;Super Nintendo;;1994-01-01 -Saturday Night Slam Masters;Super Nintendo;Capcom;1993-07-13 -Scooby-Doo Mystery;Super Nintendo;Argonaut Games;1995-01-01 -SD F-1 Grand Prix;Super Nintendo;Video System;1995-10-27 -SD Gundam Gaiden 2: Entaku no Kishi;Super Nintendo;Bandai;1992-01-01 -SD Gundam Gaiden: Knight Gundam Monogatari - Ooinaru Isan;Super Nintendo;Bandai;1991-12-21 -SD Gundam Generation: Axis Senki;Super Nintendo;Bandai;1996-01-01 -SD Gundam Generation: Babylonia Kenkoku Senki;Super Nintendo;Bandai;1996-01-01 -SD Gundam Generation: Colony Kaku Senki;Super Nintendo;Bandai;1996-01-01 -SD Gundam Generation: Gryps Senki;Super Nintendo;Bandai;1996-01-01 -SD Gundam Generation: Ichinen Sensouki;Super Nintendo;Bandai;1996-01-01 -SD Gundam Generation: Zanscare Senki;Super Nintendo;Bandai;1996-01-01 -SD Gundam: G Next;Super Nintendo;Bandai;1995-12-22 -SD Gundam: G Next - Unit & map collection;Super Nintendo;Bandai;1996-01-01 -SD Gundam: GX;Super Nintendo;Bandai;1994-01-01 -SD Gundam: Power Formation Puzzle;Super Nintendo;Bandai;1996-01-01 -SD Kidō Senshi Gundam 2;Super Nintendo;Bandai;1993-01-01 -SD Kidō Senshi Gundam: V Sakusen Shidō;Super Nintendo;Bandai;1992-01-01 -SD Mobile Suit Gundam;Super Nintendo;;1992-01-01 -SD The Great Battle;Super Nintendo;; -SeaQuest DSV;Super Nintendo;Sculptured Software;1994-01-01 -Secret of Mana;Super Nintendo;Square;1993-08-06 -Secret of the Stars;Super Nintendo;Tecmo;1993-11-05 -Seifuku Densetsu Pretty Fighter;Super Nintendo;Genki;1994-12-02 -Seijuu Maden: Beasts & Blades;Super Nintendo;;1996-01-01 -Sengoku;Super Nintendo;SNK;1991-02-12 -Sensible Soccer;Super Nintendo;Sensible Software;1992-01-01 -Sgt. Saunders' Combat!;Super Nintendo;;1995-09-29 -Shadow of the Beast;Super Nintendo;Ubisoft Reflections;1989-01-01 -Shadowrun;Super Nintendo;Krome Studios Melbourne;1993-05-01 -Shanghai III;Super Nintendo;Kuusoukagaku / Success / Sun Corporation;1993-11-01 -Shaq Fu;Super Nintendo;Delphine Software International;1994-10-01 -Shien's Revenge;Super Nintendo;Givro;1994-04-08 -Shigetaka Kashiwagi's Top Water Bassing;Super Nintendo;;1995-02-17 -Shijō Saikyō League Serie A: Ace Striker;Super Nintendo;;1995-03-31 -Shin Kidō Senki Gundam Wing: Endless Duel;Super Nintendo;Winning Entertainment Group;1996-03-29 -Shin Megami Tensei;Super Nintendo;;1992-01-01 -Shin Megami Tensei If…;Super Nintendo;;1994-10-28 -Shin Megami Tensei II;Super Nintendo;;1994-03-18 -Shin Momotaro Densetsu;Super Nintendo;;1993-01-01 -Shin Nekketsu Kōha: Kunio-tachi no Banka;Super Nintendo;Givro;1994-04-29 -Shin Onigashima;Super Nintendo;Nintendo Entertainment Analysis & Development / Pax Softnica;1987-09-04 -Shin SD Sengokuden: Daishōgun Retsuden;Super Nintendo;Bandai; -Shin Seikoku: La Wares;Super Nintendo;;1995-04-21 -Shinseiki Odysselya;Super Nintendo;;1993-06-18 -Shinseiki Odysselya II;Super Nintendo;;1995-10-06 -Shiroi Ringu he;Super Nintendo;;1995-10-27 -Shodai Nekketsu Kouha Kunio-Kun;Super Nintendo;;1992-01-01 -Shutokō Battle '94: Drift King Tsuchiya Keiichi & Bandō Masaaki;Super Nintendo;Genki;1994-05-27 -Shōgi Saikyō;Super Nintendo;;1994-12-23 -Shōnin yo Taishi wo Idake!!;Super Nintendo;Fortyfive;1995-12-15 -Side Pocket;Super Nintendo;Data East;1986-01-01 -Silva Saga II: The Legend of Light and Darkness;Super Nintendo;SETA Corporation;1993-06-25 -Sim City;Super Nintendo;Electronic Arts;1991-04-26 -SimCity 2000;Super Nintendo;Full Fat / Maxis;1993-01-01 -SimEarth;Super Nintendo;Maxis;1990-01-01 -SimTown;Super Nintendo;Maxis;1995-01-01 -Simulation Pro Yakyū;Super Nintendo;Hect;1995-04-28 -Sink or Swim;Super Nintendo;Eutechnyx;1993-01-01 -Sky Mission;Super Nintendo;;1992-09-29 -Skyblazer;Super Nintendo;Ukiyotei;1994-01-01 -Sküljagger: Revolt of the Westicans;Super Nintendo;;1992-10-01 -Slam Dunk;Super Nintendo;Tose Co.;1994-08-11 -Slam Dunk 2: IH Yosen Kanzenban!!;Super Nintendo;;1995-01-01 -Slayers;Super Nintendo;Bandai Entertainment Company;1994-06-24 -Smart Ball;Super Nintendo;Game Freak;1991-09-13 -Smash Tennis;Super Nintendo;Namco;1993-06-25 -Smash TV;Super Nintendo;WMS Industries;1990-04-01 -Snoopy Concert;Super Nintendo;Pax Softnica;1995-05-19 -Snow White: Happily Ever After;Super Nintendo;;1994-10-01 -Soccer Kid;Super Nintendo;Krisalis Software;1993-01-01 -Socks the Cat Rocks the Hill;Super Nintendo;Kaneko;1993-10-01 -Solid Runner;Super Nintendo;Sting;1997-03-28 -Song Master;Super Nintendo;Japan Art Media;1992-11-27 -Sonic Blast Man;Super Nintendo;Taito;1992-09-25 -Sonic Blast Man II;Super Nintendo;;1994-01-01 -Sonic the Hedgehog 4;Super Nintendo;;1996-01-01 -Soreyuke Ebisumaru Karakuri: Meiro Kieta Goemon no Nazo;Super Nintendo;;1996-01-01 -SOS;Super Nintendo;Human Entertainment;1993-05-28 -Sougou Kakutougi Rings: Astral Bout 3;Super Nintendo;;1995-01-01 -Sougou Kakutougi: Astral Bout 2 - The Total Fighters;Super Nintendo;;1994-01-01 -Soukou Kihei Votoms: The Battling Road;Super Nintendo;;1993-01-01 -Soul & Sword;Super Nintendo;;1993-11-30 -Soul Blazer;Super Nintendo;;1992-01-31 -Sound Fantasy;Super Nintendo;Nintendo; -Sound Novel Tsukūru;Super Nintendo;ASCII Corporation / Success;1996-05-31 -Space Ace;Super Nintendo;RDI Video Systems;1984-01-01 -Space Football: One on One;Super Nintendo;Bits Studios;1992-11-06 -Space Invaders;Super Nintendo;Taito;1978-01-01 -Space Invaders DX;Super Nintendo;;1994-03-25 -Space Megaforce;Super Nintendo;;1992-01-01 -Spanky's Quest;Super Nintendo;Winning Entertainment Group;1991-04-26 -Spark World;Super Nintendo;; -Sparkster;Super Nintendo;Konami;1994-09-15 -Sparkster: Rocket Knight Adventures 2;Super Nintendo;Konami;1994-02-22 -Spear of Destiny;Super Nintendo;id Software;1992-09-18 -Spectre;Super Nintendo;;1991-01-01 -Speed Racer in My Most Dangerous Adventures;Super Nintendo;Radical Entertainment;1994-11-01 -Speedy Gonzales: Los Gatos Bandidos;Super Nintendo;Sun Corporation;1995-08-01 -Spellcraft: Aspects of Valor;Super Nintendo;;1992-01-01 -Spider-Man and the X-Men in Arcade's Revenge;Super Nintendo;Software Creations;1993-08-19 -Spider-Man and Venom: Maximum Carnage;Super Nintendo;Software Creations;1994-01-01 -Spider-Man Animated Series;Super Nintendo;;1995-01-01 -Spindizzy Worlds;Super Nintendo;;1992-08-07 -Spirou;Super Nintendo;;1995-01-01 -Sports Illustrated: Championship Football & Baseball;Super Nintendo;Malibu Comics;1993-10-01 -Spriggan Powered;Super Nintendo;Micronics;1996-07-26 -Sprinter Monogatari: Mezase!! Ikkaku Senkin;Super Nintendo;VAP Inc.;1995-04-17 -St Andrews: Eikō to Rekishi no Old Course;Super Nintendo;;1995-09-15 -Star Fox;Super Nintendo;Argonaut Games / Nintendo Entertainment Analysis & Development;1993-02-21 -Star Fox 2;Super Nintendo;Nintendo;2017-09-29 -Star Fox: Super Weekend;Super Nintendo;Argonaut Games / Nintendo Entertainment Analysis & Development;1993-01-01 -Star Ocean;Super Nintendo;tri-Ace;1996-07-19 -Star Trek: Deep Space Nine – Crossroads of Time;Super Nintendo;Appaloosa Interactive;1995-01-01 -Star Trek: Starfleet Academy – Starship Bridge Simulator;Super Nintendo;High Voltage Software;1994-12-01 -Star Trek: The Next Generation: Future's Past;Super Nintendo;Spectrum HoloByte;1994-01-01 -Stardust Suplex;Super Nintendo;; -Stargate;Super Nintendo;Acclaim Studios London;1994-01-01 -Stealth;Super Nintendo;;1992-12-18 -Steel Talons;Super Nintendo;Atari Games;1991-01-01 -Sterling Sharpe: End 2 End;Super Nintendo;Tose Co.;1995-03-01 -Steven Seagal Is: The Final Option;Super Nintendo;; -Stone Protectors;Super Nintendo;Eurocom;1994-11-01 -Street Fighter Alpha 2;Super Nintendo;Capcom;1996-02-27 -Street Fighter II;Super Nintendo;Capcom;1991-02-06 -Street Fighter II Turbo;Super Nintendo;Capcom;1992-12-01 -Street Fighter II: Champion Edition;Super Nintendo;Capcom;1992-01-01 -Street Hockey '95;Super Nintendo;GTE Interactive Media;1994-11-01 -Street Racer;Super Nintendo;;1994-12-01 -Strike Gunner S.T.G;Super Nintendo;Athena;1992-03-27 -Striker;Super Nintendo;;1992-01-01 -Stunt Race FX;Super Nintendo;Nintendo Entertainment Analysis & Development;1994-06-04 -Sugoi Hebereke;Super Nintendo;OLM, Inc. / Sun Corporation;1994-03-11 -Sugoro Quest++: Dicenics;Super Nintendo;;1994-01-01 -Sugoroku Ginga Senki;Super Nintendo;Bottom Up;1996-12-19 -Sunset Riders;Super Nintendo;Konami;1991-09-04 -Supapoon;Super Nintendo;; -Super 3D Noah's Ark;Super Nintendo;Wisdom Tree;1994-01-01 -Super Adventure Island;Super Nintendo;Produce!;1992-01-11 -Super Adventure Island II;Super Nintendo;Hudson Soft;1994-10-01 -Super Air Diver;Super Nintendo;;1993-07-16 -Super Back to the Future Part II;Super Nintendo;GameFAQs;1993-07-23 -Super Baseball Simulator 1.000;Super Nintendo;Culture Brain;1991-07-12 -Super Bases Loaded;Super Nintendo;Tose Co.;1991-05-17 -Super Bases Loaded 2;Super Nintendo;Tose Co.;1993-10-01 -Super Bases Loaded 3;Super Nintendo;Tose Co.;1994-12-23 -Super Batter Up;Super Nintendo;;1992-03-27 -Super Battleship;Super Nintendo;;1993-02-18 -Super Battletank;Super Nintendo;Imagineering;1992-01-01 -Super Battletank 2;Super Nintendo;Imagineering;1994-03-27 -Super Bikkuriman;Super Nintendo;Bandai;1993-01-01 -Super Birdie Rush;Super Nintendo;;1992-03-06 -Super Bomberman;Super Nintendo;Hudson Soft;1993-04-28 -Super Bomberman 2;Super Nintendo;Hudson Soft;1994-04-28 -Super Bomberman 3;Super Nintendo;Hudson Soft;1995-01-01 -Super Bomberman 4;Super Nintendo;Produce!;1996-04-26 -Super Bomberman 5;Super Nintendo;Hudson Soft;1997-02-28 -Super Bomberman: Panic Bomber W;Super Nintendo;;1995-03-01 -Super Bombliss;Super Nintendo;;1995-03-17 -Super Bonk;Super Nintendo;Red Entertainment;1994-07-22 -Super Bowling;Super Nintendo;;1992-07-03 -Super Buster Bros.;Super Nintendo;Capcom;1990-01-01 -Super Caesars Palace;Super Nintendo;Majesco Entertainment;1993-10-21 -Super Casino 2;Super Nintendo;;1994-10-28 -Super Castles;Super Nintendo;; -Super Chase H.Q.;Super Nintendo;Taito;1992-01-01 -Super Chinese Fighter;Super Nintendo;Culture Brain;1995-01-03 -Super Chinese World 2;Super Nintendo;Culture Brain;1993-10-23 -Super Chinese World 3;Super Nintendo;Culture Brain;1995-12-22 -Super Conflict;Super Nintendo;EA Seattle;1993-03-01 -Super Dany;Super Nintendo;Cryo Interactive;1995-01-01 -Super Dimension Fortress Macross: Scrambled Valkyrie;Super Nintendo;Winkysoft;1993-01-01 -Super Double Dragon;Super Nintendo;Technōs Japan Corporation;1992-10-01 -Super Drift Out: World Rally Championships;Super Nintendo;;1995-02-24 -Super Dropzone;Super Nintendo;;1994-12-01 -Super F-1 Hero;Super Nintendo;Varie;1992-12-18 -Super F1 Circus;Super Nintendo;;1992-07-24 -Super F1 Circus 2;Super Nintendo;; -Super Famicom Wars;Super Nintendo;Intelligent Systems;1998-05-01 -Super Family Gerende;Super Nintendo;;1998-02-01 -Super Famista 2;Super Nintendo;;1993-01-01 -Super Famista 3;Super Nintendo;;1994-01-01 -Super Famista 4;Super Nintendo;;1995-03-03 -Super Famista 5;Super Nintendo;;1996-01-01 -Super Fire Pro Wrestling;Super Nintendo;Human Entertainment;1991-12-20 -Super Fire Pro Wrestling 2;Super Nintendo;Human Entertainment;1992-12-25 -Super Fire Pro Wrestling 3 Final Bout;Super Nintendo;Human Entertainment;1993-12-28 -Super Fire Pro Wrestling Special;Super Nintendo;Human Entertainment;1994-12-22 -Super Fire Pro Wrestling X Premium;Super Nintendo;Human Entertainment;1996-03-29 -Super Fire Pro Wrestling: Queen's Special;Super Nintendo;;1995-06-30 -Super Formation Soccer 94;Super Nintendo;Human Entertainment;1994-06-17 -Super Formation Soccer 95: della Serie A;Super Nintendo;Human Entertainment;1995-03-31 -Super Formation Soccer 96: World Club Edition;Super Nintendo;Human Entertainment;1996-03-29 -Super Formation Soccer II;Super Nintendo;Human Entertainment;1993-06-11 -Super Gachapon World: SD Gundam X;Super Nintendo;Bandai;1992-01-01 -Super Genjin 2;Super Nintendo;Red Entertainment;1995-07-28 -Super Ghouls 'n Ghosts;Super Nintendo;Capcom;1991-10-04 -Super Goal! 2;Super Nintendo;Tose Co.;1992-09-01 -Super Godzilla;Super Nintendo;;1993-12-22 -Super Gomoku Narabe Renju;Super Nintendo;Kaga Create;1994-03-25 -Super High Impact;Super Nintendo;;1991-01-01 -Super Ice Hockey;Super Nintendo;;1994-03-25 -Super Indy Champ;Super Nintendo;;1994-04-01 -Super International Cricket;Super Nintendo;Krome Studios Melbourne;1994-01-01 -Super Jinsei Game;Super Nintendo;;1994-03-18 -Super Keirin;Super Nintendo;;1995-07-14 -Super Kyosoba: Kaze no Sylphid;Super Nintendo;; -Super Kyotei;Super Nintendo;;1995-06-30 -Super Mad Champ;Super Nintendo;Givro;1995-03-04 -Super Mahjong Taikai;Super Nintendo;Koei; -Super Mario All-Stars;Super Nintendo;Nintendo / Nintendo Entertainment Analysis & Development;1993-07-14 -Super Mario All-Stars + Super Mario World;Super Nintendo;;1994-12-01 -Super Mario Bros. 3;Super Nintendo;Nintendo Entertainment Analysis & Development;1988-10-23 -Super Mario Kart;Super Nintendo;Nintendo Entertainment Analysis & Development;1992-08-27 -Super Mario RPG;Super Nintendo;Square;1996-03-09 -Super Mario World;Super Nintendo;Nintendo Entertainment Analysis & Development;1990-11-21 -Super Mario World 2: Yoshi's Island;Super Nintendo;Nintendo Entertainment Analysis & Development;1995-08-05 -Super Metroid;Super Nintendo;Nintendo Research & Development 1;1994-03-19 -Super Momotaro Dentetsu DX;Super Nintendo;;1995-12-08 -Super Momotaro Dentetsu Ⅱ;Super Nintendo;;1991-12-20 -Super Momotaro Dentetsu Ⅲ;Super Nintendo;;1994-01-01 -Super Morph;Super Nintendo;Alchemy;1993-01-01 -Super Ninja Boy;Super Nintendo;Culture Brain;1991-01-01 -Super Okuman Chouja Game;Super Nintendo;;1995-11-24 -Super Pinball: Behind the Mask;Super Nintendo;KAZe;1994-01-08 -Super Play Action Football;Super Nintendo;Tose Co.;1992-08-01 -Super Professional Baseball II;Super Nintendo;Tose Co.;1992-08-07 -Super Punch-Out!!;Super Nintendo;Nintendo development teams;1994-09-14 -Super R-Type;Super Nintendo;Irem;1991-07-13 -Super R.B.I. Baseball;Super Nintendo;; -Super Robot Wars EX;Super Nintendo;;1994-01-01 -Super Robot Wars Gaiden: Masō Kishin – The Lord of Elemental;Super Nintendo;Winkysoft;1996-01-01 -Super Scope 6;Super Nintendo;Nintendo Research & Development 1;1992-01-01 -Super Slam Dunk;Super Nintendo;Park Place Productions;1993-07-16 -Super Slap Shot;Super Nintendo;;1993-08-06 -Super Smash TV;Super Nintendo;;1992-01-01 -Super Soccer;Super Nintendo;Human Entertainment;1991-12-13 -Super Solitaire;Super Nintendo;Krome Studios Melbourne;1995-07-23 -Super Star Wars;Super Nintendo;Code Mystics / Lucasfilm Games / Sculptured Software;1992-11-01 -Super Star Wars: Return of the Jedi;Super Nintendo;Realtime Associates / Sculptured Software;1994-06-22 -Super Star Wars: The Empire Strikes Back;Super Nintendo;Lucasfilm Games / Sculptured Software;1993-06-01 -Super Street Fighter II: The New Challengers;Super Nintendo;Capcom;1993-09-10 -Super Street Fighter II: The Tournament Battle;Super Nintendo;;1993-09-01 -Super Strike Eagle;Super Nintendo;MicroProse;1993-11-25 -Super SWIV;Super Nintendo;Eidos Interactive;1992-01-01 -Super Tekkyu Fight!;Super Nintendo;; -Super Tennis;Super Nintendo;Tokyo Shoseki;1991-08-30 -Super Tetris 3;Super Nintendo;;1994-01-01 -Super Troll Islands;Super Nintendo;;1994-03-25 -Super Trump Collection 2;Super Nintendo;; -Super Turrican;Super Nintendo;Factor 5;1993-01-01 -Super Turrican 2;Super Nintendo;Factor 5;1995-01-01 -Super Ultra Baseball 2;Super Nintendo;Culture Brain;1994-07-28 -Super Valis IV;Super Nintendo;;1992-03-27 -Super Wagan Land;Super Nintendo;;1991-12-13 -Super Widget;Super Nintendo;;1993-01-01 -Super Wrestle Angels;Super Nintendo;;1994-12-16 -Super Ōzumō: Netsusen Daiichiban;Super Nintendo;Namco;1992-12-18 -Sutobasu Yarō Shō;Super Nintendo;;1994-02-25 -Sutte Hakkun;Super Nintendo;Nintendo Research & Development 2;1997-11-02 -Suzuka 8 Hours;Super Nintendo;Arc System Works;1992-10-10 -SWAT Kats: The Radical Squadron;Super Nintendo;Fortyfive;1995-08-01 -SWIV;Super Nintendo;;1991-01-01 -Sword World SFC;Super Nintendo;;1993-01-01 -Syndicate;Super Nintendo;Bullfrog Productions;1993-06-06 -Syvalion;Super Nintendo;Taito;1988-01-01 -Tactical Soccer;Super Nintendo;;1995-04-21 -Tactics Ogre: Let Us Cling Together;Super Nintendo;;1995-10-06 -Tadaima Yuusha Boshuuchuu Okawari;Super Nintendo;Human Entertainment;1994-11-25 -Taekwon-Do;Super Nintendo;;1994-06-28 -Taiko Risshiden;Super Nintendo;Koei;1992-01-01 -Take Yutaka G1 Memory;Super Nintendo;Gaps;1995-07-21 -Takeda Nobuhiro no Super League Soccer;Super Nintendo;Tose Co.;1994-11-25 -Tales of Phantasia;Super Nintendo;Namco Tales Studio;1995-12-15 -Tarot Mystery;Super Nintendo;Ukiyotei;1995-04-28 -Taz-Mania;Super Nintendo;NuFX;1992-12-25 -Tecmo Super Baseball;Super Nintendo;Tecmo;1994-10-28 -Tecmo Super Bowl;Super Nintendo;Tecmo;1991-12-13 -Tecmo Super Bowl II: Special Edition;Super Nintendo;Tecmo;1994-12-20 -Tecmo Super Bowl III: Final Edition;Super Nintendo;Tecmo;1995-08-04 -Tecmo Super NBA Basketball;Super Nintendo;Tecmo;1992-12-25 -Teenage Mutant Ninja Turtles IV: Turtles in Time;Super Nintendo;;1992-07-24 -Teenage Mutant Ninja Turtles: Tournament Fighters;Super Nintendo;Konami;1993-09-01 -Teenage Mutant Ninja Turtles: Turtles in Time;Super Nintendo;Konami;1991-03-01 -Tenbu;Super Nintendo;; -Tenchi Muyo! Game Hen;Super Nintendo;Banpresto;1995-10-27 -Tenchi wo Kurau: Sangokushi Gunyuuden;Super Nintendo;; -Tengai Makyō Zero;Super Nintendo;Red Entertainment;1995-12-22 -Terminator 2;Super Nintendo;;1993-01-01 -Terranigma;Super Nintendo;;1995-10-20 -Tetris & Dr. Mario;Super Nintendo;Intelligent Systems;1994-01-01 -Tetris 2;Super Nintendo;Nintendo / Nintendo Research & Development 1 / Tose Co.;1993-01-01 -Tetris Attack;Super Nintendo;Intelligent Systems;1995-10-27 -Tetris Battle Gaiden;Super Nintendo;Bullet-Proof Software;1993-12-24 -Tetsuwan Atom;Super Nintendo;;1994-02-18 -The 7th Saga;Super Nintendo;Produce!;1993-04-23 -The Addams Family;Super Nintendo;Ocean Software;1992-01-01 -The Adventure of Hourai High School;Super Nintendo;; -The Adventures of Batman & Robin;Super Nintendo;Konami;1994-01-01 -The Adventures of Dr. Franken;Super Nintendo;; -The Adventures of Mighty Max;Super Nintendo;;1994-01-01 -The Adventures of Rocky and Bullwinkle and Friends;Super Nintendo;Imagineering;1992-12-01 -The Adventures of Tintin: Prisoners of the Sun;Super Nintendo;; -The Amazing Spider-Man: Lethal Foes;Super Nintendo;;1995-03-17 -The Aquatic Games Starring James Pond and the Aquabats;Super Nintendo;;1992-01-01 -The Atlas;Super Nintendo;Artdink;1991-08-02 -The Blue Crystal Rod;Super Nintendo;GAME STUDIO Inc.;1994-03-04 -The Blues Brothers: Jukebox Adventure;Super Nintendo;;1993-01-01 -The Brainies;Super Nintendo;;1991-01-01 -The Chaos Engine;Super Nintendo;The Bitmap Brothers;1993-01-01 -The Combatribes;Super Nintendo;Technōs Japan Corporation;1990-01-01 -The Death and Return of Superman;Super Nintendo;Blizzard Entertainment;1994-01-01 -The Duel: Test Drive II;Super Nintendo;Distinctive Software;1989-01-01 -The Firemen;Super Nintendo;Human Entertainment;1994-09-09 -The Flintstones;Super Nintendo;Ocean Software;1995-01-01 -The Flintstones: The Treasure of Sierra Madrock;Super Nintendo;Taito;1994-08-12 -The Great Battle Gaiden 2: Matsuri da Wasshoi;Super Nintendo;;1994-01-01 -The Great Battle II: Last Fighter Twin;Super Nintendo;;1992-01-01 -The Great Battle III;Super Nintendo;Sun-L;1993-01-01 -The Great Battle IV;Super Nintendo;;1994-01-01 -The Great Battle V;Super Nintendo;;1995-12-22 -The Great Circus Mystery Starring Mickey & Minnie;Super Nintendo;Capcom;1994-10-01 -The Great Waldo Search;Super Nintendo;Radiance Software;1992-01-01 -The Heian Fuuunden;Super Nintendo;; -The Humans;Super Nintendo;Imagitec Design;1992-01-01 -The Hunt for Red October;Super Nintendo;Krome Studios Melbourne;1990-01-01 -The Ignition Factor;Super Nintendo;Jaleco;1994-11-11 -The Incredible Crash Dummies;Super Nintendo;Software Creations;1993-10-21 -The Incredible Hulk;Super Nintendo;Acclaim Studios London;1994-08-01 -The Itchy & Scratchy Game;Super Nintendo;Bits Studios;1993-01-01 -The Jetsons: Invasion of the Planet Pirates;Super Nintendo;Sting;1995-06-09 -The Journey Home: Quest for the Throne;Super Nintendo;Namco Tales Studio;1993-03-26 -The Jungle Book;Super Nintendo;Virgin Interactive;1993-01-01 -The King of Dragons;Super Nintendo;Capcom;1994-03-04 -The King of Rally;Super Nintendo;KAZe;1992-12-28 -The Last Battle;Super Nintendo;;1994-12-02 -The Lawnmower Man;Super Nintendo;Eidos Interactive;1994-02-11 -The Legend of Bishin;Super Nintendo;Toho;1993-12-25 -The Legend of the Mystical Ninja;Super Nintendo;Konami;1991-07-17 -The Legend of Zelda: A Link to the Past;Super Nintendo;Nintendo Entertainment Analysis & Development;1991-11-21 -The Lost Vikings;Super Nintendo;Blizzard Entertainment;1993-01-01 -The Lost Vikings 2;Super Nintendo;Blizzard Entertainment;1997-01-01 -The Magical Quest starring Mickey Mouse;Super Nintendo;Capcom;1992-11-20 -The Mask;Super Nintendo;;1995-10-01 -The Monopoly Game 2;Super Nintendo;;1995-03-31 -The Ninja Warriors;Super Nintendo;Winning Entertainment Group;1994-01-01 -The Pagemaster;Super Nintendo;Acclaim Studios London;1994-01-01 -The Peace Keepers;Super Nintendo;Jaleco;1993-12-17 -The Pirates of Dark Water;Super Nintendo;Acclaim Studios Austin;1994-01-01 -The Ren & Stimpy Show: Buckaroo$!;Super Nintendo;Imagineering;1993-11-01 -The Ren & Stimpy Show: Fire Dogs;Super Nintendo;Argonaut Games; -The Ren & Stimpy Show: Time Warp;Super Nintendo;;1994-11-01 -The Ren & Stimpy Show: Veediots!;Super Nintendo;;1993-01-01 -The Shadow;Super Nintendo;Ocean Software;1994-01-01 -The Shinri Game 2;Super Nintendo;;1995-02-10 -The Simpsons: Bart's Nightmare;Super Nintendo;Sculptured Software;1992-09-01 -The Smurfs Travel the World;Super Nintendo;;1994-01-01 -The Terminator;Super Nintendo;; -The Tick;Super Nintendo;Software Creations;1994-11-01 -The Twisted Tales of Spike McFang;Super Nintendo;Blue Planet Software;1993-03-19 -The Untouchables;Super Nintendo;;1994-01-01 -The Wizard of Oz;Super Nintendo;Electronic Arts;1993-10-01 -Theme Park;Super Nintendo;Bullfrog Productions;1995-01-01 -Thomas the Tank Engine & Friends;Super Nintendo;Software Creations;1993-08-02 -Thoroughbred Breeder;Super Nintendo;; -Thoroughbred Breeder II;Super Nintendo;;1994-06-08 -Thoroughbred Breeder III;Super Nintendo;;1996-10-18 -Time Slip;Super Nintendo;Eidos Interactive;1993-01-01 -Time Trax;Super Nintendo;;1994-01-01 -Timecop;Super Nintendo;Cryo Interactive;1995-02-17 -Timon & Pumbaa's Jungle Games;Super Nintendo;7th Level / Tiertex Design Studios;1995-09-15 -Tin Star;Super Nintendo;Software Creations;1994-11-01 -Tintin in Tibet;Super Nintendo;;1995-01-01 -Tiny Toon Adventures: Buster Busts Loose!;Super Nintendo;Konami;1992-12-18 -Tiny Toon Adventures: Wacky Sports Challenge;Super Nintendo;Konami;1994-09-30 -TKO Super Championship Boxing;Super Nintendo;Sting;1992-04-28 -TNN Bass Tournament of Champions;Super Nintendo;;1994-09-22 -Todd McFarlane's Spawn: The Video Game;Super Nintendo;Ukiyotei; -Tokimeki Memorial;Super Nintendo;Konami;1994-05-27 -Tom & Jerry;Super Nintendo;;1993-01-01 -Tommy Moe's Winter Extreme: Skiing & Snowboarding;Super Nintendo;Loriciels;1994-01-01 -Tony Meola's Sidekicks Soccer;Super Nintendo;Sculptured Software;1993-02-25 -Top Gear;Super Nintendo;Gremlin Interactive;1992-01-01 -Top Gear 2;Super Nintendo;Gremlin Interactive;1993-01-01 -Top Gear 3000;Super Nintendo;Gremlin Interactive;1995-01-01 -Top Management II;Super Nintendo;;1994-02-11 -Torneko no Daibōken: Fushigi no Dungeon;Super Nintendo;Chunsoft;1993-09-19 -Total Carnage;Super Nintendo;Midway Games;1992-01-01 -Tower Dream;Super Nintendo;;1996-10-25 -Toy Story;Super Nintendo;Traveller's Tales;1995-12-01 -Toys;Super Nintendo;Imagineering;1993-01-01 -Traverse: Starlight & Prairie;Super Nintendo;;1996-06-28 -Treasure Hunter G;Super Nintendo;Sting;1996-05-24 -Treasure of the Rudras;Super Nintendo;Square;1996-04-05 -Trials of Mana;Super Nintendo;Square;1995-09-30 -Troddlers;Super Nintendo;;1992-01-01 -Troy Aikman NFL Football;Super Nintendo;Leland Interactive Media;1995-02-01 -True Golf Classics: Pebble Beach Golf Links;Super Nintendo;;1992-04-10 -True Golf Classics: Waialae Country Club;Super Nintendo;;1992-09-18 -True Golf Classics: Wicked 18;Super Nintendo;;1993-03-05 -True Lies;Super Nintendo;Krome Studios Melbourne;1994-01-01 -Tsukikomori;Super Nintendo;;1996-03-01 -Tsuppari Ōzumō: Risshin Shusse Hen;Super Nintendo;;1993-03-26 -Tsuyoshi Shikkari Shinasai: Taisen Puzzle-dama;Super Nintendo;;1994-11-18 -Tuff E Nuff;Super Nintendo;Jaleco;1993-03-26 -Turn and Burn: No-Fly Zone;Super Nintendo;Imagineering;1994-06-24 -Tōge Densetsu: Saisoku Battle;Super Nintendo;Lenar;1996-03-15 -U.N. Squadron;Super Nintendo;Capcom;1991-07-26 -Uchuu Race: Astro Go! Go!;Super Nintendo;KAZe;1994-02-25 -Uchū no Kishi: Tekkaman Blade;Super Nintendo;;1993-07-30 -UFO Kamen Yakisoban;Super Nintendo;;1994-10-14 -Ultima VI: The False Prophet;Super Nintendo;Origin Systems;1990-01-01 -Ultima VII: The Black Gate;Super Nintendo;Origin Systems;1992-04-16 -Ultima: Runes of Virtue II;Super Nintendo;Origin Systems;1994-01-01 -Ultimate Fighter;Super Nintendo;Culture Brain;1992-07-31 -Ultimate Mortal Kombat 3;Super Nintendo;Midway Games;1996-11-01 -Ultra Baseball Jitsumeiban;Super Nintendo;;1992-08-28 -Ultra League;Super Nintendo;;1995-07-28 -Ultra Seven;Super Nintendo;Bandai;1993-03-26 -Ultraman: Towards the Future;Super Nintendo;;1991-04-06 -Umi no Nushi Tsuri;Super Nintendo;;1996-01-01 -Uncharted Waters;Super Nintendo;Koei;1990-01-01 -Uncharted Waters II: New Horizons;Super Nintendo;Koei;1994-01-01 -Undercover Cops;Super Nintendo;Irem;1995-03-03 -Unholy Night: The Darkness Hunter;Super Nintendo;;2017-04-08 -Uniracers;Super Nintendo;;1994-12-01 -Urban Strike;Super Nintendo;;1994-01-01 -Utopia: The Creation of a Nation;Super Nintendo;;1991-01-01 -Vegas Stakes;Super Nintendo;HAL Laboratory;1993-09-10 -Venom/Spider-Man: Separation Anxiety;Super Nintendo;Software Creations;1995-11-01 -Verne World;Super Nintendo;;1995-09-29 -Virtual Bart;Super Nintendo;Sculptured Software;1994-09-01 -Virtual Soccer;Super Nintendo;Acclaim Studios London;1994-03-18 -Vortex;Super Nintendo;Argonaut Games;1994-09-01 -Wagan Paradise;Super Nintendo;;1994-12-16 -Waka Taka Ōzumō: Brothers Dream Match;Super Nintendo;;1993-11-12 -Waku Waku 7;Super Nintendo;Sun Corporation;1996-11-21 -Waku Waku Ski Wonder Spur;Super Nintendo;;1995-01-13 -War 2410;Super Nintendo;;1995-12-01 -War 3010: The Revolution;Super Nintendo;;1996-10-01 -Wario's Woods;Super Nintendo;Nintendo Research & Development 1;1994-02-19 -Warlock;Super Nintendo;Realtime Associates;1995-01-01 -WarpSpeed;Super Nintendo;Accolade;1992-12-01 -Waterworld;Super Nintendo;Ocean Software;1995-11-01 -Wayne Gretzky and the NHLPA All-Stars;Super Nintendo;Atari Games;1995-12-01 -Wayne's World;Super Nintendo;Radical Entertainment;1993-02-18 -WCW SuperBrawl Wrestling;Super Nintendo;Krome Studios Melbourne;1994-11-01 -Weaponlord;Super Nintendo;Visual Concepts;1995-01-01 -Where in the World Is Carmen Sandiego?;Super Nintendo;Broderbund;1985-01-01 -Where in Time Is Carmen Sandiego?;Super Nintendo;Broderbund;1989-08-01 -Widget;Super Nintendo;;1992-11-01 -Wild Guns;Super Nintendo;Winning Entertainment Group;1994-08-12 -WildSnake;Super Nintendo;Bullet-Proof Software;1994-09-30 -Williams Arcade's Greatest Hits;Super Nintendo;;1996-01-01 -Wing Commander;Super Nintendo;Origin Systems;1990-01-01 -Wing Commander: The Secret Missions;Super Nintendo;; -Winning Post;Super Nintendo;Koei;1993-01-01 -Winter Gold;Super Nintendo;Funcom;1996-11-28 -Winter Olympics;Super Nintendo;Tiertex Design Studios;1993-01-01 -Wizap!: King of Darkness;Super Nintendo;;1994-01-01 -Wizardry V: Heart of the Maelstrom;Super Nintendo;Sir-Tech;1988-01-01 -Wizardry VI: Bane of the Cosmic Forge;Super Nintendo;Sir-Tech;1990-01-01 -Wolfchild;Super Nintendo;Core Design;1992-01-01 -Wolfenstein 3D;Super Nintendo;id Software / Interplay Entertainment / Nerve Software / Raven Software;1992-05-05 -Wolverine: Adamantium Rage;Super Nintendo;Perfect Entertainment;1994-01-01 -Wonder Project J;Super Nintendo;Givro;1994-12-09 -Wordtris;Super Nintendo;Realtime Associates;1991-01-01 -World Cup USA '94;Super Nintendo;U.S. Gold;1994-01-01 -World Heroes;Super Nintendo;ADK;1992-07-28 -World Heroes 2;Super Nintendo;ADK;1993-04-28 -World League Soccer;Super Nintendo;;1991-09-20 -World Masters Golf;Super Nintendo;Arc Developments;1995-11-23 -World Soccer '94: Road to Glory;Super Nintendo;;1993-12-01 -Worlds of Ultima: The Savage Empire;Super Nintendo;Origin Systems;1990-12-30 -Worms;Super Nintendo;Team17;1995-06-01 -Wrecking Crew '98;Super Nintendo;;1998-01-01 -WWF Raw;Super Nintendo;Sculptured Software;1994-12-22 -WWF Royal Rumble;Super Nintendo;Sculptured Software;1993-09-15 -WWF Super WrestleMania;Super Nintendo;Sculptured Software;1992-02-12 -WWF WrestleMania: The Arcade Game;Super Nintendo;Midway Games;1995-10-18 -X-Kaliber 2097;Super Nintendo;;1994-02-01 -X-Men: Mutant Apocalypse;Super Nintendo;Capcom;1994-11-01 -X-Zone;Super Nintendo;Kemco;1992-01-01 -Xak: The Art of Visual Stage;Super Nintendo;Microcabin;1992-12-25 -Xandra no Daibōken: Valkyrie to no Deai;Super Nintendo;;1992-07-23 -Xardion;Super Nintendo;Jorudan;1992-03-20 -Yadamon - Wonderland Dreams;Super Nintendo;;1993-01-01 -Yae;Super Nintendo;Konami;1996-03-29 -Yakōchū;Super Nintendo;Athena;1995-06-16 -Yokoyama Mitsuteru Sangokushi;Super Nintendo;;1992-01-01 -Yokozuna Monogatari;Super Nintendo;;1994-01-01 -Yoshi no Cookie: Kuruppon Oven de Cookie;Super Nintendo;;1994-01-01 -Yoshi Racing;Super Nintendo;Argonaut Games; -Yoshi's Cookie;Super Nintendo;Bullet-Proof Software / Tose Co.;1992-01-01 -Yoshi's Safari;Super Nintendo;Nintendo Research & Development 1;1993-01-01 -Young Merlin;Super Nintendo;Westwood Studios;1994-01-01 -Ys IV: Mask of the Sun;Super Nintendo;Tonkin House;1993-11-19 -Ys V: Lost Kefin, Kingdom of Sand;Super Nintendo;;1995-12-29 -Yu Yu Hakusho;Super Nintendo;;1993-01-01 -Yuujin no Furi Furi Girls;Super Nintendo;;1994-07-01 -Yū Yū Hakusho Final;Super Nintendo;Tose Co.;1995-03-24 -Yūyu no Kuizu de Go! Go!;Super Nintendo;;1991-03-01 -Zakuro no Aji;Super Nintendo;;1995-12-22 -Zan II: Spirits;Super Nintendo;Namco Tales Studio;1992-03-25 -Zen-Nippon GT Senshuken;Super Nintendo;;1995-09-29 -Zen-Nippon Pro Wrestling;Super Nintendo;;1993-07-16 -Zen-Nippon Pro Wrestling 2: 3-4 Budokan;Super Nintendo;; -Zenkoku Kōkō Soccer;Super Nintendo;;1994-11-25 -Zenkoku Kōkō Soccer 2;Super Nintendo;;1995-11-17 -Zenkoku Kōkō Soccer Senshuken '96;Super Nintendo;;1996-03-22 -Zero the Kamikaze Squirrel;Super Nintendo;Acclaim Studios Austin;1994-11-01 -Zero4 Champ: RR;Super Nintendo;Media Rings;1994-07-22 -Zero4 Champ: RR-Z;Super Nintendo;Media Rings;1995-11-25 -Zico Soccer;Super Nintendo;;1994-03-04 -Zig Zag Cat: Dachō Club mo Oosawagi da;Super Nintendo;;1994-06-24 -Zombies Ate My Neighbors;Super Nintendo;Lucasfilm Games;1993-09-01 -Zoop;Super Nintendo;;1995-10-31 -Ōzumō Spirit;Super Nintendo;;1992-12-11 -Sonic the Hedgehog;Mega Drive;Sega;1991-06-23 -Sonic the Hedgehog 2;Mega Drive;Sega Technical Institute;1992-11-21 -Streets of Rage;Mega Drive;Sega;1991-08-02 -Streets of Rage 2;Mega Drive;Sega;1992-12-20 -Golden Axe;Mega Drive;Sega;1989-12-23 -Phantasy Star IV: The End of the Millennium;Mega Drive;Sega;1993-12-17 -Shining Force;Mega Drive;Climax Entertainment / Sonic! Software Planning;1992-03-20 -Gunstar Heroes;Mega Drive;Treasure;1993-09-10 -Ecco the Dolphin;Mega Drive;Novotrade International;1992-12-29 -The Revenge of Shinobi;Mega Drive;Sega;1989-12-02 diff --git a/backend/resources/collection_import_refusal_email_template.txt b/backend/resources/collection_import_refusal_email_template.txt new file mode 100644 index 0000000..0b9d82b --- /dev/null +++ b/backend/resources/collection_import_refusal_email_template.txt @@ -0,0 +1,39 @@ + + + +

Import refuse

+ +

Contexte

+ + + + + + + + +
Type d'import${import_kind}
Utilisateur demandeur${requester_user_id}
Email demandeur${requester_email}
Type de fichier${file_type}
Nom du fichier${original_filename}
+ +

Raison du rejet

+

${message}

+

Code raison: ${reason}

+

Jeux en erreur: ${invalid_games_count}/${total_games_count}

+ +

Resultat de l'import

+ + +

Erreurs des jeux

+${invalid_games} + +

Warnings

+
+${warnings}
+
+ + diff --git a/backend/resources/super-nintendo-europe.csv b/backend/resources/super-nintendo-europe.csv new file mode 100644 index 0000000..77e65f1 --- /dev/null +++ b/backend/resources/super-nintendo-europe.csv @@ -0,0 +1,538 @@ +Nom du jeu;Plateforme;Studio de développement;Date de sortie +90 Minutes European Prime Goal;Super Nintendo;Namco;20/12/1995 +Aaahh!!! Real Monsters;Super Nintendo;Realtime Associates;1995 +Acme Animation Factory;Super Nintendo;Probe Entertainment;03/1995 +ActRaiser;Super Nintendo;Quintet;18/03/1993 +ActRaiser 2;Super Nintendo;Quintet;11/1994 +Addams Family Values;Super Nintendo;Ocean Software;28/03/1996 +Aero the Acro-Bat;Super Nintendo;Iguana Entertainment;11/1993 +Aero the Acro-Bat 2;Super Nintendo;Iguana Entertainment;08/1994 +Aguri Suzuki F-1 Super Driving;Super Nintendo;Genki;1993 +Air Cavalry;Super Nintendo;Synergistic Software;1995 +Al Unser Jr.'s Road to the Top;Super Nintendo;Radical Entertainment;1994 +Aladdin;Super Nintendo;Capcom;27/01/1994 +Alfred Chicken;Super Nintendo;Twilight Games;1994 +Alien 3;Super Nintendo;Probe Entertainment;28/06/1993 +Alien vs Predator;Super Nintendo;Jorudan;1993 +All-American Championship Football;Super Nintendo;Malibu Games;1994 +An American Tail: Fievel Goes West;Super Nintendo;Shimada Kikaku;11/1994 +Animaniacs;Super Nintendo;Konami;12/1994 +Another World;Super Nintendo;Delphine Software International;1992 +Archer Maclean's Super Dropzone;Super Nintendo;Eurocom Entertainment Software;12/1995 +Arcus OdysseyNA;Super Nintendo;Wolf Team;Cancelled +Ardy Lightfoot;Super Nintendo;ASCII Entertainment;31/10/1994 +Arkanoid: Doh It Again;Super Nintendo;Taito;18/12/1997 +Art of Fighting;Super Nintendo;Monolith Corporation;1993 +Asterix;Super Nintendo;Infogrames;30/05/1993 +Asterix & Obelix;Super Nintendo;Infogrames;28/09/1995 +Axelay;Super Nintendo;Konami;30/09/1992 +B.O.B.;Super Nintendo;Gray Matter;22/07/1993 +Barkley Shut Up and Jam!;Super Nintendo;Accolade;12/1994 +Bass Masters Classic: Pro Edition;Super Nintendo;Black Pearl Software;11/1996 +Batman Forever;Super Nintendo;Probe Entertainment;07/09/1995 +Batman Returns;Super Nintendo;Konami;07/05/1993 +Battle Clash;Super Nintendo;Intelligent Systems;18/03/1993 +Battletoads & Double Dragon: The Ultimate Team;Super Nintendo;Rare;10/07/1994 +Battletoads in Battlemaniacs;Super Nintendo;Rare;10/1993 +Beauty and the Beast;Super Nintendo;Probe Entertainment;23/02/1995 +Beavis and Butt-head;Super Nintendo;Realtime Associates;05/1995 +Beethoven's 2nd;Super Nintendo;Riedel Software Productions;1993 +Best of the Best: Championship Karate;Super Nintendo;Loriciel;1993 +Big Sky Trooper;Super Nintendo;LucasArts;1995 +Biker Mice from Mars;Super Nintendo;Konami;01/1995 +BioMetal;Super Nintendo;Athena;1993 +Blackhawk;Super Nintendo;Blizzard Entertainment;23/02/1995 +Blazing Skies;Super Nintendo;Malibu Interactive;21/01/1993 +Boogerman: A Pick and Flick Adventure;Super Nintendo;Interplay Entertainment;25/01/1996 +Boxing Legends of the Ring;Super Nintendo;Sculptured Software;1993 +Bram Stoker's Dracula;Super Nintendo;Psygnosis / Traveller's Tales;1993 +Brawl Brothers: Rival Turf! 2;Super Nintendo;Jaleco;1993 +Breath of Fire II;Super Nintendo;Capcom;25/04/1996 +Brett Hull Hockey;Super Nintendo;Radical Entertainment;1994 +Brutal: Paws of Fury;Super Nintendo;Eurocom Entertainment Software;1994 +Bubsy II;Super Nintendo;Accolade;04/06/1994 +Bubsy in Claws Encounters of the Furred Kind;Super Nintendo;Accolade / Solid Software;28/10/1993 +Bugs Bunny Rabbit Rampage;Super Nintendo;Viacom New Media;29/09/1994 +Bulls vs. Blazers and the NBA Playoffs;Super Nintendo;Electronic Arts;1992 +Cal Ripken Jr. Baseball;Super Nintendo;Acme Interactive;1993 +California Games II;Super Nintendo;Silicon Sorcery;1993 +Cannon Fodder;Super Nintendo;Sensible Software;01/1994 +Captain America and The Avengers;Super Nintendo;Realtime Associates;1993 +Captain Commando;Super Nintendo;Capcom;1995 +Carrier Aces;Super Nintendo;Synergistic Software;1995 +Casper;Super Nintendo;Imagineering;1997 +Castlevania: Vampire's Kiss;Super Nintendo;Konami;22/02/1996 +Champions World Class Soccer;Super Nintendo;Park Place Productions;19/05/1994 +Championship Pool;Super Nintendo;Bitmasters;1993 +Choplifter III;Super Nintendo;Beam Software;1994 +Chuck Rock;Super Nintendo;Core Design;1992 +ClayFighter;Super Nintendo;Visual Concepts;26/05/1994 +ClayFighter 2: Judgment Clay;Super Nintendo;Interplay Entertainment;23/05/1995 +Claymates;Super Nintendo;Visual Concepts;20/11/1993 +Cliffhanger;Super Nintendo;Malibu Interactive;1993 +Congo's Caper;Super Nintendo;Data East;1993 +Cool Spot;Super Nintendo;Virgin Interactive Entertainment;24/02/1994 +Cool World;Super Nintendo;Painting by Numbers;1992 +Cutthroat Island;Super Nintendo;Software Creations (UK);1996 +Cybernator;Super Nintendo;NCS Corp;1993 +Daffy Duck: The Marvin Missions;Super Nintendo;ICOM Simulations;28/04/1994 +Darius Twin;Super Nintendo;Taito;22/04/1993 +David Crane's Amazing Tennis;Super Nintendo;Imagineering;1992 +Daze Before Christmas;Super Nintendo;Funcom;01/11/1994 +Demolition Man;Super Nintendo;Alexandria;28/09/1995 +Demon's Crest;Super Nintendo;Capcom;01/03/1995 +Dennis;Super Nintendo;Ocean Software;1993 +Desert Fighter;Super Nintendo;Opus;09/1994 +Desert Strike: Return to the Gulf;Super Nintendo;Visual Concepts;27/05/1993 +Dino Dini's Soccer;Super Nintendo;Eurocom Entertainment Software;10/11/1994 +DinoCity;Super Nintendo;Irem;1992 +Dirt Racer;Super Nintendo;MotiveTime;31/05/1995 +Dirt Trax FX;Super Nintendo;Sculptured Software;1995 +Donkey Kong Country;Super Nintendo;Rare;24/11/1994 +Donkey Kong Country 2: Diddy's Kong Quest;Super Nintendo;Rare;14/12/1995 +Donkey Kong Country 3: Dixie Kong's Double Trouble!;Super Nintendo;Rare;13/12/1996 +Doom;Super Nintendo;Sculptured Software;26/10/1995 +Double Dragon V: The Shadow Falls;Super Nintendo;Leland Interactive Media;10/07/1994 +Dragon Ball Z: Hyper Dimension;Super Nintendo;Tose;02/1997 +Dragon Ball Z: Super Butōden;Super Nintendo;Tose;30/11/1993 +Dragon Ball Z: Super Butōden 2;Super Nintendo;Tose;06/1994 +Dragon Ball Z: Super Butōden 3;Super Nintendo;Tose;03/1995 +Dragon's Lair;Super Nintendo;MotiveTime;1993 +Dragon: The Bruce Lee Story;Super Nintendo;;23/02/1995 +Drakkhen;Super Nintendo;Kemco;1992 +Dungeon Master;Super Nintendo;Software Heaven / FTL Games;1993 +Earth Defense Force;Super Nintendo;Jaleco;1992 +Earthworm Jim;Super Nintendo;Shiny Entertainment;16/12/1994 +Earthworm Jim 2;Super Nintendo;Shiny Entertainment;25/01/1996 +Eek! The Cat;Super Nintendo;CTA Developments;1994 +Equinox;Super Nintendo;Software Creations;25/03/1994 +ESPN Baseball Tonight;Super Nintendo;Park Place Productions;11/1994 +Euro Football Champ;Super Nintendo;Taito;1992 +F-Zero;Super Nintendo;Nintendo EAD;11/04/1992 +F1 Pole Position;Super Nintendo;Human Entertainment;12/1993 +F1 Pole Position 2;Super Nintendo;Human Entertainment;29/12/1993 +F1 ROC: Race of Champions;Super Nintendo;SETA;1992 +F1 World Championship Edition;Super Nintendo;Domark;01/01/1995 +Family Dog;Super Nintendo;Imagineering;1993 +Fatal Fury;Super Nintendo;Takara;1993 +Fatal Fury 2;Super Nintendo;Takara;1994 +Fatal Fury Special;Super Nintendo;Monolith;1995 +Fever Pitch Soccer;Super Nintendo;U.S. Gold;1995 +FIFA 97: Gold Edition;Super Nintendo;Electronic Arts;22/11/1996 +FIFA International Soccer;Super Nintendo;Extended Play Productions;23/06/1994 +FIFA Soccer 96;Super Nintendo;Extended Play Productions / Probe Entertainment;23/11/1995 +FIFA: Road to World Cup 98;Super Nintendo;Electronic Arts;03/09/1997 +Final Fight;Super Nintendo;Capcom;10/12/1992 +Final Fight 2;Super Nintendo;Capcom;12/1993 +Final Fight 3;Super Nintendo;Capcom;13/03/1996 +First Samurai;Super Nintendo;Vivid Image;1993 +Flashback;Super Nintendo;Delphine Software International / Tiertex Design Studios;1994 +Foreman For Real;Super Nintendo;Software Creations;28/09/1995 +Frank Thomas' Big Hurt Baseball;Super Nintendo;Iguana Entertainment;1995 +Frantic Flea;Super Nintendo;Haus Teknikka;1996 +Full Throttle: All-American Racing;Super Nintendo;Gremlin Interactive;1994 +Fun 'n Games;Super Nintendo;Leland Interactive Media;25/05/1994 +Ghoul Patrol;Super Nintendo;LucasArts;1994 +Gods;Super Nintendo;Bitmap Brothers;1992 +Goof Troop;Super Nintendo;Capcom;25/11/1993 +GP-1;Super Nintendo;Atlus;1993 +Hagane: The Final Conflict;Super Nintendo;CAProduction / Red Company;04/1995 +Hal's Hole in One Golf;Super Nintendo;HAL Laboratory;22/10/1992 +Hanna Barbera's Turbo Toons;Super Nintendo;Empire Interactive;11/1994 +Harley's Humongous Adventure;Super Nintendo;Visual Concepts;1993 +Harvest Moon;Super Nintendo;Pack-In-Video;29/01/1998 +Hebereke's Popoitto;Super Nintendo;Sunsoft;30/09/1995 +Hebereke's Popoon;Super Nintendo;Sunsoft;22/02/1994 +Home Alone;Super Nintendo;Imagineering;1992 +Home Alone 2: Lost in New York;Super Nintendo;Imagineering;1993 +Hook;Super Nintendo;Ukiyotei;23/11/1993 +Hungry Dinosaurs;Super Nintendo;Magical Company;03/01/1995 +Hurricanes;Super Nintendo;Probe Entertainment;1995 +Hyper V-Ball;Super Nintendo;Video System;1994 +HyperZone;Super Nintendo;HAL Laboratory;1992 +Illusion of Time;Super Nintendo;Quintet;21/06/1995 +Incantation;Super Nintendo;Titus Software;1996 +Indiana Jones' Greatest Adventures;Super Nintendo;Factor 5;30/03/1995 +International Sensible Soccer: World Champions;Super Nintendo;Sensible Software;1994 +International Superstar Soccer;Super Nintendo;Konami;23/05/1995 +International Superstar Soccer Deluxe;Super Nintendo;Konami;25/01/1996 +International Tennis Tour;Super Nintendo;Loriciel;1993 +Iron Commando;Super Nintendo;Arcade Zone;Cancelled +Izzy's Quest for the Olympic Rings;Super Nintendo;Alexandria;1995 +J.R.R. Tolkien's The Lord of the Rings, Vol. I;Super Nintendo;Interplay Entertainment;23/05/1995 +Jack Nicklaus Golf;Super Nintendo;Leland Interactive Media;1992 +James Bond Jr.;Super Nintendo;Gray Matter;1992 +James Pond 3: Operation Starfish;Super Nintendo;Vectordean;1993 +James Pond's Crazy Sports;Super Nintendo;Vectordean;1994 +Jelly Boy;Super Nintendo;Probe Entertainment;03/1995 +Jimmy Connors Pro Tennis Tour;Super Nintendo;Blue Byte;27/10/1994 +Joe & Mac 3: Lost in the Tropics;Super Nintendo;Data East;11/1995 +Joe & Mac: Caveman Ninja;Super Nintendo;Data East;1992 +John Madden Football '93;Super Nintendo;EA Canada;1992 +Judge Dredd;Super Nintendo;Probe Entertainment;24/08/1995 +Jungle Strike;Super Nintendo;Gremlin Interactive;1995 +Jurassic Park;Super Nintendo;Ocean Software;29/12/1993 +Jurassic Park 2: The Chaos Continues;Super Nintendo;Ocean Software;1994 +Justice League Task Force;Super Nintendo;Blizzard Entertainment;07/1995 +Kawasaki Superbike Challenge;Super Nintendo;Domark;1995 +Kevin Keegan's Player Manager;Super Nintendo;Anco;1993 +Kick Off;Super Nintendo;Anco;1993 +Kick Off 3: European Challenge;Super Nintendo;Anco;1994 +Kid Klown in Crazy Chase;Super Nintendo;Kemco;1995 +Killer Instinct;Super Nintendo;Rare;21/09/1995 +King Arthur's World;Super Nintendo;Argonaut Software;1993 +King of the Monsters;Super Nintendo;Genki;1992 +Kirby's Dream Course;Super Nintendo;HAL Laboratory / Nintendo EAD;24/08/1995 +Kirby's Fun Pak;Super Nintendo;HAL Laboratory;23/01/1997 +Kirby's Ghost Trap;Super Nintendo;HAL Laboratory (Kirby's Avalanche / Kirby's Ghost Trap only) / Compile;01/02/1995 +Krusty's Super Fun House;Super Nintendo;Audiogenic;1992 +Lagoon;Super Nintendo;Kemco;27/05/1993 +Lamborghini American Challenge;Super Nintendo;Titus Software;1993 +Last Action Hero;Super Nintendo;Bits Studios;10/12/1993 +Legend;Super Nintendo;Arcade Zone;21/12/1994 +Lemmings;Super Nintendo;Sunsoft / Chat Noir;08/1992 +Lemmings 2: The Tribes;Super Nintendo;DMA Design;1994 +Lethal Enforcers;Super Nintendo;Konami;1994 +Lethal Weapon;Super Nintendo;Ocean Software;1992 +Little Magic;Super Nintendo;;Cancelled +Lock On;Super Nintendo;Copya Systems;1993 +Looney Tunes Basketball;Super Nintendo;Sculptured Software;05/1995 +Looney Tunes: Road Runner;Super Nintendo;ICOM Simulations;30/09/1993 +Lucky Luke;Super Nintendo;Infogrames;27/10/1997 +Lufia;Super Nintendo;Neverland;1997 +Madden NFL '94;Super Nintendo;Visual Concepts;1994 +Madden NFL '95;Super Nintendo;Visual Concepts;1994 +Magic Boy;Super Nintendo;Blue Turtle;1996 +Magic Sword;Super Nintendo;Minakuchi Engineering;18/03/1993 +Major Title;Super Nintendo;Irem;1993 +Manchester United Championship Soccer;Super Nintendo;Krisalis Software;1995 +Mario is Missing!;Super Nintendo;The Software Toolworks;09/1993 +Mario Paint;Super Nintendo;Nintendo R&D1 / Intelligent Systems;10/12/1992 +Mario's Time Machine;Super Nintendo;The Software Toolworks;1993 +Marko's Magic Football;Super Nintendo;Domark;1995 +Maru's Quest;Super Nintendo;;Cancelled +Marvel Super Heroes: War of the Gems;Super Nintendo;Capcom;1996 +Maui Mallard in Cold Shadow;Super Nintendo;Eurocom Entertainment Software;28/11/1996 +MechWarrior;Super Nintendo;Beam Software;1993 +MechWarrior 3050;Super Nintendo;Tiburon Entertainment;1995 +Mega Man 7;Super Nintendo;Capcom;20/11/1995 +Mega Man X;Super Nintendo;Capcom;01/05/1994 +Mega Man X2;Super Nintendo;Capcom;18/11/1995 +Mega Man X3;Super Nintendo;Minakuchi Engineering;15/05/1996 +Mega-Lo-Mania;Super Nintendo;Sensible Software;31/12/1994 +Metal Combat: Falcon's Revenge;Super Nintendo;Intelligent Systems;1994 +Metal Marines;Super Nintendo;Namco;1994 +Michael Jordan: Chaos in the Windy City;Super Nintendo;Electronic Arts;11/03/1995 +Mickey Mania: The Timeless Adventures of Mickey Mouse;Super Nintendo;Traveller's Tales;28/10/1994 +Micro Machines;Super Nintendo;Codemasters;1994 +Micro Machines 2: Turbo Tournament;Super Nintendo;Codemasters;22/02/1996 +Might and Magic II;Super Nintendo;Iguana Entertainment;1993 +Mighty Morphin Power Rangers;Super Nintendo;Natsume Co., Ltd.;11/1994 +Mighty Morphin Power Rangers: The Fighting Edition;Super Nintendo;Natsume Co., Ltd.;11/1995 +Mighty Morphin Power Rangers: The Movie;Super Nintendo;Natsume Co., Ltd.;1995 +Mohawk & Headphone Jack;Super Nintendo;Solid Software;27/03/1997 +Mortal Kombat;Super Nintendo;Sculptured Software;13/09/1993 +Mortal Kombat 3;Super Nintendo;Sculptured Software;20/10/1995 +Mortal Kombat II;Super Nintendo;Sculptured Software;09/09/1994 +Mr. Do!;Super Nintendo;C-Lab;27/03/1997 +Mr. Nutz;Super Nintendo;Ocean Software;1993 +Ms. Pac-Man;Super Nintendo;Digital Eclipse Software;03/1997 +Mystery Dungeon: Taloon's Great Adventure;Super Nintendo;Chunsoft;Cancelled +Mystic Quest Legend;Super Nintendo;Square;15/10/1993 +NBA All-Star Challenge;Super Nintendo;Beam Software;1993 +NBA Give 'n Go;Super Nintendo;Konami;1995 +NBA Hangtime;Super Nintendo;Funcom;1996 +NBA Jam;Super Nintendo;Iguana Entertainment;04/03/1994 +NBA Jam Tournament Edition;Super Nintendo;Iguana Entertainment;23/02/1995 +NBA Live 95;Super Nintendo;Electronic Arts;1994 +NBA Live 96;Super Nintendo;Electronic Arts;23/11/1995 +NBA Live 97;Super Nintendo;Electronic Arts;1996 +Newman/Haas IndyCar featuring Nigel Mansell;Super Nintendo;Gremlin Interactive;08/12/1994 +NFL Football;Super Nintendo;Park Place Productions;1993 +NFL Quarterback Club;Super Nintendo;Iguana Entertainment;04/1995 +NFL Quarterback Club 96;Super Nintendo;Iguana Entertainment;1995 +NHL 95;Super Nintendo;Visual Concepts / High Score Productions;08/12/1994 +NHL 96;Super Nintendo;High Score Productions / Tiburon Entertainment;26/10/1995 +NHL 97;Super Nintendo;Ceris Software;28/11/1996 +NHL Hockey '94;Super Nintendo;Electronic Arts;31/03/1994 +NHLPA Hockey '93;Super Nintendo;Electronic Arts;05/04/1993 +Nigel Mansell's World Championship;Super Nintendo;Gremlin Interactive;16/12/1993 +Ninja Warriors: The New Generation;Super Nintendo;Natsume Co., Ltd.;04/1995 +Nintendo Scope 6;Super Nintendo;Nintendo R&D1 / Intelligent Systems;26/08/1992 +Olympic Summer Games;Super Nintendo;Black Pearl Software / Tiertex Design Studios;27/06/1996 +On the Ball;Super Nintendo;Taito;1992 +Operation Logic Bomb;Super Nintendo;Jaleco;1993 +Oscar;Super Nintendo;Flair Software;12/1996 +Outlander;Super Nintendo;Mindscape;1993 +Pac-Attack;Super Nintendo;Namco;1993 +Pac-In-Time;Super Nintendo;Kalisto Entertainment;01/1995 +Pac-Man 2: The New Adventures;Super Nintendo;Namco;1994 +Paperboy 2;Super Nintendo;Eastridge Technology;1992 +Parodius;Super Nintendo;Konami;1992 +PGA European Tour;Super Nintendo;Electronic Arts;12/1996 +PGA Tour 96;Super Nintendo;Electronic Arts;1996 +PGA Tour Golf;Super Nintendo;Polygames;1992 +Phalanx;Super Nintendo;Kemco;1992 +Phantom 2040;Super Nintendo;Viacom New Media;11/1995 +Pierre le Chef is... Out to Lunch;Super Nintendo;Mindscape;09/1993 +Pilotwings;Super Nintendo;Nintendo EAD;1992 +Pinball Dreams;Super Nintendo;Spidersoft;25/08/1994 +Pinball Fantasies;Super Nintendo;Spidersoft;02/1995 +Pink Goes to Hollywood;Super Nintendo;Manley & Associates;1993 +Pinocchio;Super Nintendo;Virgin Interactive Entertainment;28/11/1996 +Pit-Fighter;Super Nintendo;Eastridge Technology;1992 +Pitfall: The Mayan Adventure;Super Nintendo;Redline Games;12/1994 +Plok;Super Nintendo;Software Creations;01/12/1993 +Pocky & Rocky;Super Nintendo;Natsume Co., Ltd.;19/08/1993 +Pocky & Rocky 2;Super Nintendo;Natsume Co., Ltd.;04/1995 +Pop'n TwinBee;Super Nintendo;Konami;11/1993 +Pop'n TwinBee: Rainbow Bell Adventures;Super Nintendo;Konami;1994 +Populous;Super Nintendo;Infinity Co., Ltd;1992 +Populous II: Trials of the Olympian Gods;Super Nintendo;Infinity Co., Ltd;1993 +Porky Pig's Haunted Holiday;Super Nintendo;Phoenix Interactive Entertainment;11/1995 +Power Drive;Super Nintendo;Rage Software;11/1994 +Power Moves;Super Nintendo;System Vision;04/10/1993 +Power Piggs of the Dark Age;Super Nintendo;Radical Entertainment;29/09/1997 +Powermonger;Super Nintendo;Bullfrog Productions;1993 +Prehistorik Man;Super Nintendo;Titus Software;27/06/1996 +Primal Rage;Super Nintendo;Bitmasters;25/08/1995 +Prince of Persia;Super Nintendo;Arsys Software;01/11/1992 +Prince of Persia 2: The Shadow and the Flame;Super Nintendo;Titus Software;1996 +Push-Over;Super Nintendo;Red Rat Software;1992 +Putty Squad;Super Nintendo;System 3;1994 +Puzzle Bobble: Bust-a-Move;Super Nintendo;Taito;1995 +R-Type III: The Third Lightning;Super Nintendo;Tamtex;1994 +Race Drivin';Super Nintendo;Imagineering;01/10/1992 +Radical Rex;Super Nintendo;Beam Software;09/1994 +Ranma ½;Super Nintendo;Atelier Double;12/11/1993 +Realm;Super Nintendo;Titus Software;27/02/1996 +Revolution X;Super Nintendo;Rage Software;1995 +Rise of the Robots;Super Nintendo;Data Design Interactive;01/1995 +Rival Turf!;Super Nintendo;Jaleco;1993 +Road Riot 4WD;Super Nintendo;Equilibrium;1992 +RoboCop 3;Super Nintendo;Ocean Software;11/1992 +RoboCop Versus The Terminator;Super Nintendo;Interplay Entertainment;24/08/1993 +Rock n' Roll Racing;Super Nintendo;Silicon & Synapse;31/03/1994 +Run Saber;Super Nintendo;Hori Electric;11/1993 +Sailor Moon;Super Nintendo;Angel;11/1994 +Samurai Shodown;Super Nintendo;Takara;1994 +Saturday Night Slam Masters;Super Nintendo;Capcom;09/1994 +SeaQuest DSV;Super Nintendo;Sculptured Software;27/07/1995 +Secret of Evermore;Super Nintendo;Square;22/02/1996 +Secret of Mana;Super Nintendo;Square;25/11/1994 +Sensible Soccer: European Champions;Super Nintendo;Sensible Software;02/1994 +Shadowrun;Super Nintendo;Beam Software;08/1993 +Shanghai II: Dragon's Eye;Super Nintendo;Hot-B;1993 +Shaq Fu;Super Nintendo;Delphine Software International;28/10/1994 +Side Pocket;Super Nintendo;Iguana Entertainment;1994 +SimCity;Super Nintendo;Nintendo EAD / Intelligent Systems;24/09/1992 +SimCity 2000;Super Nintendo;HAL Laboratory;19/12/1996 +Sink or Swim;Super Nintendo;Zeppelin Games;31/12/1994 +Skyblazer;Super Nintendo;Ukiyotei;25/03/1994 +Smash Tennis;Super Nintendo;Namco;1994 +Soccer Kid;Super Nintendo;Krisalis Software;06/1994 +Soccer Shootout;Super Nintendo;A-Max;1994 +Sonic Blast Man;Super Nintendo;I.T.L / Zuntata;1993 +Soul Blazer;Super Nintendo;Quintet;27/01/1994 +Space Ace;Super Nintendo;Oxford Digital Enterprises;1994 +Space Invaders;Super Nintendo;Taito;1997 +Space Megaforce;Super Nintendo;Compile;1992 +Spanky's Quest;Super Nintendo;Natsume Co., Ltd.;1992 +Sparkster;Super Nintendo;Konami;1994 +Spectre;Super Nintendo;Synergistic Software;07/1994 +Speedy Gonzales: Los Gatos Bandidos;Super Nintendo;Sunsoft;Cancelled +Spider-Man;Super Nintendo;Western Technologies;03/1995 +Spider-Man and the X-Men in Arcade's Revenge;Super Nintendo;Software Creations;19/08/1993 +Spider-Man and Venom: Maximum Carnage;Super Nintendo;Software Creations;24/11/1994 +Spindizzy Worlds;Super Nintendo;ASCII Entertainment;1992 +Spirou;Super Nintendo;Infogrames;29/09/1995 +Star Trek: Deep Space Nine – Crossroads of Time;Super Nintendo;Novotrade;1995 +Star Trek: Starfleet Academy - Starship Bridge Simulator;Super Nintendo;Interplay Entertainment;1994 +Star Trek: The Next Generation – Future's Past;Super Nintendo;Spectrum HoloByte;1994 +Stargate;Super Nintendo;Tantalus Interactive;29/06/1995 +Starwing;Super Nintendo;Nintendo EAD / Argonaut Software;03/06/1993 +Street Combat;Super Nintendo;NCS Corp / Opus / Winds;07/1993 +Street Fighter Alpha 2;Super Nintendo;Capcom;19/12/1996 +Street Fighter II Turbo: Hyper Fighting;Super Nintendo;Capcom;10/1993 +Street Fighter II: The World Warrior;Super Nintendo;Capcom;05/10/1992 +Street Racer;Super Nintendo;Vivid Image;08/12/1994 +Striker;Super Nintendo;Rage Software;10/1993 +Stunt Race FX;Super Nintendo;Nintendo EAD / Argonaut Software;27/10/1994 +Sunset Riders;Super Nintendo;Konami;10/1993 +Super Adventure Island;Super Nintendo;Produce;19/11/1992 +Super Adventure Island II;Super Nintendo;Make;03/1995 +Super B.C. Kid;Super Nintendo;A.I. Company Ltd.;1995 +Super Battleship;Super Nintendo;World Builders Synergistic;1994 +Super Battletank 2;Super Nintendo;Absolute Entertainment;08/08/1994 +Super BattletankJP;Super Nintendo;Imagineering;18/03/1993 +Super Bomberman;Super Nintendo;Produce;20/11/1993 +Super Bomberman 2;Super Nintendo;Produce;11/1994 +Super Bomberman 3;Super Nintendo;Hudson Soft;10/1995 +Super Buster Bros.;Super Nintendo;Capcom;1992 +Super Castlevania IV;Super Nintendo;Konami;27/08/1992 +Super Chase H.Q.;Super Nintendo;Taito;1993 +Super Conflict;Super Nintendo;Manley & Associates;1994 +Super Dany;Super Nintendo;Cryo Interactive;1994 +Super Double Dragon;Super Nintendo;Technōs Japan;30/09/1993 +Super Ghouls 'n Ghosts;Super Nintendo;Capcom;10/12/1992 +Super Goal!;Super Nintendo;Tose;1992 +Super Hockey;Super Nintendo;Sculptured Software;1993 +Super Ice Hockey;Super Nintendo;Opera House;1994 +Super International Cricket;Super Nintendo;Beam Software;07/1995 +Super James Pond;Super Nintendo;Vectordean;09/1993 +Super Loopz;Super Nintendo;Graffiti;Cancelled +Super Mario All-Stars;Super Nintendo;Nintendo EAD;16/12/1993 +Super Mario All-Stars + Super Mario World;Super Nintendo;Nintendo EAD;1995 +Super Mario Kart;Super Nintendo;Nintendo EAD;21/01/1993 +Super Mario World;Super Nintendo;Nintendo EAD;11/04/1992 +Super Mario World 2: Yoshi's Island;Super Nintendo;Nintendo EAD;05/10/1995 +Super Metroid;Super Nintendo;Nintendo R&D1 / Intelligent Systems;28/07/1994 +Super Morph;Super Nintendo;Millennium Interactive;1993 +Super Off Road;Super Nintendo;Software Creations;24/06/1993 +Super Pinball: Behind the Mask;Super Nintendo;KAZe;08/08/1994 +Super Probotector: Alien Rebels;Super Nintendo;Konami;19/11/1992 +Super Punch-Out!!;Super Nintendo;Nintendo R&D3 / Locomotive Corporation;10/02/1995 +Super Putty;Super Nintendo;System 3;1993 +Super R-Type;Super Nintendo;Irem;04/06/1992 +Super Smash TV;Super Nintendo;Beam Software;18/02/1993 +Super Soccer;Super Nintendo;Human Entertainment;11/04/1992 +Super Star Wars;Super Nintendo;LucasArts / Sculptured Software;02/04/1993 +Super Star Wars: Return of the Jedi;Super Nintendo;LucasArts / Sculptured Software;30/03/1995 +Super Star Wars: The Empire Strikes Back;Super Nintendo;LucasArts / Sculptured Software;18/02/1994 +Super Street Fighter II: The New Challengers;Super Nintendo;Capcom;02/12/1994 +Super Strike Eagle;Super Nintendo;MicroProse;25/11/1993 +Super Strike Gunner;Super Nintendo;Athena;11/1992 +Super SWIV;Super Nintendo;Sales Curve Interactive;19/08/1993 +Super Tennis;Super Nintendo;Tose;11/04/1992 +Super Troll Islands;Super Nintendo;Millennium Interactive;1994 +Super Turrican;Super Nintendo;Factor 5;1993 +Super Turrican 2;Super Nintendo;Factor 5;05/1995 +Super Widget;Super Nintendo;Atlus;1993 +Syndicate;Super Nintendo;Bullfrog Productions;01/1995 +Syvalion;Super Nintendo;Taito;11/1992 +T2: The Arcade Game;Super Nintendo;Probe Entertainment;01/1994 +Targa;Super Nintendo;Rainbow Arts;Cancelled +Taz-Mania;Super Nintendo;Visual Concepts;1993 +Tecmo Super NBA Basketball;Super Nintendo;Sculptured Software;1993 +Teenage Mutant Hero Turtles IV: Turtles in Time;Super Nintendo;Konami;19/11/1992 +Teenage Mutant Hero Turtles: Tournament Fighters;Super Nintendo;Konami;12/1993 +Terminator 2: Judgment Day;Super Nintendo;Bits Studios;1993 +Terranigma;Super Nintendo;Quintet;19/12/1996 +Tetris & Dr. Mario;Super Nintendo;Nintendo;27/07/1995 +Tetris 2;Super Nintendo;Tose;1995 +Tetris Attack;Super Nintendo;Intelligent Systems;28/11/1996 +The Addams Family;Super Nintendo;Ocean Software;19/11/1992 +The Addams Family: Pugsley's Scavenger Hunt;Super Nintendo;Ocean Software;1992 +The Adventures of Batman & Robin;Super Nintendo;Konami;1994 +The Adventures of Dr. Franken;Super Nintendo;MotiveTime;1993 +The Adventures of Mighty Max;Super Nintendo;WJS Design;1995 +The Adventures of Tintin: Prisoners of the Sun;Super Nintendo;Infogrames;09/02/1997 +The Blues Brothers;Super Nintendo;Titus Software;1993 +The Brainies;Super Nintendo;Titus Software;1996 +The Chaos Engine;Super Nintendo;Bitmap Brothers;07/1994 +The Chessmaster;Super Nintendo;Eastridge Technology;1992 +The Death and Return of Superman;Super Nintendo;Blizzard Entertainment;11/1994 +The Duel: Test Drive II;Super Nintendo;Distinctive Software;1992 +The Firemen;Super Nintendo;Human Entertainment;03/1995 +The Flintstones;Super Nintendo;Ocean Software;04/1995 +The Flintstones: The Treasure of Sierra Madrock;Super Nintendo;Taito / Sol Corporation;23/06/1994 +The Great Circus Mystery Starring Mickey & Minnie;Super Nintendo;Capcom;27/04/1995 +The Humans;Super Nintendo;Imagitec Design;31/12/1993 +The Hunt for Red October;Super Nintendo;Riedel Software Productions;1993 +The Incredible Crash Dummies;Super Nintendo;Gray Matter;1993 +The Incredible Hulk;Super Nintendo;Probe Entertainment;1993 +The Itchy & Scratchy Game;Super Nintendo;Bits Studios;1995 +The Jungle Book;Super Nintendo;Eurocom Entertainment Software;24/09/1994 +The King of Dragons;Super Nintendo;Capcom;08/1994 +The Lawnmower Man;Super Nintendo;Sales Curve Interactive;1993 +The Legend of the Mystical Ninja;Super Nintendo;Konami;1994 +The Legend of Zelda: A Link to the Past;Super Nintendo;Nintendo EAD;24/09/1992 +The Lion King;Super Nintendo;Westwood Studios;11/11/1994 +The Lost Vikings;Super Nintendo;Silicon & Synapse;28/10/1993 +The Lost Vikings 2;Super Nintendo;Blizzard Entertainment;27/02/1997 +The Magical Quest Starring Mickey Mouse;Super Nintendo;Capcom;18/03/1993 +The Mask;Super Nintendo;Black Pearl Software;26/10/1995 +The Pagemaster;Super Nintendo;Probe Entertainment;23/05/1995 +The Pirates of Dark Water;Super Nintendo;Sunsoft;1994 +The Ren & Stimpy Show: Fire Dogs;Super Nintendo;Argonaut Software;02/1995 +The Ren & Stimpy Show: Time Warp;Super Nintendo;Sculptured Software;1994 +The Ren & Stimpy Show: Veediots!;Super Nintendo;Gray Matter;1993 +The Simpsons: Bart's Nightmare;Super Nintendo;Sculptured Software;18/02/1993 +The Smurfs;Super Nintendo;Infogrames;1994 +The Smurfs Travel The World;Super Nintendo;Infogrames;1996 +The Terminator;Super Nintendo;Gray Matter;1993 +Theme Park;Super Nintendo;Bullfrog Productions;11/11/1994 +Thomas the Tank Engine & Friends;Super Nintendo;Software Creations;31/12/1993 +Time Slip;Super Nintendo;Sales Curve Interactive;1993 +Time Trax;Super Nintendo;Malibu Interactive;07/1994 +Timecop;Super Nintendo;Cryo Interactive;1996 +Timon & Pumbaa's Jungle Games;Super Nintendo;Tiertex Design Studios;26/03/1998 +Tintin in Tibet;Super Nintendo;Infogrames;14/12/1995 +Tiny Toon Adventures: Buster Busts Loose!;Super Nintendo;Konami;24/06/1993 +Tiny Toon Adventures: Wild & Wacky Sports;Super Nintendo;Konami;25/04/1994 +TKO Super Championship Boxing;Super Nintendo;Sting Entertainment;1993 +Tom and Jerry;Super Nintendo;Riedel Software Productions;1993 +Top Gear;Super Nintendo;Gremlin Interactive;19/11/1992 +Top Gear 2;Super Nintendo;Gremlin Interactive;1993 +Top Gear 3000;Super Nintendo;Gremlin Interactive;1995 +Total Carnage;Super Nintendo;Black Pearl Software;1993 +Toy Story;Super Nintendo;Traveller's Tales;25/04/1996 +Toys;Super Nintendo;Imagineering;1993 +Troddlers;Super Nintendo;Atod;1993 +True Golf Classics: Pebble Beach Golf Links;Super Nintendo;T&E Soft;1992 +True Lies;Super Nintendo;Beam Software;29/06/1995 +Tuff E Nuff;Super Nintendo;Jaleco;1993 +Turn and Burn: No-Fly Zone;Super Nintendo;Absolute Entertainment;08/08/1994 +U.N. Squadron;Super Nintendo;Capcom;12/1992 +Ultimate Mortal Kombat 3;Super Nintendo;Avalanche Software;28/11/1996 +Ultraman: Towards the Future;Super Nintendo;Nova Games;1992 +Unirally;Super Nintendo;DMA Design;27/04/1995 +Urban Strike;Super Nintendo;Granite Bay Software;1995 +Utopia: The Creation of a Nation;Super Nintendo;Jaleco;08/1994 +Val d'Isere Championship;Super Nintendo;Loriciel;28/04/1994 +Vegas Stakes;Super Nintendo;HAL Laboratory;1993 +Venom/Spider-Man: Separation Anxiety;Super Nintendo;Software Creations;1995 +Virtual Bart;Super Nintendo;Sculptured Software;1994 +Virtual Soccer;Super Nintendo;Probe Entertainment;1994 +Vortex;Super Nintendo;Argonaut Software;12/1994 +Wario's Woods;Super Nintendo;Nintendo / Intelligent Systems;1995 +Warlock;Super Nintendo;Realtime Associates;1994 +WarpSpeed;Super Nintendo;Accolade;1992 +Waterworld;Super Nintendo;Ocean Software;1995 +Wayne's World;Super Nintendo;Gray Matter;1993 +We're Back! A Dinosaur's Story;Super Nintendo;Visual Concepts;1993 +Weaponlord;Super Nintendo;Visual Concepts;1995 +Where in the World Is Carmen Sandiego?;Super Nintendo;EA Canada;10/1993 +Whirlo;Super Nintendo;Nova Games;1992 +Whizz;Super Nintendo;Flair Software;1997 +Wild Guns;Super Nintendo;Natsume Co., Ltd.;31/10/1996 +Williams Arcade's Greatest Hits;Super Nintendo;Digital Eclipse Software;08/01/1997 +Wing Commander;Super Nintendo;Origin Systems;1993 +Wing Commander: The Secret Missions;Super Nintendo;Origin Systems;10/1993 +Winter Gold;Super Nintendo;Funcom;28/11/1996 +Winter Olympic Games: Lillehammer '94;Super Nintendo;U.S. Gold;24/02/1994 +Wolfenstein 3D;Super Nintendo;Imagineer;1994 +Wolverine: Adamantium Rage;Super Nintendo;Bits Studios;12/1994 +World Class Rugby;Super Nintendo;Audiogenic;1993 +World Cup Striker;Super Nintendo;Rage Software / Elite Systems;15/07/1994 +World Cup USA '94;Super Nintendo;U.S. Gold;26/05/1994 +World Heroes;Super Nintendo;Sunsoft;1993 +World League Basketball;Super Nintendo;Sculptured Software;22/07/1993 +World Masters Golf;Super Nintendo;Arc Developments;23/11/1995 +World Soccer;Super Nintendo;Sculptured Software;Cancelled +Worms;Super Nintendo;Team17;27/09/1996 +WWF RAW;Super Nintendo;Sculptured Software;12/1994 +WWF Royal Rumble;Super Nintendo;Sculptured Software;1993 +WWF Super WrestleMania;Super Nintendo;Sculptured Software;1992 +WWF WrestleMania: The Arcade Game;Super Nintendo;Sculptured Software;25/01/1996 +X-Kaliber 2097;Super Nintendo;Fupac / Winds;12/1994 +X-Men: Mutant Apocalypse;Super Nintendo;Capcom;1995 +X-Zone;Super Nintendo;Kemco;1993 +Yogi Bear's Cartoon Capers;Super Nintendo;Blue Turtle;24/11/1994 +Yoshi's Cookie;Super Nintendo;Bullet-Proof Software;1993 +Yoshi's Safari;Super Nintendo;Nintendo R&D1;1993 +Young Merlin;Super Nintendo;Westwood Studios;1994 +Zero the Kamikaze Squirrel;Super Nintendo;Iguana Entertainment;30/03/1995 +Zombies;Super Nintendo;LucasArts;04/10/1993 +"Zool: Ninja of the ""Nth"" Dimension";Super Nintendo;Gremlin Interactive;1994 +Zoop;Super Nintendo;Hookstone;1995 diff --git a/backend/services/collection/imports/__init__.py b/backend/services/collection/imports/__init__.py index 49f43bb..8e408d2 100644 --- a/backend/services/collection/imports/__init__.py +++ b/backend/services/collection/imports/__init__.py @@ -44,6 +44,15 @@ CollectionImportStudio, CollectionImportWarnings, ) +from .collection_import_refusal_policy import ( + CollectionImportRefusal, + CollectionImportRefusalPolicy, +) +from .collection_import_refusal_admin_notifier import CollectionImportRefusalAdminNotifier +from .collection_import_refusal_context import CollectionImportRefusalContext +from .collection_import_refusal_notification_service import ( + CollectionImportRefusalNotificationService, +) from .collection_import_date_validator import CollectionImportDateValidator from .collection_import_value_mapper import CollectionImportValueMapper from .condition_matching_configuration import ConditionMatchingConfiguration @@ -69,6 +78,11 @@ "CollectionImportField", "CollectionImportGame", "CollectionImportPlatform", + "CollectionImportRefusal", + "CollectionImportRefusalAdminNotifier", + "CollectionImportRefusalContext", + "CollectionImportRefusalNotificationService", + "CollectionImportRefusalPolicy", "CollectionImportStudio", "CollectionImportWarnings", "CollectionImportValueMapper", diff --git a/backend/services/collection/imports/collection_import_refusal_admin_notifier.py b/backend/services/collection/imports/collection_import_refusal_admin_notifier.py new file mode 100644 index 0000000..e344567 --- /dev/null +++ b/backend/services/collection/imports/collection_import_refusal_admin_notifier.py @@ -0,0 +1,165 @@ +# ____ _ _ ____ _ _ _ _ ___ +# / ___| | ___ _ _ __| |/ ___|___ | | | ___ ___| |_(_) ___ _ __ / _ \ _ __ _ __ +# | | | |/ _ \| | | |/ _` | | / _ \| | |/ _ \/ __| __| |/ _ \| `_ \| | | | `_ \| `_ | +# | |___| | (_) | |_| | (_| | |__| (_) | | | __/ (__| |_| | (_) | | | | |_| | |_) | |_) | +# \____|_|\___/ \__,_|\__,_|\____\___|_|_|\___|\___|\__|_|\___/|_| |_|\___/|_| |_|\___/ +# Projet : CloudCollectionApp +# Date de creation : 2026-08-11 +# Auteurs : OpenAI ChatGPT, Codex, Binda Sébastien +# Licence : Apache 2.0 +# +# Description : notification administrateur d'un import refuse apres lecture. + +import os +from html import escape +from pathlib import Path + +from services.email import EmailConfiguration, EmailSenderFactory, EmailTemplateRenderer + +from .collection_import_refusal_context import CollectionImportRefusalContext + + +class CollectionImportRefusalAdminNotifier: + """Envoie un email administrateur quand un import est refuse.""" + + def __init__( + self, + email_sender=None, + admin_notification_email: str | None = None, + template_path: str | Path | None = None, + template_renderer: EmailTemplateRenderer | None = None, + ): + """Initialise le notifier de refus d'import. + + Args: + email_sender (object | None): Expediteur email injectable. + admin_notification_email (str | None): Adresse administrateur destinataire. + template_path (str | Path | None): Chemin optionnel du template HTML. + template_renderer (EmailTemplateRenderer | None): Moteur de rendu injectable. + + Returns: + None: Le constructeur ne retourne aucune valeur. + """ + + self.email_sender = email_sender + if admin_notification_email is None: + admin_notification_email = os.getenv("ADMIN_NOTIFICATION_EMAIL", "") + self.admin_notification_email = str(admin_notification_email or "").strip() + self.template_path = Path(template_path) if template_path else self.default_template_path() + self.template_renderer = template_renderer or EmailTemplateRenderer() + + @classmethod + def default_template_path(cls) -> Path: + """Retourne le chemin du template email par defaut. + + Args: + Aucun. + + Returns: + Path: Chemin du template stocke dans `backend/resources`. + """ + + return ( + EmailTemplateRenderer.default_resources_directory() + / "collection_import_refusal_email_template.txt" + ) + + def is_enabled(self) -> bool: + """Indique si une notification de refus peut etre envoyee. + + Args: + Aucun. + + Returns: + bool: `True` lorsqu'une adresse administrateur est configuree. + """ + + return bool(self.admin_notification_email) + + def notify_import_refusal(self, context: CollectionImportRefusalContext) -> None: + """Envoie le rapport de refus d'import a l'administrateur. + + Args: + context (CollectionImportRefusalContext): Contexte complet du refus. + + Returns: + None: La methode ne retourne aucune valeur. + """ + + if not self.admin_notification_email: + return + email_sender = self.email_sender or EmailSenderFactory.create( + EmailConfiguration.from_environment() + ) + email_sender.send_email( + recipient_email=self.admin_notification_email, + subject=f"Import refuse - {context.import_kind}", + body=self._build_email_body(context), + content_subtype="html", + ) + + def _build_email_body(self, context: CollectionImportRefusalContext) -> str: + warnings = context.import_data.warnings + return self.template_renderer.render( + self.template_path, + { + "import_kind": escape(context.import_kind), + "requester_user_id": self._requester_user_id(context.requester_user_id), + "requester_email": escape(context.requester_email or "inconnu"), + "file_type": escape(context.file_type or "inconnu"), + "original_filename": escape(context.original_filename or "inconnu"), + "reason": escape(str(context.refusal.get("reason") or "")), + "message": escape(str(context.refusal.get("message") or "")), + "invalid_games_count": int(context.refusal.get("invalid_games_count") or 0), + "total_games_count": int(context.refusal.get("total_games_count") or 0), + "linked_platforms": 0, + "created_studios": 0, + "created_games": 0, + "associated_games": 0, + "wishlisted_games": 0, + "warnings": escape(self._warnings_text(warnings)), + "invalid_games": self._invalid_games_html(warnings.invalid_games), + }, + ) + + def _requester_user_id(self, requester_user_id: int | None) -> str: + return escape(str(requester_user_id)) if requester_user_id is not None else "inconnu" + + def _warnings_text(self, warnings: object) -> str: + lines = [ + "Warnings:", + f"- Wishlist invalide: {int(getattr(warnings, 'invalid_wishlist', 0) or 0)}", + f"- Jeux invalides: {len(getattr(warnings, 'invalid_games', []) or [])}", + f"- Jeux ignores: {len(getattr(warnings, 'skipped_games', []) or [])}", + f"- Plateformes a verifier: {len(getattr(warnings, 'platform_matches', []) or [])}", + ] + invalid_values = list(getattr(warnings, "invalid_wishlist_values_found", []) or []) + if invalid_values: + lines.append("- Valeurs wishlist invalides: " + ", ".join(map(str, invalid_values))) + return "\n".join(lines) + + def _invalid_games_html(self, invalid_games: list[dict]) -> str: + if not invalid_games: + return "

Aucun jeu avec information invalide.

" + rows = [] + for invalid_game in invalid_games: + rows.append( + "" + f"{escape(str(invalid_game.get('name') or ''))}" + f"{escape(self._invalid_fields_text(invalid_game.get('invalid_fields') or []))}" + "" + ) + return ( + '' + "" + + "".join(rows) + + "
JeuErreurs
" + ) + + def _invalid_fields_text(self, invalid_fields: list[dict]) -> str: + values = [] + for invalid_field in invalid_fields: + field_name = str(invalid_field.get("field") or "") + field_value = str(invalid_field.get("value") or "") + values.append(f"{field_name}: {field_value}" if field_value else field_name) + return ", ".join(values) diff --git a/backend/services/collection/imports/collection_import_refusal_context.py b/backend/services/collection/imports/collection_import_refusal_context.py new file mode 100644 index 0000000..475409a --- /dev/null +++ b/backend/services/collection/imports/collection_import_refusal_context.py @@ -0,0 +1,38 @@ +# ____ _ _ ____ _ _ _ _ ___ +# / ___| | ___ _ _ __| |/ ___|___ | | | ___ ___| |_(_) ___ _ __ / _ \ _ __ _ __ +# | | | |/ _ \| | | |/ _` | | / _ \| | |/ _ \/ __| __| |/ _ \| `_ \| | | | `_ \| `_ | +# | |___| | (_) | |_| | (_| | |__| (_) | | | __/ (__| |_| | (_) | | | | |_| | |_) | |_) | +# \____|_|\___/ \__,_|\__,_|\____\___|_|_|\___|\___|\__|_|\___/|_| |_|\___/|_| |_|\___/ +# Projet : CloudCollectionApp +# Date de creation : 2026-08-11 +# Auteurs : OpenAI ChatGPT, Codex, Binda Sébastien +# Licence : Apache 2.0 +# +# Description : contexte de notification administrateur d'un import refuse. + +from dataclasses import dataclass + +from .collection_import_models import CollectionImportData + + +@dataclass(frozen=True) +class CollectionImportRefusalContext: + """Regroupe les informations envoyees quand un import est refuse. + + Attributes: + import_kind (str): Type fonctionnel d'import. + requester_user_id (int | None): Identifiant utilisateur demandeur si connu. + requester_email (str): Email ou sujet d'authentification du demandeur. + file_type (str): Type de fichier importe. + original_filename (str): Nom original du fichier. + refusal (dict): Decision de refus serialisable. + import_data (CollectionImportData): Donnees lues et warnings de l'import. + """ + + import_kind: str + requester_user_id: int | None + requester_email: str + file_type: str + original_filename: str + refusal: dict + import_data: CollectionImportData diff --git a/backend/services/collection/imports/collection_import_refusal_notification_service.py b/backend/services/collection/imports/collection_import_refusal_notification_service.py new file mode 100644 index 0000000..2548d57 --- /dev/null +++ b/backend/services/collection/imports/collection_import_refusal_notification_service.py @@ -0,0 +1,65 @@ +# ____ _ _ ____ _ _ _ _ ___ +# / ___| | ___ _ _ __| |/ ___|___ | | | ___ ___| |_(_) ___ _ __ / _ \ _ __ _ __ +# | | | |/ _ \| | | |/ _` | | / _ \| | |/ _ \/ __| __| |/ _ \| `_ \| | | | `_ \| `_ | +# | |___| | (_) | |_| | (_| | |__| (_) | | | __/ (__| |_| | (_) | | | | |_| | |_) | |_) | +# \____|_|\___/ \__,_|\__,_|\____\___|_|_|\___|\___|\__|_|\___/|_| |_|\___/|_| |_|\___/ +# Projet : CloudCollectionApp +# Date de creation : 2026-08-11 +# Auteurs : OpenAI ChatGPT, Codex, Binda Sébastien +# Licence : Apache 2.0 +# +# Description : orchestration non bloquante des notifications d'import refuse. + +from .collection_import_models import CollectionImportData +from .collection_import_refusal_context import CollectionImportRefusalContext + + +class CollectionImportRefusalNotificationService: + """Construit et envoie les notifications administrateur de refus d'import.""" + + def notify_refusal( + self, + refusal_notifier: object, + logger: object, + import_kind: str, + requester_user_id: int | None, + requester_email: str, + file_type: str, + original_filename: str, + refusal: dict, + import_data: CollectionImportData, + ) -> None: + """Envoie une notification de refus sans perturber la reponse d'import. + + Args: + refusal_notifier (object): Notifier expose par la configuration d'import. + logger (object): Logger utilise si l'envoi echoue. + import_kind (str): Type fonctionnel d'import concerne. + requester_user_id (int | None): Identifiant du demandeur si disponible. + requester_email (str): Email ou sujet d'authentification du demandeur. + file_type (str): Type de fichier concerne. + original_filename (str): Nom de fichier transmis par le client. + refusal (dict): Decision de refus serialisable. + import_data (CollectionImportData): Donnees lues et warnings. + + Returns: + None: La methode ne retourne aucune valeur. + """ + + notify_import_refusal = getattr(refusal_notifier, "notify_import_refusal", None) + if not callable(notify_import_refusal): + return + try: + notify_import_refusal( + CollectionImportRefusalContext( + import_kind=import_kind, + requester_user_id=requester_user_id, + requester_email=str(requester_email or ""), + file_type=str(file_type or ""), + original_filename=str(original_filename or ""), + refusal=refusal, + import_data=import_data, + ) + ) + except Exception: + logger.exception("Impossible d'envoyer le rapport de refus d'import.") diff --git a/backend/services/collection/imports/collection_import_refusal_policy.py b/backend/services/collection/imports/collection_import_refusal_policy.py new file mode 100644 index 0000000..3b1b2e2 --- /dev/null +++ b/backend/services/collection/imports/collection_import_refusal_policy.py @@ -0,0 +1,88 @@ +# ____ _ _ ____ _ _ _ _ ___ +# / ___| | ___ _ _ __| |/ ___|___ | | | ___ ___| |_(_) ___ _ __ / _ \ _ __ _ __ +# | | | |/ _ \| | | |/ _` | | / _ \| | |/ _ \/ __| __| |/ _ \| `_ \| | | | `_ \| `_ | +# | |___| | (_) | |_| | (_| | |__| (_) | | | __/ (__| |_| | (_) | | | | |_| | |_) | |_) | +# \____|_|\___/ \__,_|\__,_|\____\___|_|_|\___|\___|\__|_|\___/|_| |_|\___/| .__/| .__/ +# |_| |_| +# Projet : CloudCollectionApp +# Date de creation : 2026-08-11 +# Auteurs : OpenAI ChatGPT, Codex, Binda Sébastien +# Licence : Apache 2.0 +# +# Description : politique de refus global d'un fichier de collection importe. + +from dataclasses import dataclass + +from .collection_import_models import CollectionImportData + + +@dataclass(frozen=True) +class CollectionImportRefusal: + """Decrit le refus global eventuel d'un fichier importe. + + Attributes: + refused (bool): Indique si l'import complet est refuse. + reason (str): Raison fonctionnelle stable du refus. + invalid_games_count (int): Nombre de jeux contenant au moins une erreur. + total_games_count (int): Nombre total de jeux lus dans le fichier. + message (str): Message fonctionnel exploitable par l'interface. + """ + + refused: bool + reason: str = "" + invalid_games_count: int = 0 + total_games_count: int = 0 + message: str = "" + + def to_dict(self) -> dict[str, object]: + """Convertit le refus en dictionnaire serialisable. + + Args: + Aucun. + + Returns: + dict[str, object]: Informations de refus exposees par l'API. + """ + + return { + "refused": self.refused, + "reason": self.reason, + "invalid_games_count": self.invalid_games_count, + "total_games_count": self.total_games_count, + "message": self.message, + } + + +class CollectionImportRefusalPolicy: + """Refuse un import quand trop de jeux lus contiennent des erreurs.""" + + REFUSAL_REASON_TOO_MANY_INVALID_GAMES = "too_many_invalid_games" + + def evaluate(self, import_data: CollectionImportData) -> CollectionImportRefusal: + """Evalue si l'import complet doit etre refuse. + + Args: + import_data (CollectionImportData): Donnees lues et validees. + + Returns: + CollectionImportRefusal: Decision de refus global. + """ + + total_games_count = len(import_data.games) + invalid_games_count = len(import_data.warnings.invalid_games) + if total_games_count > 0 and invalid_games_count * 2 > total_games_count: + return CollectionImportRefusal( + refused=True, + reason=self.REFUSAL_REASON_TOO_MANY_INVALID_GAMES, + invalid_games_count=invalid_games_count, + total_games_count=total_games_count, + message=( + "Import refuse car " + f"{invalid_games_count}/{total_games_count} jeux contiennent au moins une erreur." + ), + ) + return CollectionImportRefusal( + refused=False, + invalid_games_count=invalid_games_count, + total_games_count=total_games_count, + ) diff --git a/backend/services/library/admin_library_import_service.py b/backend/services/library/admin_library_import_service.py index ad9dbc9..3676fca 100644 --- a/backend/services/library/admin_library_import_service.py +++ b/backend/services/library/admin_library_import_service.py @@ -22,6 +22,9 @@ CollectionImportFailureAdminNotifier, CollectionImportFailureNotificationService, CollectionImportDateValidator, + CollectionImportRefusalAdminNotifier, + CollectionImportRefusalNotificationService, + CollectionImportRefusalPolicy, ) from services.csv.csv_collection_import_reader import CsvCollectionImportReader from services.database.admin_library_import_repository import ( @@ -61,12 +64,14 @@ class AdminLibraryImportResult: created_studios (int): Nombre de studios crees. created_games (int): Nombre de jeux crees. warnings (dict): Avertissements produits pendant la lecture et le matching. + refusal (dict | None): Decision de refus global du fichier. """ linked_platforms: int created_studios: int created_games: int warnings: dict + refusal: dict | None = None def to_dict(self) -> dict: """Convertit le resultat en payload JSON. @@ -83,6 +88,13 @@ def to_dict(self) -> dict: "created_studios": self.created_studios, "created_games": self.created_games, "warnings": dict(self.warnings), + "refusal": self.refusal or { + "refused": False, + "reason": "", + "invalid_games_count": 0, + "total_games_count": 0, + "message": "", + }, } @@ -96,6 +108,7 @@ def __init__( configuration_loader: AdminLibraryImportConfigurationLoader | None = None, date_validator: CollectionImportDateValidator | None = None, failure_notifier=None, + refusal_notifier=None, logger=None, ): """Initialise le service d'import admin. @@ -106,6 +119,7 @@ def __init__( configuration_loader (AdminLibraryImportConfigurationLoader | None): Chargeur JSON. date_validator (CollectionImportDateValidator | None): Validateur de dates. failure_notifier (object | None): Notifier admin des echecs d'import. + refusal_notifier (object | None): Notifier admin des refus d'import. logger (object | None): Logger injectable. Returns: @@ -117,7 +131,10 @@ def __init__( self.configuration_loader = configuration_loader or AdminLibraryImportConfigurationLoader() self.date_validator = date_validator or CollectionImportDateValidator() self.failure_notifier = failure_notifier or CollectionImportFailureAdminNotifier() + self.refusal_notifier = refusal_notifier or CollectionImportRefusalAdminNotifier() self.failure_notification_service = CollectionImportFailureNotificationService() + self.refusal_notification_service = CollectionImportRefusalNotificationService() + self.refusal_policy = CollectionImportRefusalPolicy() self.logger = logger or logging.getLogger(__name__) @classmethod @@ -165,6 +182,27 @@ def import_csv_file( description = self.configuration_loader.load_for_columns(columns) import_data = self.reader.read(csv_file_path, description) import_data = self.date_validator.validate(import_data) + refusal = self.refusal_policy.evaluate(import_data) + if refusal.refused: + refusal_payload = refusal.to_dict() + self.refusal_notification_service.notify_refusal( + self.refusal_notifier, + self.logger, + "bibliotheque_admin_csv", + None, + requester_email, + "csv", + original_filename or Path(csv_file_path).name, + refusal_payload, + import_data, + ) + return AdminLibraryImportResult( + linked_platforms=0, + created_studios=0, + created_games=0, + warnings=import_data.warnings.to_dict(), + refusal=refusal_payload, + ) persistence_result = self.repository.import_library(import_data) except AdminLibraryImportInvalidFileError as exc: self._notify_import_failure(exc, csv_file_path, original_filename, requester_email) @@ -213,6 +251,13 @@ def import_csv_file( created_studios=persistence_result.created_studios, created_games=persistence_result.created_games, warnings=import_data.warnings.to_dict(), + refusal={ + "refused": False, + "reason": "", + "invalid_games_count": len(import_data.warnings.invalid_games), + "total_games_count": len(import_data.games), + "message": "", + }, ) def _validate_extension(self, filename: str) -> None: diff --git a/backend/services/users/user_collection_import_errors.py b/backend/services/users/user_collection_import_errors.py new file mode 100644 index 0000000..0e494cb --- /dev/null +++ b/backend/services/users/user_collection_import_errors.py @@ -0,0 +1,49 @@ +# ____ _ _ ____ _ _ _ _ ___ +# / ___| | ___ _ _ __| |/ ___|___ | | | ___ ___| |_(_) ___ _ __ / _ \ _ __ _ __ +# | | | |/ _ \| | | |/ _` | | / _ \| | |/ _ \/ __| __| |/ _ \| `_ \| | | | `_ \| `_ | +# | |___| | (_) | |_| | (_| | |__| (_) | | | __/ (__| |_| | (_) | | | | |_| | |_) | |_) | +# \____|_|\___/ \__,_|\__,_|\____\___|_|_|\___|\___|\__|_|\___/|_| |_|\___/|_| |_|\___/ +# Projet : CloudCollectionApp +# Date de creation : 2026-08-11 +# Auteurs : OpenAI ChatGPT, Codex, Binda Sébastien +# Licence : Apache 2.0 +# +# Description : erreurs metier du workflow d'import de collection utilisateur. + + +class UserCollectionImportError(Exception): + """Classe de base des erreurs metier d'import de collection utilisateur.""" + + +class UserCollectionImportInvalidFileError(UserCollectionImportError): + """Signale qu'un fichier d'import est invalide ou illisible.""" + + def __init__(self, message: str, details: list[str] | None = None): + """Initialise l'erreur de fichier invalide. + + Args: + message (str): Message fonctionnel principal. + details (list[str] | None): Raisons techniques affichables. + + Returns: + None: Le constructeur ne retourne aucune valeur. + """ + + self.details = details or [message] + super().__init__(message) + + +class UserCollectionImportTooLargeError(UserCollectionImportError): + """Signale qu'un fichier d'import depasse la taille maximale autorisee.""" + + +class UserCollectionImportTemporaryFileMissingError(UserCollectionImportError): + """Signale que le fichier temporaire d'import est absent.""" + + +class UserCollectionImportNotFoundError(UserCollectionImportError): + """Signale qu'aucune collection utilisateur ne peut etre reinitialisee.""" + + +class UserCollectionImportUnexpectedError(UserCollectionImportError): + """Signale une erreur non fonctionnelle pendant l'import.""" diff --git a/backend/services/users/user_collection_import_file_manager.py b/backend/services/users/user_collection_import_file_manager.py new file mode 100644 index 0000000..d6f1c31 --- /dev/null +++ b/backend/services/users/user_collection_import_file_manager.py @@ -0,0 +1,209 @@ +# ____ _ _ ____ _ _ _ _ ___ +# / ___| | ___ _ _ __| |/ ___|___ | | | ___ ___| |_(_) ___ _ __ / _ \ _ __ _ __ +# | | | |/ _ \| | | |/ _` | | / _ \| | |/ _ \/ __| __| |/ _ \| `_ \| | | | `_ \| `_ | +# | |___| | (_) | |_| | (_| | |__| (_) | |__| __/ (__| |_| | (_) | | | | |_| | |_) | |_) | +# \____|_|\___/ \__,_|\__,_|\____\___|_|_|\___|\___|\__|_|\___/|_| |_|\___/| .__/| .__/ +# |_| |_| +# Projet : CloudCollectionApp +# Date de creation : 2026-08-11 +# Auteurs : OpenAI ChatGPT, Codex, Binda Sébastien +# Licence : Apache 2.0 +# +# Description : gestion des fichiers temporaires et conserves pendant l'import utilisateur. + +import shutil +from pathlib import Path + +from services.collection.imports import CollectionFileReader + +from .user_collection_import_configuration import UserCollectionImportConfiguration +from .user_collection_import_errors import ( + UserCollectionImportInvalidFileError, + UserCollectionImportTemporaryFileMissingError, + UserCollectionImportTooLargeError, + UserCollectionImportUnexpectedError, +) + + +class UserCollectionImportFileManager: + """Centralise les operations de fichiers du workflow d'import utilisateur.""" + + def __init__(self, configuration: UserCollectionImportConfiguration): + """Initialise le gestionnaire de fichiers d'import. + + Args: + configuration (UserCollectionImportConfiguration): Configuration des chemins et tailles. + + Returns: + None: Le constructeur ne retourne aucune valeur. + """ + + self.configuration = configuration + + def validate_source_file( + self, + source_file_path: Path, + original_filename: str | None, + reader: CollectionFileReader, + ) -> None: + """Valide l'extension et la taille du fichier source. + + Args: + source_file_path (Path): Chemin du fichier a controler. + original_filename (str | None): Nom original transmis par le navigateur. + reader (CollectionFileReader): Lecteur attendu pour le type de fichier. + + Returns: + None: La methode ne retourne aucune valeur. + + Raises: + UserCollectionImportInvalidFileError: Si l'extension ou la lecture est invalide. + UserCollectionImportTooLargeError: Si la taille maximale est depassee. + """ + + checked_filename = original_filename or source_file_path.name + if not self.has_accepted_extension(checked_filename, reader.accepted_extensions): + accepted_extensions = ", ".join(reader.accepted_extensions) + raise UserCollectionImportInvalidFileError( + f"Le fichier doit utiliser une extension acceptee: {accepted_extensions}." + ) + try: + file_size = source_file_path.stat().st_size + except OSError as exc: + raise UserCollectionImportInvalidFileError("Le fichier source est illisible.") from exc + if file_size > self.configuration.max_upload_bytes: + raise UserCollectionImportTooLargeError("Le fichier depasse la taille maximale.") + + def copy_file(self, source_file_path: Path, target_file_path: Path) -> Path: + """Copie un fichier d'import et applique les droits attendus. + + Args: + source_file_path (Path): Fichier source. + target_file_path (Path): Destination finale. + + Returns: + Path: Chemin du fichier copie. + + Raises: + UserCollectionImportUnexpectedFileError: Si la copie echoue. + """ + + try: + target_file_path.parent.mkdir(parents=True, exist_ok=True) + target_file_path.unlink(missing_ok=True) + shutil.copyfile(source_file_path, target_file_path) + target_file_path.chmod(0o750) + except OSError as exc: + self.delete_copied_file(target_file_path) + raise UserCollectionImportUnexpectedError( + "Impossible de copier le fichier." + ) from exc + return target_file_path + + def target_file_path( + self, + user_id: int, + original_filename: str | None, + reader: CollectionFileReader, + ) -> Path: + """Construit le chemin du fichier conserve pour l'utilisateur. + + Args: + user_id (int): Identifiant utilisateur. + original_filename (str | None): Nom original du fichier. + reader (CollectionFileReader): Lecteur attendu. + + Returns: + Path: Chemin cible dans le workspace utilisateur. + """ + + workspace_directory = self.configuration.ensure_workspace_directory() + extension = self.validated_extension(original_filename, reader.accepted_extensions) + return workspace_directory / str(user_id) / f"{user_id}-collection{extension}" + + def temporary_file_path(self, user_id: int, reader: CollectionFileReader) -> Path: + """Construit le chemin du fichier temporaire d'import. + + Args: + user_id (int): Identifiant utilisateur. + reader (CollectionFileReader): Lecteur attendu. + + Returns: + Path: Chemin du fichier temporaire. + """ + + workspace_directory = self.configuration.ensure_workspace_directory() + return workspace_directory / str(user_id) / f"current-import{reader.accepted_extensions[0]}" + + def ensure_temporary_file_exists(self, temporary_file_path: Path) -> None: + """Verifie que le fichier temporaire d'import existe. + + Args: + temporary_file_path (Path): Chemin temporaire attendu. + + Returns: + None: La methode ne retourne aucune valeur. + + Raises: + UserCollectionImportTemporaryFileMissingError: Si le fichier est absent. + """ + + if not temporary_file_path.exists(): + raise UserCollectionImportTemporaryFileMissingError( + "Fichier temporaire introuvable." + ) + + def has_accepted_extension( + self, + filename: str, + accepted_extensions: tuple[str, ...], + ) -> bool: + """Indique si un nom de fichier utilise une extension acceptee. + + Args: + filename (str): Nom a verifier. + accepted_extensions (tuple[str, ...]): Extensions autorisees. + + Returns: + bool: `True` quand une extension attendue est trouvee. + """ + + return self.validated_extension(filename, accepted_extensions) is not None + + def validated_extension( + self, + filename: str | None, + accepted_extensions: tuple[str, ...], + ) -> str | None: + """Retourne l'extension acceptee trouvee dans un nom de fichier. + + Args: + filename (str | None): Nom a verifier. + accepted_extensions (tuple[str, ...]): Extensions autorisees. + + Returns: + str | None: Extension acceptee ou `None`. + """ + + checked_filename = str(filename or "").lower().strip() + for extension in accepted_extensions: + if checked_filename.endswith(extension): + return extension + return None + + def delete_copied_file(self, copied_file_path: Path | None) -> None: + """Supprime un fichier copie si son chemin existe. + + Args: + copied_file_path (Path | None): Chemin a supprimer. + + Returns: + None: La methode ignore les erreurs de suppression. + """ + + if copied_file_path is None: + return + try: + copied_file_path.unlink(missing_ok=True) + except OSError: + pass diff --git a/backend/services/users/user_collection_import_result.py b/backend/services/users/user_collection_import_result.py index 5334350..8438717 100644 --- a/backend/services/users/user_collection_import_result.py +++ b/backend/services/users/user_collection_import_result.py @@ -25,6 +25,7 @@ class UserCollectionImportResult: associated_games (int): Nombre de jeux associes a l'utilisateur. wishlisted_games (int): Nombre de jeux importes comme souhaits. warnings (dict): Avertissements fonctionnels de l'import. + refusal (dict | None): Decision de refus global du fichier. """ linked_platforms: int @@ -33,6 +34,7 @@ class UserCollectionImportResult: associated_games: int wishlisted_games: int = 0 warnings: dict | None = None + refusal: dict | None = None def to_dict(self) -> dict[str, int | dict]: """Convertit le resultat en dictionnaire serialisable. @@ -59,4 +61,11 @@ def to_dict(self) -> dict[str, int | dict]: "skipped_games": [], "total_import_duration_seconds": 0.0, }, + "refusal": self.refusal or { + "refused": False, + "reason": "", + "invalid_games_count": 0, + "total_games_count": 0, + "message": "", + }, } diff --git a/backend/services/users/user_collection_import_service.py b/backend/services/users/user_collection_import_service.py index 8308db9..52a5fe5 100644 --- a/backend/services/users/user_collection_import_service.py +++ b/backend/services/users/user_collection_import_service.py @@ -12,7 +12,6 @@ # Description : service metier d'import de collection utilisateur. import logging -import shutil from time import perf_counter from pathlib import Path from threading import Lock @@ -22,11 +21,13 @@ CollectionFileDescriptionValidationError, CollectionImportFailureAdminNotifier, CollectionImportFailureNotificationService, - CollectionFileReader, CollectionFileReaderFactory, CollectionFileReadError, CollectionFileValidationError, CollectionImportData, + CollectionImportRefusalAdminNotifier, + CollectionImportRefusalNotificationService, + CollectionImportRefusalPolicy, ) from services.database.user_collection_import_persistence_result import ( UserCollectionImportPersistenceResult, @@ -40,6 +41,15 @@ from .user_collection_import_admin_notifier import UserCollectionImportAdminNotifier from services.collection.imports import CollectionImportDateValidator from .user_collection_import_configuration import UserCollectionImportConfiguration +from .user_collection_import_errors import ( + UserCollectionImportError, + UserCollectionImportInvalidFileError, + UserCollectionImportNotFoundError, + UserCollectionImportTemporaryFileMissingError, + UserCollectionImportTooLargeError, + UserCollectionImportUnexpectedError, +) +from .user_collection_import_file_manager import UserCollectionImportFileManager from .user_collection_import_report_notifier import UserCollectionImportReportNotifier from .user_collection_import_repository_protocol import UserCollectionImportRepository from .user_collection_import_report_context import UserCollectionImportReportContext @@ -48,44 +58,6 @@ from .user_collection_import_timer import UserCollectionImportTimer -class UserCollectionImportError(Exception): - """Classe de base des erreurs metier d'import de collection utilisateur.""" - - -class UserCollectionImportInvalidFileError(UserCollectionImportError): - """Signale qu'un fichier d'import est invalide ou illisible.""" - - def __init__(self, message: str, details: list[str] | None = None): - """Initialise l'erreur de fichier invalide. - - Args: - message (str): Message fonctionnel principal. - details (list[str] | None): Raisons techniques affichables. - - Returns: - None: Le constructeur ne retourne aucune valeur. - """ - - self.details = details or [message] - super().__init__(message) - - -class UserCollectionImportTooLargeError(UserCollectionImportError): - """Signale qu'un fichier d'import depasse la taille maximale autorisee.""" - - -class UserCollectionImportTemporaryFileMissingError(UserCollectionImportError): - """Signale que le fichier temporaire d'import est absent.""" - - -class UserCollectionImportNotFoundError(UserCollectionImportError): - """Signale qu'aucune collection utilisateur ne peut etre reinitialisee.""" - - -class UserCollectionImportUnexpectedError(UserCollectionImportError): - """Signale une erreur non fonctionnelle pendant l'import.""" - - class UserCollectionImportService: """Orchestre l'import complet d'une collection utilisateur.""" @@ -100,6 +72,7 @@ def __init__( date_validator: CollectionImportDateValidator | None = None, report_notifier: UserCollectionImportReportNotifier | None = None, failure_notifier=None, + refusal_notifier=None, logger=None, ): """Initialise le service d'import de collection. @@ -111,6 +84,7 @@ def __init__( date_validator (CollectionImportDateValidator | None): Validateur des dates lues. report_notifier (UserCollectionImportReportNotifier | None): Notifier admin. failure_notifier (object | None): Notifier admin des echecs d'import. + refusal_notifier (object | None): Notifier admin des refus d'import. logger (object | None): Logger injectable. Returns: @@ -120,11 +94,15 @@ def __init__( self.configuration = configuration self.repository = repository self.reader_factory = reader_factory + self.file_manager = UserCollectionImportFileManager(configuration) self.date_validator = date_validator or CollectionImportDateValidator() self.report_notifier = report_notifier or UserCollectionImportAdminNotifier() self.failure_notifier = failure_notifier or CollectionImportFailureAdminNotifier() + self.refusal_notifier = refusal_notifier or CollectionImportRefusalAdminNotifier() self.failure_notification_service = CollectionImportFailureNotificationService() + self.refusal_notification_service = CollectionImportRefusalNotificationService() self.report_policy = UserCollectionImportReportPolicy() + self.refusal_policy = CollectionImportRefusalPolicy() self.logger = logger or logging.getLogger(__name__) def upload_import_file( @@ -154,8 +132,11 @@ def upload_import_file( with user_lock: reader = self.reader_factory.create(file_type) source_path = Path(source_file_path) - self._validate_source_file(source_path, original_filename, reader) - self._copy_file(source_path, self._temporary_file_path(user_id, reader)) + self.file_manager.validate_source_file(source_path, original_filename, reader) + self.file_manager.copy_file( + source_path, + self.file_manager.temporary_file_path(user_id, reader), + ) def analyze_import_file(self, user_id: int, file_type) -> list[str]: """Analyse le fichier temporaire et retourne ses onglets. @@ -173,8 +154,8 @@ def analyze_import_file(self, user_id: int, file_type) -> list[str]: """ reader = self.reader_factory.create(file_type) - temporary_file_path = self._temporary_file_path(user_id, reader) - self._ensure_temporary_file_exists(temporary_file_path) + temporary_file_path = self.file_manager.temporary_file_path(user_id, reader) + self.file_manager.ensure_temporary_file_exists(temporary_file_path) try: return reader.analyze_sheets(str(temporary_file_path)) except (CollectionFileReadError, CollectionFileValidationError) as exc: @@ -209,8 +190,8 @@ def import_collection_from_temporary_file( ["collection_file_description est requis."] ) reader = self.reader_factory.create(file_description.file_type) - temporary_file_path = self._temporary_file_path(user_id, reader) - self._ensure_temporary_file_exists(temporary_file_path) + temporary_file_path = self.file_manager.temporary_file_path(user_id, reader) + self.file_manager.ensure_temporary_file_exists(temporary_file_path) result = self.import_collection( user_id, str(temporary_file_path), @@ -221,7 +202,7 @@ def import_collection_from_temporary_file( "UserCollectionImportService.import_collection_from_temporary_file" ), ) - self._delete_copied_file(temporary_file_path) + self.file_manager.delete_copied_file(temporary_file_path) return result def import_collection( @@ -260,16 +241,19 @@ def import_collection( Path(source_file_path), original_filename, file_description, + requester_email, ) except Exception as exc: - self._notify_import_failure( + self.failure_notification_service.notify_failure( + self.failure_notifier, + self.logger, exc, - import_kind="collection_utilisateur", - initiated_by_function=initiated_by_function, - requester_user_id=user_id, - requester_email=requester_email, - file_type=self._failure_file_type(file_description), - original_filename=original_filename or Path(source_file_path).name, + "collection_utilisateur", + initiated_by_function, + user_id, + requester_email, + self._failure_file_type(file_description), + original_filename or Path(source_file_path).name, ) raise @@ -302,6 +286,7 @@ def _import_collection_locked( source_file_path: Path, original_filename: str | None, file_description: CollectionFileDescription | None, + requester_email: str = "", ) -> UserCollectionImportResult: if file_description is None: raise CollectionFileDescriptionValidationError( @@ -314,21 +299,26 @@ def _import_collection_locked( file_description, True, GAME_STATUS_WAITING_VALIDATION, + requester_email, ) def _import_collection_file( self, user_id: int, source_file_path: Path, original_filename: str | None, file_description: CollectionFileDescription, copy_to_workspace: bool, - initial_game_validation_status: str, + initial_game_validation_status: str, requester_email: str = "", ) -> UserCollectionImportResult: import_started_at = perf_counter() reader = self.reader_factory.create(file_description.file_type) - self._validate_source_file(source_file_path, original_filename, reader) + self.file_manager.validate_source_file(source_file_path, original_filename, reader) import_file_path = source_file_path copied_file_path = None if copy_to_workspace: - target_file_path = self._target_file_path(user_id, original_filename or source_file_path.name, reader) - copied_file_path = self._copy_file(source_file_path, target_file_path) + target_file_path = self.file_manager.target_file_path( + user_id, + original_filename or source_file_path.name, + reader, + ) + copied_file_path = self.file_manager.copy_file(source_file_path, target_file_path) import_file_path = copied_file_path try: file_read_started_at = perf_counter() @@ -337,6 +327,23 @@ def _import_collection_file( file_read_started_at ) import_data = self.date_validator.validate(import_data) + self._set_total_import_duration(import_data, import_started_at) + refusal = self.refusal_policy.evaluate(import_data) + if refusal.refused: + self.file_manager.delete_copied_file(copied_file_path) + refusal_payload = refusal.to_dict() + self.refusal_notification_service.notify_refusal( + self.refusal_notifier, + self.logger, + "collection_utilisateur", + user_id, + requester_email, + str(file_description.file_type.value), + original_filename or source_file_path.name, + refusal_payload, + import_data, + ) + return self._map_refused_result(import_data, refusal_payload) persistence_result = self.repository.import_collection( user_id, str(import_file_path), @@ -344,7 +351,6 @@ def _import_collection_file( file_description.to_dict(), initial_game_validation_status, ) - self._set_total_import_duration(import_data, import_started_at) result = self._map_result(persistence_result, import_data) if self.report_policy.is_enabled(self.report_notifier): self._notify_import_report( @@ -361,97 +367,21 @@ def _import_collection_file( ) return result except CollectionFileDescriptionValidationError: - self._delete_copied_file(copied_file_path) + self.file_manager.delete_copied_file(copied_file_path) raise except (CollectionFileReadError, CollectionFileValidationError) as exc: - self._delete_copied_file(copied_file_path) + self.file_manager.delete_copied_file(copied_file_path) raise UserCollectionImportInvalidFileError( "Fichier de collection invalide.", self._import_invalid_file_details(exc), ) from exc except UserCollectionImportUserNotFoundError as exc: - self._delete_copied_file(copied_file_path) + self.file_manager.delete_copied_file(copied_file_path) raise UserCollectionImportUnexpectedError("Utilisateur introuvable.") from exc except Exception as exc: - self._delete_copied_file(copied_file_path) + self.file_manager.delete_copied_file(copied_file_path) raise UserCollectionImportUnexpectedError("Erreur pendant l'import.") from exc - def _validate_source_file( - self, - source_file_path: Path, - original_filename: str | None, - reader: CollectionFileReader, - ) -> None: - checked_filename = original_filename or source_file_path.name - if not self._has_accepted_extension(checked_filename, reader.accepted_extensions): - accepted_extensions = ", ".join(reader.accepted_extensions) - raise UserCollectionImportInvalidFileError( - f"Le fichier doit utiliser une extension acceptee: {accepted_extensions}." - ) - try: - file_size = source_file_path.stat().st_size - except OSError as exc: - raise UserCollectionImportInvalidFileError("Le fichier source est illisible.") from exc - if file_size > self.configuration.max_upload_bytes: - raise UserCollectionImportTooLargeError("Le fichier depasse la taille maximale.") - - def _copy_file(self, source_file_path: Path, target_file_path: Path) -> Path: - try: - target_file_path.parent.mkdir(parents=True, exist_ok=True) - target_file_path.unlink(missing_ok=True) - shutil.copyfile(source_file_path, target_file_path) - target_file_path.chmod(0o750) - except OSError as exc: - self._delete_copied_file(target_file_path) - raise UserCollectionImportUnexpectedError("Impossible de copier le fichier.") from exc - return target_file_path - - def _target_file_path( - self, - user_id: int, - original_filename: str | None, - reader: CollectionFileReader, - ) -> Path: - workspace_directory = self.configuration.ensure_workspace_directory() - extension = self._validated_extension(original_filename, reader.accepted_extensions) - return workspace_directory / str(user_id) / f"{user_id}-collection{extension}" - - def _temporary_file_path(self, user_id: int, reader: CollectionFileReader) -> Path: - workspace_directory = self.configuration.ensure_workspace_directory() - return workspace_directory / str(user_id) / f"current-import{reader.accepted_extensions[0]}" - - def _ensure_temporary_file_exists(self, temporary_file_path: Path) -> None: - if not temporary_file_path.exists(): - raise UserCollectionImportTemporaryFileMissingError( - "Fichier temporaire introuvable." - ) - - def _has_accepted_extension( - self, - filename: str, - accepted_extensions: tuple[str, ...], - ) -> bool: - return self._validated_extension(filename, accepted_extensions) is not None - - def _validated_extension( - self, - filename: str | None, - accepted_extensions: tuple[str, ...], - ) -> str | None: - checked_filename = str(filename or "").lower().strip() - for extension in accepted_extensions: - if checked_filename.endswith(extension): - return extension - return None - - def _delete_copied_file(self, copied_file_path: Path | None) -> None: - if copied_file_path is None: - return - try: - copied_file_path.unlink(missing_ok=True) - except OSError: - pass - def _import_invalid_file_details(self, error: Exception) -> list[str]: messages = [str(error).strip()] cause = getattr(error, "__cause__", None) @@ -473,6 +403,28 @@ def _map_result( associated_games=persistence_result.associated_games, wishlisted_games=sum(1 for game in import_data.games if game.wishlist), warnings=import_data.warnings.to_dict(), + refusal={ + "refused": False, + "reason": "", + "invalid_games_count": len(import_data.warnings.invalid_games), + "total_games_count": len(import_data.games), + "message": "", + }, + ) + + def _map_refused_result( + self, + import_data: CollectionImportData, + refusal: dict, + ) -> UserCollectionImportResult: + return UserCollectionImportResult( + linked_platforms=0, + created_studios=0, + created_games=0, + associated_games=0, + wishlisted_games=0, + warnings=import_data.warnings.to_dict(), + refusal=refusal, ) def _build_import_report_context( @@ -516,28 +468,6 @@ def _notify_import_report(self, context: UserCollectionImportReportContext) -> N except Exception: self.logger.exception("Impossible d'envoyer le rapport d'import utilisateur.") - def _notify_import_failure( - self, - error: Exception, - import_kind: str, - initiated_by_function: str, - requester_user_id: int | None, - requester_email: str, - file_type: str, - original_filename: str, - ) -> None: - self.failure_notification_service.notify_failure( - self.failure_notifier, - self.logger, - error, - import_kind, - initiated_by_function, - requester_user_id, - requester_email, - file_type, - original_filename, - ) - def _failure_file_type(self, file_description: CollectionFileDescription | None) -> str: if file_description is None: return "" diff --git a/backend/tests/by_module/services/collection/imports/test_collection_import_refusal_admin_notifier.py b/backend/tests/by_module/services/collection/imports/test_collection_import_refusal_admin_notifier.py new file mode 100644 index 0000000..97e4e5b --- /dev/null +++ b/backend/tests/by_module/services/collection/imports/test_collection_import_refusal_admin_notifier.py @@ -0,0 +1,114 @@ +# ____ _ _ ____ _ _ _ _ ___ +# / ___| | ___ _ _ __| |/ ___|___ | | | ___ ___| |_(_) ___ _ __ / _ \ _ __ _ __ +# | | | |/ _ \| | | |/ _` | | / _ \| | |/ _ \/ __| __| |/ _ \| `_ \| | | | `_ \| `_ | +# | |___| | (_) | |_| | (_| | |__| (_) | | | __/ (__| |_| | (_) | | | | |_| | |_) | |_) | +# \____|_|\___/ \__,_|\__,_|\____\___|_|_|\___|\___|\__|_|\___/|_| |_|\___/|_| |_|\___/ +# Projet : CloudCollectionApp +# Date de creation : 2026-08-11 +# Auteurs : OpenAI ChatGPT, Codex, Binda Sébastien +# Licence : Apache 2.0 +# +# Description : tests de notification administrateur des imports refuses. + +import sys +import unittest +from pathlib import Path + +sys.path.insert(0, str(next(parent for parent in Path(__file__).resolve().parents if (parent / "app.py").exists()))) + +from services.collection.imports import ( # noqa: E402 + CollectionImportData, + CollectionImportGame, + CollectionImportPlatform, + CollectionImportRefusalAdminNotifier, + CollectionImportRefusalContext, + CollectionImportWarnings, +) +from tests.support.fake_platform_matching_email_sender import ( # noqa: E402 + FakePlatformMatchingEmailSender, +) + + +class CollectionImportRefusalAdminNotifierTest(unittest.TestCase): + """Valide l'email administrateur des imports refuses.""" + + def test_notify_import_refusal_uses_backend_resource_template(self): + """Verifie le rendu HTML depuis le template de ressources. + + Args: + Aucun. + + Returns: + None: Les assertions valident l'email rendu. + """ + + sender = FakePlatformMatchingEmailSender() + notifier = CollectionImportRefusalAdminNotifier(sender, "admin@example.com") + + notifier.notify_import_refusal( + CollectionImportRefusalContext( + import_kind="collection_utilisateur", + requester_user_id=7, + requester_email="user@example.com", + file_type="csv", + original_filename="collection .csv", + refusal={ + "refused": True, + "reason": "too_many_invalid_games", + "invalid_games_count": 2, + "total_games_count": 3, + "message": "Import refuse car 2/3 jeux contiennent une erreur.", + }, + import_data=CollectionImportData( + platforms=[CollectionImportPlatform("Switch")], + studios=[], + games=[ + CollectionImportGame("Zelda", "Switch", None, None), + CollectionImportGame("Mario", "Switch", None, None), + CollectionImportGame("Metroid", "Switch", None, None), + ], + warnings=CollectionImportWarnings( + invalid_games=[ + { + "name": "Zelda ", + "invalid_fields": [ + {"field": "release_date", "value": "1900-01-01"} + ], + }, + {"name": "Mario", "invalid_fields": [{"field": "condition"}]}, + ], + ), + ), + ) + ) + + self.assertEqual(1, len(sender.sent_emails)) + email = sender.sent_emails[0] + self.assertEqual("admin@example.com", email["recipient_email"]) + self.assertEqual("Import refuse - collection_utilisateur", email["subject"]) + self.assertEqual("html", email["content_subtype"]) + self.assertIn("

Import refuse

", email["body"]) + self.assertIn("collection <bad>.csv", email["body"]) + self.assertIn("too_many_invalid_games", email["body"]) + self.assertIn("2/3", email["body"]) + self.assertIn("Zelda <DX>", email["body"]) + self.assertIn("release_date: 1900-01-01", email["body"]) + + def test_default_template_path_targets_backend_resource(self): + """Verifie le nom du template par defaut. + + Args: + Aucun. + + Returns: + None: Les assertions valident la ressource utilisee. + """ + + template_path = CollectionImportRefusalAdminNotifier.default_template_path() + + self.assertEqual("collection_import_refusal_email_template.txt", template_path.name) + self.assertTrue(template_path.exists()) + + +if __name__ == "__main__": + unittest.main() diff --git a/backend/tests/by_module/services/collection/imports/test_collection_import_refusal_service_notifications.py b/backend/tests/by_module/services/collection/imports/test_collection_import_refusal_service_notifications.py new file mode 100644 index 0000000..07c1170 --- /dev/null +++ b/backend/tests/by_module/services/collection/imports/test_collection_import_refusal_service_notifications.py @@ -0,0 +1,245 @@ +# ____ _ _ ____ _ _ _ _ ___ +# / ___| | ___ _ _ __| |/ ___|___ | | | ___ ___| |_(_) ___ _ __ / _ \ _ __ _ __ +# | | | |/ _ \| | | |/ _` | | / _ \| | |/ _ \/ __| __| |/ _ \| `_ \| | | | `_ \| `_ | +# | |___| | (_) | |_| | (_| | |__| (_) | | | __/ (__| |_| | (_) | | | | |_| | |_) | |_) | +# \____|_|\___/ \__,_|\__,_|\____\___|_|_|\___|\___|\__|_|\___/|_| |_|\___/|_| |_|\___/ +# Projet : CloudCollectionApp +# Date de creation : 2026-08-11 +# Auteurs : OpenAI ChatGPT, Codex, Binda Sébastien +# Licence : Apache 2.0 +# +# Description : tests des notifications de refus envoyees par les services d'import. + +import sys +import tempfile +import unittest +from pathlib import Path + +sys.path.insert(0, str(next(parent for parent in Path(__file__).resolve().parents if (parent / "app.py").exists()))) + +from services.collection.imports import ( # noqa: E402 + CollectionCsvConfiguration, + CollectionFileDescription, + CollectionFileType, + CollectionImportData, + CollectionImportField, + CollectionImportGame, + CollectionImportPlatform, + CollectionImportWarnings, + WishlistImportConfiguration, +) +from services.database.admin_library_import_repository import ( # noqa: E402 + AdminLibraryImportPersistenceResult, +) +from services.database.user_collection_import_persistence_result import ( # noqa: E402 + UserCollectionImportPersistenceResult, +) +from services.library.admin_library_import_service import AdminLibraryImportService # noqa: E402 +from services.users.user_collection_import_configuration import ( # noqa: E402 + UserCollectionImportConfiguration, +) +from services.users.user_collection_import_service import UserCollectionImportService # noqa: E402 + + +class FakeImportRefusalNotifier: + """Capture les notifications de refus d'import.""" + + def __init__(self): + """Initialise le notifier factice.""" + + self.contexts = [] + + def notify_import_refusal(self, context): + """Memorise le contexte de refus.""" + + self.contexts.append(context) + + +class FakeCollectionReader: + """Retourne des donnees d'import factices en erreur.""" + + accepted_extensions = (".csv",) + + def __init__(self, import_data): + """Initialise le lecteur avec ses donnees.""" + + self.import_data = import_data + + def analyze_sheets(self, file_path): + """Retourne des colonnes CSV factices.""" + + return ["Jeu", "Plateforme"] + + def read(self, file_path, description): + """Retourne les donnees configurees.""" + + return self.import_data + + +class FakeReaderFactory: + """Retourne toujours le lecteur configure.""" + + def __init__(self, reader): + """Initialise la factory de lecteur.""" + + self.reader = reader + + def create(self, file_type): + """Retourne le lecteur configure.""" + + return self.reader + + +class FakeUserRepository: + """Capture les appels de persistance utilisateur.""" + + def __init__(self): + """Initialise le repository factice.""" + + self.import_calls = [] + + def import_collection( + self, + user_id, + collection_file_path, + import_data, + collection_file_description, + initial_game_validation_status, + ): + """Capture l'appel de persistance.""" + + self.import_calls.append(import_data) + return UserCollectionImportPersistenceResult(1, 1, 1, 1) + + +class FakeAdminRepository: + """Capture les appels de persistance admin.""" + + def __init__(self): + """Initialise le repository factice.""" + + self.import_calls = [] + + def import_library(self, import_data): + """Capture l'appel de persistance.""" + + self.import_calls.append(import_data) + return AdminLibraryImportPersistenceResult(1, 1, 1) + + +class FakeAdminConfigurationLoader: + """Retourne une description CSV minimale.""" + + def load_for_columns(self, columns): + """Construit une description CSV valide.""" + + return CollectionFileDescription( + file_type=CollectionFileType.CSV, + wishlist=WishlistImportConfiguration.none(), + csv_conf=CollectionCsvConfiguration( + { + CollectionImportField.NAME: "Jeu", + CollectionImportField.PLATFORM: "Plateforme", + } + ), + ) + + +class CollectionImportRefusalServiceNotificationsTest(unittest.TestCase): + """Valide les notifications de refus emises par les services.""" + + def test_user_import_refusal_notifies_admin(self): + """Verifie le contexte du mail de refus utilisateur.""" + + import_data = self._refused_import_data() + with tempfile.TemporaryDirectory() as directory: + source_file = Path(directory) / "collection.csv" + source_file.write_text("Jeu,Plateforme\n", encoding="utf-8") + notifier = FakeImportRefusalNotifier() + repository = FakeUserRepository() + service = UserCollectionImportService( + UserCollectionImportConfiguration( + str(Path(directory) / "workspace"), + UserCollectionImportConfiguration.DEFAULT_MAX_UPLOAD_BYTES, + ), + repository, + FakeReaderFactory(FakeCollectionReader(import_data)), + refusal_notifier=notifier, + ) + + service.import_collection( + 7, + str(source_file), + "collection.csv", + CollectionFileDescription( + file_type=CollectionFileType.CSV, + wishlist=WishlistImportConfiguration.none(), + csv_conf=CollectionCsvConfiguration( + { + CollectionImportField.NAME: "A", + CollectionImportField.PLATFORM: "B", + } + ), + ), + requester_email="user@example.com", + ) + + self.assertEqual([], repository.import_calls) + self.assertEqual(1, len(notifier.contexts)) + context = notifier.contexts[0] + self.assertEqual("collection_utilisateur", context.import_kind) + self.assertEqual(7, context.requester_user_id) + self.assertEqual("user@example.com", context.requester_email) + self.assertEqual("collection.csv", context.original_filename) + self.assertEqual("too_many_invalid_games", context.refusal["reason"]) + self.assertEqual(import_data.warnings, context.import_data.warnings) + + def test_admin_import_refusal_notifies_admin(self): + """Verifie le contexte du mail de refus admin CSV.""" + + import_data = self._refused_import_data() + repository = FakeAdminRepository() + notifier = FakeImportRefusalNotifier() + service = AdminLibraryImportService( + repository, + FakeCollectionReader(import_data), + FakeAdminConfigurationLoader(), + refusal_notifier=notifier, + ) + + service.import_csv_file( + "/tmp/admin.csv", + "admin.csv", + requester_email="admin@example.com", + ) + + self.assertEqual([], repository.import_calls) + self.assertEqual(1, len(notifier.contexts)) + context = notifier.contexts[0] + self.assertEqual("bibliotheque_admin_csv", context.import_kind) + self.assertIsNone(context.requester_user_id) + self.assertEqual("admin@example.com", context.requester_email) + self.assertEqual("admin.csv", context.original_filename) + self.assertEqual("too_many_invalid_games", context.refusal["reason"]) + self.assertEqual(import_data.warnings, context.import_data.warnings) + + def _refused_import_data(self): + return CollectionImportData( + platforms=[CollectionImportPlatform("Switch")], + studios=[], + games=[ + CollectionImportGame("Zelda", "Switch", None, None), + CollectionImportGame("Mario", "Switch", None, None), + CollectionImportGame("Metroid", "Switch", None, None), + ], + warnings=CollectionImportWarnings( + invalid_games=[ + {"name": "Zelda", "invalid_fields": [{"field": "release_date"}]}, + {"name": "Mario", "invalid_fields": [{"field": "release_date"}]}, + ] + ), + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/backend/tests/by_module/services/library/test_admin_library_import_service.py b/backend/tests/by_module/services/library/test_admin_library_import_service.py index bb8bc36..1c700b1 100644 --- a/backend/tests/by_module/services/library/test_admin_library_import_service.py +++ b/backend/tests/by_module/services/library/test_admin_library_import_service.py @@ -29,6 +29,7 @@ CollectionImportGame, CollectionImportPlatform, CollectionImportStudio, + CollectionImportWarnings, WishlistImportConfiguration, ) from services.database.admin_library_import_repository import ( # noqa: E402 @@ -49,16 +50,17 @@ class FakeAdminLibraryImportReader: accepted_extensions = (".csv",) - def __init__(self): + def __init__(self, import_data=None): """Initialise le lecteur factice. Args: - Aucun. + import_data (CollectionImportData | None): Donnees retournees. Returns: None: Le constructeur ne retourne aucune valeur. """ + self.import_data = import_data self.analyze_paths = [] self.read_calls = [] @@ -87,7 +89,7 @@ def read(self, file_path, description): """ self.read_calls.append((file_path, description)) - return CollectionImportData( + return self.import_data or CollectionImportData( platforms=[CollectionImportPlatform("Switch")], studios=[CollectionImportStudio("Nintendo")], games=[CollectionImportGame("Zelda", "Switch", "Nintendo", None)], @@ -256,6 +258,48 @@ def test_import_csv_file_rejects_non_csv_extension(self): self.assertEqual([], reader.analyze_paths) self.assertEqual([], repository.import_calls) + def test_import_csv_file_refuses_when_more_than_half_games_have_errors(self): + """Verifie le refus sans persistance quand le CSV contient trop d'erreurs. + + Args: + Aucun. + + Returns: + None: Les assertions valident le resume de refus. + """ + + import_data = CollectionImportData( + platforms=[CollectionImportPlatform("Switch")], + studios=[], + games=[ + CollectionImportGame("Zelda", "Switch", None, None), + CollectionImportGame("Mario", "Switch", None, None), + CollectionImportGame("Metroid", "Switch", None, None), + ], + warnings=CollectionImportWarnings( + invalid_games=[ + {"name": "Zelda", "invalid_fields": [{"field": "release_date"}]}, + {"name": "Mario", "invalid_fields": [{"field": "release_date"}]}, + ] + ), + ) + repository = FakeAdminLibraryImportRepository() + service = AdminLibraryImportService( + repository, + FakeAdminLibraryImportReader(import_data), + FakeAdminLibraryImportConfigurationLoader(), + ) + + result = service.import_csv_file("/tmp/import.csv", "admin.csv") + + self.assertEqual([], repository.import_calls) + self.assertEqual(0, result.created_games) + self.assertTrue(result.refusal["refused"]) + self.assertEqual("too_many_invalid_games", result.refusal["reason"]) + self.assertEqual(2, result.refusal["invalid_games_count"]) + self.assertEqual(3, result.refusal["total_games_count"]) + self.assertIn("2/3", result.refusal["message"]) + def test_import_csv_file_exposes_configuration_errors(self): """Verifie la propagation des erreurs de configuration admin. diff --git a/backend/tests/by_module/services/users/test_user_collection_import_core_factorization.py b/backend/tests/by_module/services/users/test_user_collection_import_core_factorization.py index 0450223..fc5ed12 100644 --- a/backend/tests/by_module/services/users/test_user_collection_import_core_factorization.py +++ b/backend/tests/by_module/services/users/test_user_collection_import_core_factorization.py @@ -48,6 +48,7 @@ def _import_collection_file( file_description, copy_to_workspace, initial_game_validation_status, + requester_email="", ): """Enregistre les arguments recus par le coeur centralise. @@ -58,6 +59,7 @@ def _import_collection_file( file_description (object): Description d'import. copy_to_workspace (bool): Mode de copie demande. initial_game_validation_status (str): Statut des jeux crees. + requester_email (str): Email utilisateur transmis. Returns: UserCollectionImportResult: Resultat factice. @@ -70,6 +72,7 @@ def _import_collection_file( file_description, copy_to_workspace, initial_game_validation_status, + requester_email, ) return UserCollectionImportResult(0, 0, 0, 0) diff --git a/backend/tests/by_module/services/users/test_user_collection_import_service.py b/backend/tests/by_module/services/users/test_user_collection_import_service.py index 52f0f16..e036d7d 100644 --- a/backend/tests/by_module/services/users/test_user_collection_import_service.py +++ b/backend/tests/by_module/services/users/test_user_collection_import_service.py @@ -28,6 +28,7 @@ CollectionFileDescription, CollectionFileType, CollectionImportField, + CollectionImportWarnings, CollectionSheetLayout, ) from services.ods import ( @@ -523,6 +524,55 @@ def test_import_collection_accepts_existing_collection(self): self.assertEqual(1, len(repository.import_calls)) self.assertEqual(1, len(reader.read_paths)) + def test_import_collection_refuses_file_when_more_than_half_games_have_errors(self): + """Verifie le refus sans persistance quand trop de jeux ont des erreurs. + + Args: + Aucun. + + Returns: + None: Les assertions valident le payload de refus. + """ + + import_data = OdsCollectionImportData( + platforms=[OdsCollectionImportPlatform("Switch")], + studios=[], + games=[ + OdsCollectionImportGame("Zelda", "Switch", None, None), + OdsCollectionImportGame("Mario", "Switch", None, None), + OdsCollectionImportGame("Metroid", "Switch", None, None), + ], + warnings=CollectionImportWarnings( + invalid_games=[ + {"name": "Zelda", "invalid_fields": [{"field": "release_date"}]}, + {"name": "Mario", "invalid_fields": [{"field": "release_date"}]}, + ] + ), + ) + with tempfile.TemporaryDirectory() as directory: + service, repository, reader, source_file = self._build_service( + directory, + reader=FakeOdsCollectionImportReader(import_data=import_data), + ) + + result = service.import_collection( + 7, + str(source_file), + "collection.ods", + self._valid_description(), + ) + + target_file = Path(directory) / "workspace" / "7" / "7-collection.ods" + self.assertFalse(target_file.exists()) + self.assertEqual([], repository.import_calls) + self.assertEqual(1, len(reader.read_paths)) + self.assertEqual(0, result.associated_games) + self.assertTrue(result.refusal["refused"]) + self.assertEqual("too_many_invalid_games", result.refusal["reason"]) + self.assertEqual(2, result.refusal["invalid_games_count"]) + self.assertEqual(3, result.refusal["total_games_count"]) + self.assertIn("2/3", result.refusal["message"]) + def test_import_collection_replaces_read_only_collection_file(self): """Verifie le remplacement du fichier collection deja verrouille. diff --git a/frontend/src/components/AdminLibraryImportView.jsx b/frontend/src/components/AdminLibraryImportView.jsx index 17125d5..c9a879a 100644 --- a/frontend/src/components/AdminLibraryImportView.jsx +++ b/frontend/src/components/AdminLibraryImportView.jsx @@ -45,9 +45,11 @@ function AdminLibraryImportView({ onOpenLibrary, onOpenStatistics, onOpenWishlist, + onPrepareNewImportAfterRefusal, onSelectAdminLibraryImportFile, selectedAdminLibraryImportFileName, }) { + const isImportRefused = Boolean(adminLibraryImportResult?.refusal?.refused); const handleFileChange = (event) => { onSelectAdminLibraryImportFile(event.target.files?.[0] || null); }; @@ -130,9 +132,9 @@ function AdminLibraryImportView({ {adminLibraryImportResult ? ( ) : ( diff --git a/frontend/src/components/ImportSummary.jsx b/frontend/src/components/ImportSummary.jsx index 5b162ff..dfd9b0b 100644 --- a/frontend/src/components/ImportSummary.jsx +++ b/frontend/src/components/ImportSummary.jsx @@ -27,6 +27,8 @@ function ImportSummary({ onAction, result, }) { + const refusal = result.refusal || {}; + const isRefused = Boolean(refusal.refused); const totalImportDuration = formatImportDuration( result.warnings?.total_import_duration_seconds ); @@ -50,7 +52,7 @@ function ImportSummary({ : []; return (
-

Import termine

+

{isRefused ? "Import refuse" : "Import termine"}

{displayedCounters.map(([label, value]) => (
@@ -59,6 +61,9 @@ function ImportSummary({
))}
+ {isRefused ? ( +

{formatImportRefusalMessage(refusal)}

+ ) : null} {contributionNotice ? (
{contributionNotice}
) : null} @@ -83,6 +88,25 @@ function ImportSummary({ ); } +/** + * Formate le message de refus global d'un fichier d'import. + * + * @param {Object} refusal - Decision de refus retournee par le backend. + * @returns {string} Message clair pour corriger puis reimporter le fichier. + * @throws {void} Ne leve pas d'exception. + */ +function formatImportRefusalMessage(refusal) { + const invalidGamesCount = Number(refusal.invalid_games_count || 0); + const totalGamesCount = Number(refusal.total_games_count || 0); + const ratio = totalGamesCount > 0 + ? `${invalidGamesCount}/${totalGamesCount}` + : `${invalidGamesCount}/0`; + return ( + `Le fichier a ete refuse a cause du nombre d'erreurs: ${ratio} jeux ` + + "contiennent au moins une erreur. Corrigez votre fichier avant de le reimporter a nouveau." + ); +} + /** * Formate la duree totale d'import retournee par le backend. * diff --git a/frontend/src/components/UserCollectionOnboardingView.jsx b/frontend/src/components/UserCollectionOnboardingView.jsx index f073f99..ffdf315 100644 --- a/frontend/src/components/UserCollectionOnboardingView.jsx +++ b/frontend/src/components/UserCollectionOnboardingView.jsx @@ -66,6 +66,7 @@ function UserCollectionOnboardingView({ onSubmitImport, }) { const isBusy = isCheckingCollection || isAnalyzingCollection || isImportingCollection; + const isImportRefused = Boolean(importResult?.refusal?.refused); /** * Transmet le fichier selectionne au hook d'orchestration. @@ -132,9 +133,10 @@ function UserCollectionOnboardingView({ {importResult ? ( } - onAction={onOpenHome} + contributionNotice={isImportRefused ? null : } + onAction={isImportRefused ? () => onFileChange(null) : onOpenHome} /> ) : (
diff --git a/frontend/src/components/appViewSwitchAdminLibraryImportRenderer.jsx b/frontend/src/components/appViewSwitchAdminLibraryImportRenderer.jsx index dcff83b..56ff380 100644 --- a/frontend/src/components/appViewSwitchAdminLibraryImportRenderer.jsx +++ b/frontend/src/components/appViewSwitchAdminLibraryImportRenderer.jsx @@ -25,6 +25,7 @@ function renderAdminLibraryImportView(props, pageLayoutProps) { isImportingAdminLibrary={props.isImportingAdminLibrary} selectedAdminLibraryImportFileName={props.selectedAdminLibraryImportFileName} onImportAdminLibraryCsv={props.importAdminLibraryCsv} + onPrepareNewImportAfterRefusal={props.prepareNewAdminLibraryImportAfterRefusal} onSelectAdminLibraryImportFile={props.selectAdminLibraryImportFile} /> ); diff --git a/frontend/src/hooks/app/useCloudCollectionViewModel.js b/frontend/src/hooks/app/useCloudCollectionViewModel.js index 84b7f6b..163d2ec 100644 --- a/frontend/src/hooks/app/useCloudCollectionViewModel.js +++ b/frontend/src/hooks/app/useCloudCollectionViewModel.js @@ -331,6 +331,9 @@ function useCloudCollectionViewModel() { cancelLibraryReset: libraryResetAction.cancelLibraryReset, confirmLibraryReset: libraryResetAction.confirmLibraryReset, importAdminLibraryCsv: adminLibraryCsvImportAction.importAdminLibraryCsv, + prepareNewAdminLibraryImportAfterRefusal: ( + adminLibraryCsvImportAction.prepareNewAdminLibraryImportAfterRefusal + ), selectAdminLibraryImportFile: adminLibraryCsvImportAction.selectAdminLibraryImportFile, syncPlatformCatalog: platformCatalogSyncAction.syncPlatformCatalog, reinitializeCollection: userCollectionReinitialization.reinitializeCollection, diff --git a/frontend/src/hooks/collection/useUserCollectionOnboarding.js b/frontend/src/hooks/collection/useUserCollectionOnboarding.js index 54cf990..849837f 100644 --- a/frontend/src/hooks/collection/useUserCollectionOnboarding.js +++ b/frontend/src/hooks/collection/useUserCollectionOnboarding.js @@ -398,11 +398,14 @@ function useUserCollectionOnboarding(options) { setOnboardingError(""); try { const result = await UserCollectionApi.importCollection(description); - setHasCollection(true); - setSelectedCollectionFile(null); + const isRefused = Boolean(result.refusal?.refused); + setHasCollection((currentHasCollection) => (isRefused ? currentHasCollection : true)); + setSelectedCollectionFile(isRefused ? selectedCollectionFile : null); setImportResult(result); - reloadOds(); - reloadGames(); + if (!isRefused) { + reloadOds(); + reloadGames(); + } } catch (error) { setOnboardingError(getUserCollectionErrorMessage(error)); } finally { diff --git a/frontend/src/hooks/library/useAdminLibraryCsvImportAction.js b/frontend/src/hooks/library/useAdminLibraryCsvImportAction.js index d4bad88..9b8a8c5 100644 --- a/frontend/src/hooks/library/useAdminLibraryCsvImportAction.js +++ b/frontend/src/hooks/library/useAdminLibraryCsvImportAction.js @@ -68,11 +68,24 @@ function useAdminLibraryCsvImportAction() { } }; + /** + * Remet l'import admin en mode selection apres un refus fonctionnel. + * + * @returns {void} Efface le resume courant et la selection. + * @throws {void} Ne leve pas d'exception. + */ + const prepareNewAdminLibraryImportAfterRefusal = () => { + setSelectedAdminLibraryImportFile(null); + setAdminLibraryImportResult(null); + setAdminLibraryImportError(""); + }; + return { adminLibraryImportError, adminLibraryImportResult, importAdminLibraryCsv, isImportingAdminLibrary, + prepareNewAdminLibraryImportAfterRefusal, selectedAdminLibraryImportFileName: selectedAdminLibraryImportFile?.name || "", selectAdminLibraryImportFile, }; diff --git a/tasks/0.4.2/improve_import_unboarding/import_unboarding.md b/tasks/0.4.2/improve_import_unboarding/import_unboarding.md new file mode 100644 index 0000000..3923381 --- /dev/null +++ b/tasks/0.4.2/improve_import_unboarding/import_unboarding.md @@ -0,0 +1,3 @@ +Il faut améliorer l'écran d'import d'un fichier de collection utilisateur pour le rendre plus compréhensible : + - Ajouter une étape 2 : Configurer votre import + - Ne plus demander le type de fichier, le detecter automatiquement en fonction du fichier importé et son extension. \ No newline at end of file