def test_double_tr_ru(self): game = Game('Saboteur II') file = GameFile('Saboteur II (19xx)(-)[h Crudesoft ru][t][tr ru].tap') file.getParamsFromTOSECPath('Saboteur II (19xx)(-)[tr ru Rybkin].tap') self.assertEqual(file.mod_flags, '[h Crudesoft ru][t][tr ru Rybkin]') file = GameFile( 'Saboteur II (19xx)(-)[h Crudesoft ru][t][tr ru Rybkin].tap') file.getParamsFromTOSECPath('Saboteur II (19xx)(-)[tr ru].tap') file.sortModFlags() self.assertEqual(file.mod_flags, '[h Crudesoft ru][t][tr ru Rybkin]')
def test_hashsums(self): print(os.getcwd()) game = Game(zxdb_id=1660) game_file = GameFile('\pub\sinclair\games\e\E.T.X..tap.zip', game=game) expected_md5 = 'b04c5d9bf88eb5a008696d83eeee69ac' self.assertEqual(expected_md5, game_file.getMD5()) expected_sha1 = 'a879037fd3ba64170e83d4d44652681b1eb097e3' self.assertEqual(expected_sha1, game_file.getSHA1()) expected_crc32 = '3699934d' self.assertEqual(expected_crc32, game_file.getCRC32())
def test_badanov_bug(self): file = GameFile('Треугольник.scl') self.assertEqual('Треугольник', file.getGameName()) # file = GameFile('Mini-draiver diskovyh operatsiy.scl') # self.assertEqual('Mini-draiver diskovyh operatsiy', file.getGameName()) file = GameFile('Минидрайвер дисковых операций.scl') game_name = file.getGameName() self.assertEqual('Минидрайвер дисковых операций', game_name) file = GameFile('Мини-драйвер дисковых операций.scl') self.assertEqual('Мини-драйвер дисковых операций', file.getGameName())
def test_set_part(self): game_file = GameFile('Test(Part5).tap') game_file.setPart('Test(Part5).tap') self.assertEqual(game_file.part, 5) game_file = GameFile( 'tosec\fikus-pikus\renamed\Compilations\Demos\[TRD]\Fikus Pikus Demos (19xx)(Flash)(Disk 5 of 140).trd' ) self.assertEqual(game_file.getType(), 'Compilations\\Demos') self.assertEqual(game_file.part, 5) game_file = GameFile( 'tosec\fikus-pikus\renamed\Compilations\Demos\[TRD]\Fikus Pikus Demos (19xx)(Flash)(Disk 101 of 140).trd' ) self.assertEqual(game_file.getType(), 'Compilations\\Demos') self.assertEqual(game_file.part, 101)
def test_weird_md5(self): game_file = GameFile( 'ftp/pub/sinclair/utils/3DGameMaker(GraphicEditor3D).tap.zip') self.assertTrue(os.path.exists(game_file.getLocalPath())) self.assertGreater(len(game_file.getMD5()), 0) game_file = GameFile( 'ftp\zxdb\sinclair\entries\\0030083\DogmoleTuppowski.scl.zip') self.assertTrue(os.path.exists(game_file.getLocalPath())) self.assertGreater(len(game_file.getMD5()), 0)
def test_tape_as_part(self): file = GameFile( 'Bridge Master (1983)(Serin Software)(Tape 1 of 2 Side A).tzx') self.assertEqual(file.part, 1) self.assertEqual(file.side, 1) file = GameFile( 'tosec\Games\[TZX]\Blood of Bogmole, The (1986)(Compass Software)[Master Tape].tap' ) self.assertEqual(file.part, 0) file = GameFile( 'tosec\Games\[TZX]\Blood of Bogmole, The (1986)(Compass Software)(Tape 1).tap' ) self.assertEqual(file.part, 1) file = GameFile( 'tosec\Games\[TZX]\Blood of Bogmole, The (1986)(Compass Software)(Part 2).tap' ) self.assertEqual(file.part, 2)
def test_game_type(self): game_file = GameFile( 'Sinclair ZX Spectrum\Applications\[TZX]\MGT Plus D - System Tape (1987)(Miles Gordon Technology).tzx' ) game_file.game.genre = 'Hardware - Disk' self.assertEqual(game_file.getType(), 'Applications') game_file = GameFile( 'Sinclair ZX Spectrum\Games\[ROM]\Shadow of the Unicorn ROM Loader (2001)(Ross, Fraser)(GB).rom' ) self.assertEqual(game_file.getType(), 'Games') game_file = GameFile( 'C:\ZX Pokemaster\\tosec\\reviewed files\\CSSCGC Games Reviewed\\1997\\Advanced Advocacy Simulator (1997)(Jolly, Derek)[CSSCGC].sna' ) self.assertEqual(game_file.getTOSECDatName(), 'Sinclair ZX Spectrum - Games - [SNA]') self.assertEqual(game_file.game.getGenre(), 'Various Games') self.assertEqual(game_file.getType(), 'Games')
def test_file_length(self): game_file = GameFile( "ZX Spectrum+ User Guide Companion Cassette (1984)(Dorling Kindersley)(GB)(es)(Side A).tap" ) game_file.notes = "[aka ZX Spectrum+ GuideCassette De L'Utilisateur][aka ZX Spectrum+ Kaseta sa Uputstvom za Upotrebu][aka ZX Spectrum+ Guia Para el Empleo][aka Cassetta Di Guida Per L'Utente][aka Kilavuz Ve Yardimci Kaset][aka Cassette Bij Handleiding][aka Kassette fur Benutzer][aka Kayttajan Opaskasetti]" game_file.alt_dest = game_file.getTOSECName() MAX_GAME_NAME_LENGTH = 200 MAX_DESTINATION_PATH_LENGTH = 200 if len(game_file.alt_dest) > MAX_DESTINATION_PATH_LENGTH: for game_name_length in range(MAX_GAME_NAME_LENGTH, MIN_GAME_NAME_LENGTH - 10, -10): game_file.removeAka() game_file.alt_dest = game_file.getTOSECName( game_name_length=game_name_length) if len(game_file.alt_dest) <= MAX_DESTINATION_PATH_LENGTH: break self.assertLessEqual(len(game_file.alt_dest), 200)
def test_strip_name_if_no_mod_flags(self): pattern = '{GameName} ({Year}) ({Publisher}) ({MachineType}) {ModFlags}' game_file = GameFile('Game (19xx)(-).tap') output_name = game_file.getOutputName(pattern) self.assertEqual(output_name, 'Game (19xx) (-).tap') game_file = GameFile('Game (19xx)(-)[m].tap') output_name = game_file.getOutputName(pattern) self.assertEqual(output_name, 'Game (19xx) (-) [m].tap')
def scrapeGameFiles(self, game, game_files): for i, game_file_info in enumerate(game_files[1:]): game_file_info = Selector(game_file_info) cells = game_file_info.xpath('//td').extract() java_link = Selector(cells[0]).xpath('//a/@title').extract_first() file_link = Selector(cells[2]).xpath('//a/@href').extract_first() file_size = Selector(cells[3]).xpath('//text()').extract_first() game_file = GameFile(file_link, file_size, game) if game_file.format not in GAME_EXTENSIONS: continue if java_link: if '128K' in java_link: game.setMachineType('128K') game.addFile(game_file)
def test_getting_info_from_tosec_name(self): file = GameFile('Gonzzalezz (1989)(Opera Soft)(es)(Side B).tap') self.assertEqual(file.game.name, 'Gonzzalezz') self.assertEqual(file.game.getYear(), '1989') self.assertEqual(file.game.getPublisher(), 'Opera Soft') self.assertEqual(file.getLanguage(), 'es') self.assertEqual(file.getSide(), 'Side B') file = GameFile('Gonzzalezz.tap') self.assertEqual(file.game.name, 'Gonzzalezz')
def test_mod_flags(self): file = GameFile("Test (19xx)(Publisher)[a]") self.assertEqual(file.mod_flags, '') file = GameFile("Test (19xx)(Publisher)[m]") self.assertEqual(file.mod_flags, '[m]') file = GameFile("Test (19xx)(Publisher)[a][m][hacked]") self.assertEqual(file.mod_flags, '[m]') file = GameFile("Test (19xx)(Publisher)[a][h by SKiDROW][m]") self.assertEqual(file.mod_flags, '[h by SKiDROW][m]') file = GameFile("Test (19xx)(Publisher)[a][re-release]") self.assertEqual(file.mod_flags, '') file = GameFile("Test (19xx)(Publisher)[t][a]") self.assertEqual(file.mod_flags, '[t]')
def test_preserve_date(self): game_file = GameFile('Game (2017-06-06)(Company).tzx') tosec_output_name = game_file.getTOSECName() self.assertEqual(tosec_output_name, 'Game (2017-06-06)(Company).tzx') db = Database() game = db.getGameByWosID(30408) game_file = GameFile( 'tosec\itch.io\Games\Robot 1 in... The Ship of Doom (2017-06-18)(Recardo, Mat)(48K-128K).tzx', source='tosec') game.addFile(game_file) self.assertEqual(game_file.release.year, '2017-06-18') tosec_output_name = game_file.getTOSECName() self.assertEqual( tosec_output_name, 'Robot 1 in... The Ship of Doom (2017-06-18)(Recardo, Mat)(48K-128K).tzx' )
def test_demo(self): file = GameFile('A Treat! (demo) (1985)(Firebird Software).tap') self.assertEqual(file.game.getPublisher(), 'Firebird') self.assertEqual(file.game.getYear(), '1985') self.assertEqual(file.game.name, 'A Treat!')
def test_cascade_games(self): file = GameFile('Spectral Skiing (1983)(Cascade Games)[16K].tap') self.assertEqual(file.game.publisher, 'Cascade Games') self.assertEqual(file.game.getPublisher(), 'Cascade Games')
def test_notes(self): path = 'Sinclair ZX Spectrum\Games\[TAP]\Backpackers Guide to the Universe (1984)(Fantasy Software)[passworded].tap' file = GameFile(path) self.assertEqual(file.notes, '[passworded]') file = GameFile("Test (19xx)(Publisher)[t][a][re-release]") self.assertEqual(file.notes, '')
def test_country(self): game_file = GameFile('Game (19xx)(Publisher).tap') game_file.release.country = 'GB' game_file.language = 'en' self.assertEqual(game_file.getTOSECName(), 'Game (19xx)(Publisher).tap') game_file.release.country = 'CZ' game_file.language = 'cz' self.assertEqual(game_file.getTOSECName(), 'Game (19xx)(Publisher)(CZ).tap') game_file.release.country = 'GB' game_file.language = 'es' self.assertEqual(game_file.getTOSECName(), 'Game (19xx)(Publisher)(GB)(es).tap') game_file.release.country = 'RU' game_file.language = 'en' self.assertEqual(game_file.getTOSECName(), 'Game (19xx)(Publisher)(RU)(en).tap') game_file.release.country = '' game_file.language = 'en' self.assertEqual(game_file.getTOSECName(), 'Game (19xx)(Publisher).tap') game_file = GameFile( 'Sinclair ZX Spectrum\Games\[TAP]\Mihotabpa (19xx)(-)(ru).tap') self.assertEqual(game_file.getTOSECName(), 'Mihotabpa (19xx)(-)(ru).tap') game_file = GameFile( 'Sinclair ZX Spectrum\Games\[TAP]\Mihotabpa (19xx)(-)(ru)[tr ru].tap' ) self.assertEqual(game_file.getTOSECName(), 'Mihotabpa (19xx)(-)[tr ru].tap')
def test_lord_bromleys_estate(self): file = GameFile("007 - Lord Bromley's Estate (1990)(Domark)[cr].tap") self.assertEqual(file.game.name, "007 - Lord Bromley's Estate") self.assertEqual(file.game.getYear(), '1990') self.assertEqual(file.game.getLanguage(), 'en') self.assertEqual(file.mod_flags, '[cr]')
def test_preserve_version(self): game_file = GameFile( "DreamWalker v1.0 (2014)(RetroSouls)(48K-128K)(RU)(en)[aka Alter Ego 2][aka DreamWalker].tap" ) self.assertEqual(game_file.game.name, 'DreamWalker') self.assertEqual(game_file.content_desc, ' v1.0')
def fileFromRow(self, row): if not row['md5']: return None file = GameFile() if 'wos_name' in row.keys(): file.wos_name = row['wos_name'] file.wos_path = row['wos_path'] if 'tosec_path' in row.keys(): file.tosec_path = row['tosec_path'] file.format = row['format'] file.size = row['size'] file.content_desc = row['content_desc'] file.release_date = row['release_date'] file.is_demo = row['is_demo'] file.setMachineType(row['file_machine_type']) file.part = row['part'] file.side = row['side'] file.language = row['file_language'] file.mod_flags = row['mod_flags'] file.notes = row['notes'] file.md5 = row['md5'] file.crc32 = row['crc32'] file.sha1 = row['sha1'] return file
file.wos_path = row['wos_path'] if 'tosec_path' in row.keys(): file.tosec_path = row['tosec_path'] file.format = row['format'] file.size = row['size'] file.content_desc = row['content_desc'] file.release_date = row['release_date'] file.is_demo = row['is_demo'] file.setMachineType(row['file_machine_type']) file.part = row['part'] file.side = row['side'] file.language = row['file_language'] file.mod_flags = row['mod_flags'] file.notes = row['notes'] file.md5 = row['md5'] file.crc32 = row['crc32'] file.sha1 = row['sha1'] return file if __name__ == '__main__': os.chdir('..') from scripts.restore_db import * restoreDB() db = Database() game_file = GameFile( "Sinclair ZX Spectrum\Games\[TAP]\Robin of the Wood (1985)(Odin Computer Graphics).tap" ) game_file.md5 = "f16538ac3cb55bbbb878c42c04b17de5" game = db.getGameByFile(game_file) print(game)
def test_adult_game(self): game_file = GameFile('Game (19xx)(-).tap') game_file.game.x_rated = True game_file.alt_mod_flag = '[a]' tosec_name = game_file.getTOSECName() self.assertEqual(tosec_name, 'Game (19xx)(-)[a][adult].tap')
def test_bilinguic_file(self): game_file = GameFile('Game (19xx)(-)(en-es).tap') language = game_file.getLanguage() self.assertEqual(language, 'en-es')
def test_set_country(self): game_file = GameFile( 'Sinclair ZX Spectrum\Demos\[SCL]\#AAABOG (2016)(wbr)(128K)(RU).tap', source='tosec') self.assertEqual(game_file.release.country, 'RU')
def test_multipublisher(self): file = GameFile('test (19xx)(Your Sinclair - crash - Orion)') file.sortPublishers() self.assertEqual('crash - Orion - Your Sinclair', file.getPublisher())
def test_trainer_as_machine_type(self): game_file = GameFile( 'Sinclair ZX Spectrum\Games\[TAP]\Predator (1987)(Activision)[t +2].tap' ) self.assertFalse(game_file.machine_type == '+2')
def getGameByFilePath(self, filepath): filename = os.path.basename(filepath) game_release = re.sub(TOSEC_REGEX, '', filename).strip() version = re.findall('v[0-9].*', game_release) if version: game_release = game_release.replace(version[0], '').strip() if self.cache_by_name: search_string = getSearchStringFromGameName(game_release) games = self.cache_by_name.get(search_string) if not games: if ' - ' in game_release: search_string = getSearchStringFromGameName( game_release.split(' - ')[0]) games = self.cache_by_name.get(search_string) elif ' + ' in game_release: search_string = getSearchStringFromGameName( game_release.split(' + ')[0]) games = self.cache_by_name.get(search_string) else: game_release = '%' + '%'.join([ x for x in game_release.split(' ') if x not in GAME_PREFIXES ]) + '%' sql = SELECT_GAME_SQL_START sql += 'WHERE game.wos_id IN ' \ '(SELECT wos_id FROM game_release ' \ 'WHERE game_release.name LIKE ?)' sql += SELECT_GAME_SQL_END raw_data = self.cur.execute(sql, [game_release]).fetchall() games = self.getGamesFromRawData(raw_data) if not games: if '%-%' in game_release: game_release = game_release.split('%-%')[0] + "%" raw_data = self.cur.execute(sql, [game_release]).fetchall() games = self.getGamesFromRawData(raw_data) elif '%+%' in game_release: game_release = game_release.split('%+%')[0] + "%" raw_data = self.cur.execute(sql, [game_release]).fetchall() games = self.getGamesFromRawData(raw_data) if not games: return None game_file = GameFile(filepath) if len(games) == 1: game = games[0] for release in game.releases: if release.getYear() == game_file.game.getYear(): return game release_publisher = getSearchStringFromGameName( release.getPublisher()) game_file_publisher = getSearchStringFromGameName( game_file.game.getPublisher()) if release_publisher == game_file_publisher: return game candidates = [] for game in games: for release in game.releases: release_publisher = getSearchStringFromGameName( release.getPublisher()) game_file_publisher = getSearchStringFromGameName( game_file.game.getPublisher()) if game_file_publisher in release_publisher: candidates.append(game) if len(candidates) == 1: return candidates[0] else: for game in candidates: for release in game.releases: if release.getYear() == game_file.game.getYear(): return game return None
def test_language_detection(self): game_file = GameFile('Three Octopuses (2017)(kas29)(RU).tap') self.assertEqual(game_file.getLanguage(), 'ru')
def gameFileFromRow(self, row, game): game_file = GameFile(row['file_link'], game=game, source='wos') game_file.size_zipped = row['file_size'] game_file.setMachineType(row['machine_type']) game_file.setProtectionScheme(row['protection_scheme']) if row['file_language']: if row['file_language'] in IDIOM_IDS_TO_TOSEC_LANGS: game_file.setLanguage( IDIOM_IDS_TO_TOSEC_LANGS[row['file_language']]) else: game_file.setLanguage(row['file_language']) if row['file_version'] and row['file_version'].lower().startswith('v') \ and row['file_version'][1].isdigit(): game_file.content_desc = ' ' + remove_brackets_regex.sub( '', row['file_version']).strip() return game_file
def test_dot_in_game_name(self): game = Game('H.E.R.O.') file = GameFile('H.E.R.O. (19xx)(-).tap') file.game = game self.assertEqual(file.getTOSECName(), 'H.E.R.O. (19xx)(-).tap')