def make_header(data): header = collections.OrderedDict() dictionaries.append(header) header["updated_timestamp_1"] = get_timestamp(1) # Updated time. header["term_timestamp"] = get_timestamp(2) # Timestamp for the term. header["country_code"] = u32_littleendian(country_code) # Wii Country Code. header["updated_timestamp_2"] = get_timestamp(1) # 3rd timestamp. # List of languages that appear on the language select screen numbers = 0 for language in languages: numbers += 1 header["language_select_%s" % numbers] = u8(language) # Fills the rest of the languages as null while numbers < 16: numbers += 1 header["language_select_%s" % numbers] = u8(255) header["language_code"] = u8(language_code) # Wii language code. header["goo_flag"] = u8(0) # Flag to make the Globe display "Powered by Goo". header["language_select_screen_flag"] = u8(0) # Flag to bring up the language select screen. header["download_interval"] = u8(30) # Interval in minutes to check for new articles to display on the Wii Menu. header["message_offset"] = u32(0) # Offset for a message. header["topics_number"] = u32(0) # Number of entries for the topics table. header["topics_offset"] = u32(0) # Offset for the topics table. header["articles_number"] = u32(0) # Number of entries for the articles table. header["articles_offset"] = u32(0) # Offset for the articles table. header["source_number"] = u32(0) # Number of entries for the source table. header["source_offset"] = u32(0) # Offset for the source table. header["locations_number"] = u32(0) # Number of entries for the locations. header["locations_offset"] = u32(0) # Offset for the locations table. header["pictures_number"] = u32(0) # Number of entries for the pictures table. header["pictures_offset"] = u32(0) # Offset for the pictures table. header["count"] = u16(480) # Count value. header["unknown"] = u16(0) # Unknown. header["wiimenu_articles_number"] = u32(0) # Number of Wii Menu article entries. header["wiimenu_articles_offset"] = u32(0) # Offset for the Wii Menu article table. header["wiimenu_articles_offset"] = offset_count() # Offset for the Wii Menu article table. numbers = 0 headlines = [] for article in list(data.values()): if numbers < 11: if article[3].replace(b'\n', b'') not in headlines: numbers += 1 headlines.append(article[3]) header["headline_%s_size" % numbers] = u32(0) # Size of the headline. header["headline_%s_offset" % numbers] = u32(0) # Offset for the headline. return header
def locations_download(language_code, data): locations = collections.OrderedDict() gmaps = googlemaps.Client(key=config["google_maps_api_key"]) """This dictionary is used to determine languages.""" languages = { 0: "ja", 1: "en", 2: "de", 3: "fr", 4: "es", 5: "it", 6: "nl", } for keys, values in list(data.items()): location = values[7] if location is not None: if location not in locations: locations[location] = [None, None, []] locations[location][2].append(keys) for name in list(locations.keys()): if name == "": continue uni_name = name if languages[language_code] == "ja" else unidecode( name ) # If using unidecode with Japanese, it'll translate all the characters to English print(uni_name) if name not in cities: try: read = gmaps.geocode(uni_name, language=languages[language_code]) loc_name = read[0]["address_components"][0]["long_name"] if languages[language_code] == "ja": loc_name = enc(loc_name) else: loc_name = enc(unidecode(loc_name)) """Not doing anything with these.""" country = u8(0) region = u8(0) location = u16(0) zoom_factor = u32_littleendian(6) coordinates = s16(int(read[0]["geometry"]["location"]["lat"] / (360 / 65536))) + \ s16(int(read[0]["geometry"]["location"]["lng"] / (360 / 65536))) + \ country + region + location + zoom_factor except: log("There was a error downloading the location data.", "INFO") else: coordinates = binascii.unhexlify(cities[name][0] + "0000000006000000") loc_name = enc(cities[name][1]) if locations[name][0] is None: locations[name][0] = coordinates if locations[name][1] is None: locations[name][1] = loc_name return locations
def locations_download( language_code, data ): # using Google Maps API is so much better than the crap Nintendo used for say, AP news. locations = {} gmaps = googlemaps.Client(key=config["google_maps_api_key"]) languages = { # corresponds to the Wii's language codes 0: "ja", 1: "en", 2: "de", 3: "fr", 4: "es", 5: "it", 6: "nl", } for keys, values in list(data.items()): location = values[7] if location and location != "": if location not in locations: locations[location] = [None, None, []] locations[location][2].append(keys) for name in list(locations.keys()): if name == "": continue uni_name = ( name if languages[language_code] == "ja" else unidecode(name) ) # if using unidecode with Japanese, it'll translate all the characters to English print(uni_name) coordinates = None if name not in cities: try: read = gmaps.geocode(uni_name, language=languages[language_code]) loc_name = read[0]["address_components"][0]["long_name"] if languages[language_code] == "ja": loc_name = enc(loc_name) else: loc_name = enc(unidecode(loc_name)) """Not doing anything with these.""" country = u8(0) region = u8(0) location = u16(0) zoom_factor = u32_littleendian( 6 ) # Nintendo used the value of 3 for states and countries but we probably don't have any articles that are just states or countries coordinates = ( s16( int(read[0]["geometry"]["location"]["lat"] / (360 / 65536))) + s16( int(read[0]["geometry"]["location"]["lng"] / (360 / 65536))) + country + region + location + zoom_factor ) # latitude and longitude is divided by the value of 360 (degrees of a full circle) divided by the max int for a 16-bit int except Exception as e: ex = "There was a error downloading the location data - line {}: {}".format( sys.exc_info()[-1].tb_lineno, str(e)) print(ex) log(ex, "INFO") else: coordinates = binascii.unhexlify(cities[name][0] + "0000000006000000") loc_name = enc(cities[name][1]) if locations[name][0] is None and coordinates is not None: locations[name][0] = coordinates else: del locations[name] continue if locations[name][1] is None: locations[name][1] = loc_name return locations
def locations_download(language_code, data): locations = collections.OrderedDict() locations_return = collections.OrderedDict() gmaps = googlemaps.Client(key=config["google_maps_api_key"]) """This dictionary is used to determine languages.""" languages = { 0: "ja", 1: "en", 2: "de", 3: "fr", 4: "es", 5: "it", 6: "nl", } for keys, values in data.items(): location = values[7] if location is not None: if location not in locations: locations[location] = [] locations[location].append(keys) for name in locations.keys(): read = None if name == "": continue uni_name = name if languages[language_code] == "ja" else unidecode(name) print uni_name if name not in cities: try: read = gmaps.geocode(uni_name, language=languages[language_code]) except: log("There was a error downloading the location data.", "INFO") if read is None and name in cities: coordinates = binascii.unhexlify(cities[name][0] + "0000000006000000") new_name = enc(cities[name][1]) for filenames in locations[name]: if new_name not in locations_return: locations_return[new_name] = [coordinates, []] locations_return[new_name][1].append(filenames) elif read is not None: try: new_name = read[0]["address_components"][0]["long_name"].encode("utf-16be") """Not doing anything with these at this time.""" country = u8(0) region = u8(0) location = u16(0) zoom_factor = u32_littleendian(6) coordinates = u16(int(read[0]["geometry"]["location"]["lat"] / 0.0054931640625) & 0xFFFF) + u16(int( read[0]["geometry"]["location"][ "lng"] / 0.0054931640625) & 0xFFFF) + country + region + location + zoom_factor for filenames in locations[name]: if new_name not in locations_return: locations_return[new_name] = [coordinates, []] locations_return[new_name][1].append(filenames) except: log("There was a error downloading the location data.", "INFO") return locations_return