# Check the mark.log file that is generated by the CI to make sure it contains the expected values import argparse import os def parse_args(): parser = argparse.ArgumentParser( description="Check the mark.log file that is generated by the CI to make sure it contains the expected values" ) parser.add_argument( "--guids", action="store_true", help="Check the mark.log file for guids" ) parser.add_argument( "--locations", action="store_true", help="Check the mark.log file for locations" ) parser.add_argument( "--write", action="store_true", help="Check the mark.log file for write-run" ) parser.add_argument( "--plex", action="store_true", help="Check the mark.log file for Plex" ) parser.add_argument( "--jellyfin", action="store_true", help="Check the mark.log file for Jellyfin" ) parser.add_argument( "--emby", action="store_true", help="Check the mark.log file for Emby" ) return parser.parse_args() def read_marklog(): marklog = os.path.join(os.getcwd(), "mark.log") with open(marklog, "r") as f: lines = f.readlines() return lines def check_marklog(lines, expected_values): try: # Check to make sure the marklog contains all the expected values and nothing else found_values = [] for line in lines: # Remove the newline character line = line.strip() if line not in expected_values: raise Exception("Line not found in marklog: " + line) found_values.append(line) # Check to make sure the marklog contains the same number of values as the expected values if len(found_values) != len(expected_values): raise Exception( "Marklog did not contain the same number of values as the expected values, found " + str(len(found_values)) + " values, expected " + str(len(expected_values)) + " values\n" + "\n".join(found_values) ) # Check that the two lists contain the same values if sorted(found_values) != sorted(expected_values): raise Exception( "Marklog did not contain the same values as the expected values, found:\n" + "\n".join(sorted(found_values)) + "\n\nExpected:\n" + "\n".join(sorted(expected_values)) ) return True except Exception as e: print(e) return False def main(): args = parse_args() expected_jellyfin = [ "Plex/JellyPlex-CI/jellyplex_watched/Custom Movies/Movie Two (2021)", "Plex/JellyPlex-CI/jellyplex_watched/Custom TV Shows/Greatest Show Ever 3000/Episode 2", "Plex/JellyPlex-CI/jellyplex_watched/Movies/Five Nights at Freddy's", "Plex/JellyPlex-CI/jellyplex_watched/Movies/The Hunger Games: The Ballad of Songbirds & Snakes/301215", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Doctor Who (2005)/Rose", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Doctor Who (2005)/The End of the World/300670", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Aftermath", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Departure/300741", "Emby/Emby-Server/jellyplex_watched/Custom Movies/Movie Two", "Emby/Emby-Server/jellyplex_watched/Custom TV Shows/Greatest Show Ever (3000)/S01E02", "Emby/Emby-Server/jellyplex_watched/Movies/The Family Plan", "Emby/Emby-Server/jellyplex_watched/Movies/Five Nights at Freddy's", "Emby/Emby-Server/jellyplex_watched/Movies/The Hunger Games: The Ballad of Songbirds & Snakes/5", "Emby/Emby-Server/jellyplex_watched/TV Shows/Doctor Who (2005)/Rose", "Emby/Emby-Server/jellyplex_watched/TV Shows/Doctor Who (2005)/The End of the World/5", "Emby/Emby-Server/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Departure/5", "Emby/Emby-Server/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/The Way Out", ] expected_emby = [ "Plex/JellyPlex-CI/jellyplex_watched/Custom Movies/Movie Three (2022)", "Plex/JellyPlex-CI/jellyplex_watched/Custom TV Shows/Greatest Show Ever 3000/Episode 3", "Plex/JellyPlex-CI/jellyplex_watched/Movies/Tears of Steel", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Aftermath", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Parallels and Interiors/240429", "Jellyfin/Jellyfin-Server/JellyUser/Custom Movies/Movie Three (2022)", "Jellyfin/Jellyfin-Server/JellyUser/Custom TV Shows/Greatest Show Ever (3000)/S01E03", "Jellyfin/Jellyfin-Server/JellyUser/Movies/Tears of Steel", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Monarch: Legacy of Monsters/Parallels and Interiors/4", ] expected_plex = [ "Jellyfin/Jellyfin-Server/JellyUser/Movies/Big Buck Bunny", "Jellyfin/Jellyfin-Server/JellyUser/Movies/Killers of the Flower Moon/4", "Jellyfin/Jellyfin-Server/JellyUser/Custom TV Shows/Greatest Show Ever (3000)/S01E01", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Doctor Who/The Unquiet Dead", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Doctor Who/Aliens of London (1)/4", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Monarch: Legacy of Monsters/Secrets and Lies", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Monarch: Legacy of Monsters/Parallels and Interiors/4", "Jellyfin/Jellyfin-Server/JellyUser/Custom Movies/Movie One (2020)", "Emby/Emby-Server/jellyplex_watched/Movies/Big Buck Bunny", "Emby/Emby-Server/jellyplex_watched/Movies/The Family Plan", "Emby/Emby-Server/jellyplex_watched/Movies/Killers of the Flower Moon/4", "Emby/Emby-Server/jellyplex_watched/Custom TV Shows/Greatest Show Ever (3000)/S01E01", "Emby/Emby-Server/jellyplex_watched/TV Shows/Doctor Who (2005)/The Unquiet Dead", "Emby/Emby-Server/jellyplex_watched/TV Shows/Doctor Who (2005)/Aliens of London (1)/4", "Emby/Emby-Server/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Secrets and Lies", "Emby/Emby-Server/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/The Way Out", "Emby/Emby-Server/jellyplex_watched/Custom Movies/Movie One", ] expected_locations = expected_emby + expected_plex + expected_jellyfin # Remove Custom Movies/TV Shows as they should not have guids expected_guids = [item for item in expected_locations if "Custom" not in item] expected_write = [ "Plex/JellyPlex-CI/jellyplex_watched/Custom Movies/Movie Two (2021)", "Plex/JellyPlex-CI/jellyplex_watched/Custom TV Shows/Greatest Show Ever 3000/Episode 2", "Plex/JellyPlex-CI/jellyplex_watched/Movies/Five Nights at Freddy's", "Plex/JellyPlex-CI/jellyplex_watched/Movies/The Hunger Games: The Ballad of Songbirds & Snakes/301215", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Doctor Who (2005)/Rose", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Doctor Who (2005)/The End of the World/300670", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Aftermath", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Departure/300741", "Jellyfin/Jellyfin-Server/JellyUser/Movies/Big Buck Bunny", "Jellyfin/Jellyfin-Server/JellyUser/Movies/Killers of the Flower Moon/4", "Jellyfin/Jellyfin-Server/JellyUser/Custom TV Shows/Greatest Show Ever (3000)/S01E01", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Doctor Who/The Unquiet Dead", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Doctor Who/Aliens of London (1)/4", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Monarch: Legacy of Monsters/Secrets and Lies", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Monarch: Legacy of Monsters/Parallels and Interiors/4", "Jellyfin/Jellyfin-Server/JellyUser/Custom Movies/Movie One (2020)", "Plex/JellyPlex-CI/jellyplex_watched/Custom Movies/Movie Three (2022)", "Plex/JellyPlex-CI/jellyplex_watched/Custom TV Shows/Greatest Show Ever 3000/Episode 3", "Plex/JellyPlex-CI/jellyplex_watched/Movies/Tears of Steel", "Plex/JellyPlex-CI/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Parallels and Interiors/240429", "Emby/Emby-Server/jellyplex_watched/Movies/Big Buck Bunny", "Emby/Emby-Server/jellyplex_watched/Movies/The Family Plan", "Emby/Emby-Server/jellyplex_watched/Movies/Five Nights at Freddy's", "Emby/Emby-Server/jellyplex_watched/Movies/The Hunger Games: The Ballad of Songbirds & Snakes/5", "Emby/Emby-Server/jellyplex_watched/Movies/Killers of the Flower Moon/4", "Emby/Emby-Server/jellyplex_watched/Custom TV Shows/Greatest Show Ever (3000)/S01E01", "Emby/Emby-Server/jellyplex_watched/Custom TV Shows/Greatest Show Ever (3000)/S01E02", "Emby/Emby-Server/jellyplex_watched/TV Shows/Doctor Who (2005)/Rose", "Emby/Emby-Server/jellyplex_watched/TV Shows/Doctor Who (2005)/The End of the World/5", "Emby/Emby-Server/jellyplex_watched/TV Shows/Doctor Who (2005)/The Unquiet Dead", "Emby/Emby-Server/jellyplex_watched/TV Shows/Doctor Who (2005)/Aliens of London (1)/4", "Emby/Emby-Server/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Departure/5", "Emby/Emby-Server/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/Secrets and Lies", "Emby/Emby-Server/jellyplex_watched/TV Shows/Monarch: Legacy of Monsters/The Way Out", "Emby/Emby-Server/jellyplex_watched/Custom Movies/Movie One", "Emby/Emby-Server/jellyplex_watched/Custom Movies/Movie Two", "Jellyfin/Jellyfin-Server/JellyUser/Custom Movies/Movie Three (2022)", "Jellyfin/Jellyfin-Server/JellyUser/Custom TV Shows/Greatest Show Ever (3000)/S01E03", "Jellyfin/Jellyfin-Server/JellyUser/Movies/Tears of Steel", "Jellyfin/Jellyfin-Server/JellyUser/Shows/Monarch: Legacy of Monsters/Parallels and Interiors/4", ] # Expected values for the mark.log file, dry-run is slightly different than write-run # due to some of the items being copied over from one server to another and now being there # for the next server run. if args.guids: expected_values = expected_guids elif args.locations: expected_values = expected_locations elif args.write: expected_values = expected_write elif args.plex: expected_values = expected_plex elif args.jellyfin: expected_values = expected_jellyfin elif args.emby: expected_values = expected_emby else: print("No server specified") exit(1) lines = read_marklog() if not check_marklog(lines, expected_values): print("Failed to validate marklog") for line in lines: # Remove the newline character line = line.strip() print(line) exit(1) print("Successfully validated marklog") exit(0) if __name__ == "__main__": main()