1
0
Fork 0

Use UTC instead of local time for compatibility with APIs and PreDBs.

This commit is contained in:
Casper V. Kristensen 2019-05-12 03:25:30 +02:00
parent a46d260782
commit 46634789a3
Signed by: caspervk
GPG key ID: 289CA03790535054
4 changed files with 37 additions and 36 deletions

View file

@ -116,7 +116,7 @@ def generate(post=False, pm_recipients=None) -> None:
if pre.dirname not in processed) if pre.dirname not in processed)
# The date of the post changes at midday instead of midnight to allow calling script after 00:00 # The date of the post changes at midday instead of midnight to allow calling script after 00:00
title = f"Daily Releases ({(datetime.today() - timedelta(hours=12)).strftime('%B %-d, %Y')})" title = f"Daily Releases ({(datetime.utcnow() - timedelta(hours=12)).strftime('%B %-d, %Y')})"
generated_post = generate_post(releases) generated_post = generate_post(releases)
generated_post_src = textwrap.indent(generated_post, " ") generated_post_src = textwrap.indent(generated_post, " ")

View file

@ -127,7 +127,7 @@ def parse_pre(pre: Pre, offline=False) -> Release:
if re.search("|".join(BLACKLISTED), pre.dirname, flags=re.IGNORECASE): if re.search("|".join(BLACKLISTED), pre.dirname, flags=re.IGNORECASE):
raise ParseError("Contains blacklisted word") raise ParseError("Contains blacklisted word")
if pre.timestamp < datetime.now() - timedelta(hours=48): if pre.timestamp < datetime.utcnow() - timedelta(hours=48):
raise ParseError("Older than 48 hours") raise ParseError("Older than 48 hours")
logger.info("---") logger.info("---")

View file

@ -58,7 +58,8 @@ def get_predbme() -> List[Pre]:
# Predb.me doesn't show timestamps in the RSS-feed, but the feed is so short it only shows ~72 hours worth of # Predb.me doesn't show timestamps in the RSS-feed, but the feed is so short it only shows ~72 hours worth of
# releases anyway, so we just set timestamp to now. # releases anyway, so we just set timestamp to now.
now = datetime.utcnow()
return [Pre(item.find("title").text, return [Pre(item.find("title").text,
item.find("guid").text, item.find("guid").text,
datetime.utcnow()) now)
for item in soup] for item in soup]

View file

