try:
    # Print Request to Serial
    print(" | Attempting to GET RocketLaunch.Live JSON!")
    time.sleep(2)
    debug_rocketlaunch_full_response = False

    try:
        with requests.get(url=ROCKETLAUNCH_SOURCE) as rocketlaunch_response:
            rocketlaunch_json = rocketlaunch_response.json()
    except ConnectionError as e:
        print("Connection Error:", e)
        print("Retrying in 10 seconds")
    print(" | ✅ RocketLaunch.Live JSON!")

    if debug_rocketlaunch_full_response:
        print("Full API GET URL: ", ROCKETLAUNCH_SOURCE)
        print(rocketlaunch_json)

    # JSON Endpoints
    RLFN = str(rocketlaunch_json["result"][0]["name"])
    RLWO = str(rocketlaunch_json["result"][0]["win_open"])
    TZERO = str(rocketlaunch_json["result"][0]["t0"])
    RLWC = str(rocketlaunch_json["result"][0]["win_close"])
    RLP = str(rocketlaunch_json["result"][0]["provider"]["name"])
    RLVN = str(rocketlaunch_json["result"][0]["vehicle"]["name"])
    RLPN = str(rocketlaunch_json["result"][0]["pad"]["name"])
    RLLS = str(rocketlaunch_json["result"][0]["pad"]["location"]["name"])
    RLLD = str(rocketlaunch_json["result"][0]["launch_description"])
    RLM = str(rocketlaunch_json["result"][0]["mission_description"])
    RLDATE = str(rocketlaunch_json["result"][0]["date_str"])

    # Print to serial & display label if endpoint not "None"
    if RLDATE != "None":
        print(f" |  | Date: {RLDATE}")
    if RLFN != "None":
        print(f" |  | Flight: {RLFN}")
    if RLP != "None":
        print(f" |  | Provider: {RLP}")
    if RLVN != "None":
        print(f" |  | Vehicle: {RLVN}")

    # Launch time can sometimes be Window Open to Close, T-Zero, or weird combination.
    # Should obviously be standardized but they're not input that way.
    # Have to account for every combination of 3 conditions.
    # T-Zero Launch Time Conditionals
    if RLWO == "None" and TZERO != "None" and RLWC != "None":
        print(f" |  | Window: {TZERO} | {RLWC}")
    elif RLWO != "None" and TZERO != "None" and RLWC == "None":
        print(f" |  | Window: {RLWO} | {TZERO}")
    elif RLWO != "None" and TZERO == "None" and RLWC != "None":
        print(f" |  | Window: {RLWO} | {RLWC}")
    elif RLWO != "None" and TZERO != "None" and RLWC != "None":
        print(f" |  | Window: {RLWO} | {TZERO} | {RLWC}")
    elif RLWO == "None" and TZERO != "None" and RLWC == "None":
        print(f" |  | Window: {TZERO}")
    elif RLWO != "None" and TZERO == "None" and RLWC == "None":
        print(f" |  | Window: {RLWO}")
    elif RLWO == "None" and TZERO == "None" and RLWC != "None":
        print(f" |  | Window: {RLWC}")

    if RLLS != "None":
        print(f" |  | Site: {RLLS}")
    if RLPN != "None":
        print(f" |  | Pad: {RLPN}")
    if RLLD != "None":
        print(f" |  | Description: {RLLD}")
    if RLM != "None":
        print(f" |  | Mission: {RLM}")

    print("\nFinished!")
    print(f"Board Uptime: {time_calc(time.monotonic())}")
    print(f"Next Update: {time_calc(SLEEP_TIME)}")
    print("===============================")

except (ValueError, RuntimeError) as e:
    print("Failed to get data, retrying\n", e)
    time.sleep(60)
    break
time.sleep(SLEEP_TIME)