@ -8,7 +8,7 @@ from dailyreleases.predbs import Pre
class ParseDirnameTestCase(unittest.TestCase): class ParseDirnameTestCase(unittest.TestCase):
def test_single_word_release(self): def test_single_word_release(self):
pre = Pre("Aztez-DARKSiDERS", "nfo_link", datetime.now()) pre = Pre("Aztez-DARKSiDERS", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual("Aztez-DARKSiDERS", p.dirname) self.assertEqual("Aztez-DARKSiDERS", p.dirname)
@ -22,40 +22,40 @@ class ParseDirnameTestCase(unittest.TestCase):
self.assertEqual([], p.highlights) self.assertEqual([], p.highlights)
def test_error_on_blacklisted_word(self): def test_error_on_blacklisted_word(self):
pre = Pre("Anthemion.Software.DialogBlocks.v5.15.LINUX.Incl.Keygen-AMPED", "nfo_link", datetime.now()) pre = Pre("Anthemion.Software.DialogBlocks.v5.15.LINUX.Incl.Keygen-AMPED", "nfo_link", datetime.utcnow())
with self.assertRaisesRegex(ParseError, "Contains blacklisted word"): with self.assertRaisesRegex(ParseError, "Contains blacklisted word"):
parsing.parse_pre(pre) parsing.parse_pre(pre)
def test_error_on_old(self): def test_error_on_old(self):
pre = Pre("Aztez-DARKSiDERS", "nfo_link", datetime.now() - timedelta(hours=50)) pre = Pre("Aztez-DARKSiDERS", "nfo_link", datetime.utcnow() - timedelta(hours=50))
with self.assertRaisesRegex(ParseError, "Older than 48 hours"): with self.assertRaisesRegex(ParseError, "Older than 48 hours"):
parsing.parse_pre(pre) parsing.parse_pre(pre)
def test_error_on_software(self): def test_error_on_software(self):
pre = Pre("Tecplot.RS.2017.R1.v1.2.85254.X64-AMPED", "nfo_link", datetime.now()) pre = Pre("Tecplot.RS.2017.R1.v1.2.85254.X64-AMPED", "nfo_link", datetime.utcnow())
with self.assertRaisesRegex(ParseError, "No store link: probably software"): with self.assertRaisesRegex(ParseError, "No store link: probably software"):
parsing.parse_pre(pre) parsing.parse_pre(pre)
def test_nuked_release(self): def test_nuked_release(self):
# TODO: Actual nuke handling? # TODO: Actual nuke handling?
pre = Pre("Battlefield.1-CPY", "nfo_link", datetime.now()) pre = Pre("Battlefield.1-CPY", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual("Battlefield.1-CPY", p.dirname) self.assertEqual("Battlefield.1-CPY", p.dirname)
def test_update(self): def test_update(self):
pre = Pre("Car.Mechanic.Simulator.2018.Plymouth.Update.v1.5.1.Hotfix-PLAZA", "nfo_link", datetime.now()) pre = Pre("Car.Mechanic.Simulator.2018.Plymouth.Update.v1.5.1.Hotfix-PLAZA", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(ReleaseType.UPDATE, p.type) self.assertEqual(ReleaseType.UPDATE, p.type)
self.assertIn("store.steampowered.com/app/754920", p.store_links["Steam"]) self.assertIn("store.steampowered.com/app/754920", p.store_links["Steam"])
def test_proper_highlight(self): def test_proper_highlight(self):
pre = Pre("Death.Coming.PROPER-SiMPLEX", "nfo_link", datetime.now()) pre = Pre("Death.Coming.PROPER-SiMPLEX", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(["PROPER"], p.highlights) self.assertEqual(["PROPER"], p.highlights)
self.assertIn("store.steampowered.com/app/705120", p.store_links["Steam"]) self.assertIn("store.steampowered.com/app/705120", p.store_links["Steam"])
def test_macos_release(self): def test_macos_release(self):
pre = Pre("The_Fall_Part_2_Unbound_MacOS-Razor1911", "nfo_link", datetime.now()) pre = Pre("The_Fall_Part_2_Unbound_MacOS-Razor1911", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(Platform.OSX, p.platform) self.assertEqual(Platform.OSX, p.platform)
self.assertEqual(ReleaseType.GAME, p.type) self.assertEqual(ReleaseType.GAME, p.type)
@ -63,7 +63,7 @@ class ParseDirnameTestCase(unittest.TestCase):
self.assertIn("gog.com/game/the_fall_part_2_unbound", p.store_links["GOG"]) self.assertIn("gog.com/game/the_fall_part_2_unbound", p.store_links["GOG"])
def test_macosx_update(self): def test_macosx_update(self):
pre = Pre("Man_O_War_Corsair_Warhammer_Naval_Battles_v1.3.2_MacOSX-Razor1911", "nfo_link", datetime.now()) pre = Pre("Man_O_War_Corsair_Warhammer_Naval_Battles_v1.3.2_MacOSX-Razor1911", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(Platform.OSX, p.platform) self.assertEqual(Platform.OSX, p.platform)
self.assertEqual(ReleaseType.UPDATE, p.type) self.assertEqual(ReleaseType.UPDATE, p.type)
@ -71,7 +71,7 @@ class ParseDirnameTestCase(unittest.TestCase):
self.assertIn("gog.com/game/man_o_war_corsair", p.store_links["GOG"]) self.assertIn("gog.com/game/man_o_war_corsair", p.store_links["GOG"])
def test_linux_release(self): def test_linux_release(self):
pre = Pre("Sphinx_And_The_Cursed_Mummy_Linux-Razor1911", "nfo_link", datetime.now()) pre = Pre("Sphinx_And_The_Cursed_Mummy_Linux-Razor1911", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(Platform.LINUX, p.platform) self.assertEqual(Platform.LINUX, p.platform)
self.assertEqual(ReleaseType.GAME, p.type) self.assertEqual(ReleaseType.GAME, p.type)
@ -79,39 +79,39 @@ class ParseDirnameTestCase(unittest.TestCase):
self.assertIn("gog.com/game/sphinx_and_the_cursed_mummy", p.store_links["GOG"]) self.assertIn("gog.com/game/sphinx_and_the_cursed_mummy", p.store_links["GOG"])
def test_dlc_explicit(self): def test_dlc_explicit(self):
pre = Pre("Fallout.4.Far.Harbor.DLC-CODEX", "nfo_link", datetime.now()) pre = Pre("Fallout.4.Far.Harbor.DLC-CODEX", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertIn("store.steampowered.com/app/435881", p.store_links["Steam"]) self.assertIn("store.steampowered.com/app/435881", p.store_links["Steam"])
self.assertEqual(ReleaseType.DLC, p.type) self.assertEqual(ReleaseType.DLC, p.type)
def test_dlc_implicit(self): def test_dlc_implicit(self):
pre = Pre("Euro.Truck.Simulator.2.Italia-CODEX", "nfo_link", datetime.now()) pre = Pre("Euro.Truck.Simulator.2.Italia-CODEX", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(ReleaseType.DLC, p.type) self.assertEqual(ReleaseType.DLC, p.type)
self.assertIn("store.steampowered.com/app/558244", p.store_links["Steam"]) self.assertIn("store.steampowered.com/app/558244", p.store_links["Steam"])
def test_incl_dlc_update(self): def test_incl_dlc_update(self):
pre = Pre("Wolfenstein.II.The.New.Colossus.Update.5.incl.DLC-CODEX", "nfo_link", datetime.now()) pre = Pre("Wolfenstein.II.The.New.Colossus.Update.5.incl.DLC-CODEX", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(ReleaseType.UPDATE, p.type) self.assertEqual(ReleaseType.UPDATE, p.type)
self.assertIn("store.steampowered.com/app/612880", p.store_links["Steam"]) self.assertIn("store.steampowered.com/app/612880", p.store_links["Steam"])
def test_incl_dlc_release(self): def test_incl_dlc_release(self):
pre = Pre("Mutiny.Incl.DLC-DARKSiDERS", "nfo_link", datetime.now()) pre = Pre("Mutiny.Incl.DLC-DARKSiDERS", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(ReleaseType.GAME, p.type) self.assertEqual(ReleaseType.GAME, p.type)
def test_score_steam(self): def test_score_steam(self):
pre = Pre("BioShock_Infinite-FLT", "nfo_link", datetime.now()) pre = Pre("BioShock_Infinite-FLT", "nfo_link", datetime.utcnow())
p1 = parsing.parse_pre(pre) p1 = parsing.parse_pre(pre)
self.assertIn("store.steampowered.com/app/8870", p1.store_links["Steam"]) self.assertIn("store.steampowered.com/app/8870", p1.store_links["Steam"])
pre = Pre("Duke.Nukem.Forever.Complete-PLAZA", "nfo_link", datetime.now()) pre = Pre("Duke.Nukem.Forever.Complete-PLAZA", "nfo_link", datetime.utcnow())
p2 = parsing.parse_pre(pre) p2 = parsing.parse_pre(pre)
self.assertIn("store.steampowered.com/app/57900", p2.store_links["Steam"]) self.assertIn("store.steampowered.com/app/57900", p2.store_links["Steam"])
self.assertGreater(p1.score, p2.score) self.assertGreater(p1.score, p2.score)
def test_non_steam(self): def test_non_steam(self):
pre = Pre("Battlefield.1.REPACK-CPY", "nfo_link", datetime.now()) pre = Pre("Battlefield.1.REPACK-CPY", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertIn("www.origin.com/usa/en-us/store/battlefield/battlefield-1", p.store_links["Origin"]) self.assertIn("www.origin.com/usa/en-us/store/battlefield/battlefield-1", p.store_links["Origin"])
self.assertEqual(-1, p.score) self.assertEqual(-1, p.score)
@ -119,43 +119,43 @@ class ParseDirnameTestCase(unittest.TestCase):
def test_gog_exclusive(self): def test_gog_exclusive(self):
# TODO: Actually use GOG API (gog.update_info) # TODO: Actually use GOG API (gog.update_info)
pre = Pre("Dungeons.and.Dragons.Dragonshard.v2.0.0.10.Multilingual-DELiGHT", "nfo_link", datetime.now()) pre = Pre("Dungeons.and.Dragons.Dragonshard.v2.0.0.10.Multilingual-DELiGHT", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertIn("gog.com/game/dungeons_dragons_dragonshard", p.store_links["GOG"]) self.assertIn("gog.com/game/dungeons_dragons_dragonshard", p.store_links["GOG"])
self.assertEqual(-1, p.score) self.assertEqual(-1, p.score)
def test_gog_exclusive2(self): def test_gog_exclusive2(self):
pre = Pre("Diablo.GOG.Classic-KaliMaaShaktiDe", "nfo_link", datetime.now()) pre = Pre("Diablo.GOG.Classic-KaliMaaShaktiDe", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertIn("gog.com/game/diablo", p.store_links["GOG"]) self.assertIn("gog.com/game/diablo", p.store_links["GOG"])
def test_score_non_steam(self): def test_score_non_steam(self):
pre = Pre("Ode.RIP.MULTI12-SiMPLEX", "nfo_link", datetime.now()) pre = Pre("Ode.RIP.MULTI12-SiMPLEX", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(-1, p.score) self.assertEqual(-1, p.score)
def test_tags(self): def test_tags(self):
pre = Pre("The.Curious.Expedition.v1.3.7.1.MULTI.7.RIP-Unleashed", "nfo_link", datetime.now()) pre = Pre("The.Curious.Expedition.v1.3.7.1.MULTI.7.RIP-Unleashed", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertIn("gog.com/game/curious_expedition_the", p.store_links["GOG"]) self.assertIn("gog.com/game/curious_expedition_the", p.store_links["GOG"])
self.assertEqual(["MULTI.7", "RIP"], p.tags) self.assertEqual(["MULTI.7", "RIP"], p.tags)
def test_steam_package(self): def test_steam_package(self):
pre = Pre("Anno.2070.Complete.Edition-FAKE", "nfo_link", datetime.now()) pre = Pre("Anno.2070.Complete.Edition-FAKE", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual("Anno 2070 Complete Edition", p.game_name) self.assertEqual("Anno 2070 Complete Edition", p.game_name)
self.assertGreaterEqual(9354, p.num_reviews) # make sure we got the right game in the package self.assertGreaterEqual(9354, p.num_reviews) # make sure we got the right game in the package
self.assertIn("store.steampowered.com/sub/26683", p.store_links["Steam"]) self.assertIn("store.steampowered.com/sub/26683", p.store_links["Steam"])
def test_steam_package_with_dlc_first(self): def test_steam_package_with_dlc_first(self):
pre = Pre("The.Witcher.3.Wild.Hunt.Game.of.The.Year.Edition-RELOADED", "nfo_link", datetime.now()) pre = Pre("The.Witcher.3.Wild.Hunt.Game.of.The.Year.Edition-RELOADED", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual("The Witcher 3: Wild Hunt - Game of the Year Edition", p.game_name) self.assertEqual("The Witcher 3: Wild Hunt - Game of the Year Edition", p.game_name)
self.assertEqual(ReleaseType.GAME, p.type) self.assertEqual(ReleaseType.GAME, p.type)
self.assertIn("store.steampowered.com/sub/124923", p.store_links["Steam"]) self.assertIn("store.steampowered.com/sub/124923", p.store_links["Steam"])
def test_steam_bundle(self): def test_steam_bundle(self):
pre = Pre("Valve.Complete.Pack-FAKE", "nfo_link", datetime.now()) pre = Pre("Valve.Complete.Pack-FAKE", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual("Valve.Complete.Pack-FAKE", p.dirname) self.assertEqual("Valve.Complete.Pack-FAKE", p.dirname)
self.assertEqual("Valve Complete Pack", p.game_name) self.assertEqual("Valve Complete Pack", p.game_name)
@ -164,49 +164,49 @@ class ParseDirnameTestCase(unittest.TestCase):
self.assertIn("store.steampowered.com/bundle/232", p.store_links["Steam"]) self.assertIn("store.steampowered.com/bundle/232", p.store_links["Steam"])
def test_denuvo_in_steam_eula(self): def test_denuvo_in_steam_eula(self):
pre = Pre("Deus.Ex.Mankind.Divided-CPY", "nfo_link", datetime.now()) pre = Pre("Deus.Ex.Mankind.Divided-CPY", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(["DENUVO"], p.highlights) self.assertEqual(["DENUVO"], p.highlights)
def test_denuvo_in_steam_drm_notice(self): def test_denuvo_in_steam_drm_notice(self):
pre = Pre("Batman.Arkham.Knight-CPY", "nfo_link", datetime.now()) pre = Pre("Batman.Arkham.Knight-CPY", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(["DENUVO"], p.highlights) self.assertEqual(["DENUVO"], p.highlights)
def test_episode_release(self): def test_episode_release(self):
pre = Pre("Life.is.Strange.Before.the.Storm.Episode.3-CODEX", "nfo_link", datetime.now()) pre = Pre("Life.is.Strange.Before.the.Storm.Episode.3-CODEX", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual("Life is Strange: Before the Storm Episode 3", p.game_name) self.assertEqual("Life is Strange: Before the Storm Episode 3", p.game_name)
self.assertEqual(ReleaseType.DLC, p.type) self.assertEqual(ReleaseType.DLC, p.type)
self.assertIn("store.steampowered.com/app/704740", p.store_links["Steam"]) self.assertIn("store.steampowered.com/app/704740", p.store_links["Steam"])
def test_season_and_episode_release(self): def test_season_and_episode_release(self):
pre = Pre("Minecraft.Story.Mode.Season.Two.Episode.5.MacOSX-RELOADED", "nfo_link", datetime.now()) pre = Pre("Minecraft.Story.Mode.Season.Two.Episode.5.MacOSX-RELOADED", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual("Minecraft Story Mode Season Two Episode 5", p.game_name) self.assertEqual("Minecraft Story Mode Season Two Episode 5", p.game_name)
def test_build_is_update(self): def test_build_is_update(self):
pre = Pre("DUSK.Episode.1.Build.2.6-SKIDROW", "nfo_link", datetime.now()) pre = Pre("DUSK.Episode.1.Build.2.6-SKIDROW", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertEqual(ReleaseType.UPDATE, p.type) self.assertEqual(ReleaseType.UPDATE, p.type)
def test_prefer_steam_to_microsoft_store(self): def test_prefer_steam_to_microsoft_store(self):
pre = Pre("Forgiveness-PLAZA", "nfo_link", datetime.now()) pre = Pre("Forgiveness-PLAZA", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre) p = parsing.parse_pre(pre)
self.assertIn("store.steampowered.com/app/971120", p.store_links["Steam"]) self.assertIn("store.steampowered.com/app/971120", p.store_links["Steam"])
def test_abbreviated_name(self): def test_abbreviated_name(self):
pre = Pre("R.O.V.E.R.The.Game-HOODLUM", "nfo_link", datetime.now()) pre = Pre("R.O.V.E.R.The.Game-HOODLUM", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre, offline=True) p = parsing.parse_pre(pre, offline=True)
self.assertEqual("R.O.V.E.R The Game", p.game_name) self.assertEqual("R.O.V.E.R The Game", p.game_name)
def test_abbreviated_name_splits_single_letter(self): def test_abbreviated_name_splits_single_letter(self):
pre = Pre("Tick.Tock.A.Tale.for.Two-DARKSiDERS", "nfo_link", datetime.now()) pre = Pre("Tick.Tock.A.Tale.for.Two-DARKSiDERS", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre, offline=True) p = parsing.parse_pre(pre, offline=True)
self.assertEqual("Tick Tock A Tale for Two", p.game_name) self.assertEqual("Tick Tock A Tale for Two", p.game_name)
def test_abbreviated_name_splits_single_number(self): def test_abbreviated_name_splits_single_number(self):
pre = Pre("GTA.5.The.Complete.Edition-TEST", "nfo_link", datetime.now()) pre = Pre("GTA.5.The.Complete.Edition-TEST", "nfo_link", datetime.utcnow())
p = parsing.parse_pre(pre, offline=True) p = parsing.parse_pre(pre, offline=True)
self.assertEqual("GTA 5 The Complete Edition", p.game_name) self.assertEqual("GTA 5 The Complete Edition", p.game_name)