Skip to content

location history changes #12

@gerardrbentley

Description

@gerardrbentley

not sure if each download is unique, but I had to change some things to work with the takeout zip I made 2023-01-25

filename changed from "Location History.json" to "Records.json"

"timestampMs" is not present, "timestamp" is roughly iso timestamp

def get_timestamp_ms(raw_timestamp):
    try:
        return datetime.datetime.strptime(raw_timestamp, "%Y-%m-%dT%H:%M:%SZ").timestamp()
    except ValueError:
        return datetime.datetime.strptime(raw_timestamp, "%Y-%m-%dT%H:%M:%S.%fZ").timestamp()

def save_location_history(db, zf):
    location_history = json.load(
        zf.open("Takeout/Location History/Records.json")
    )
    db["location_history"].upsert_all(
        (
            {
                "id": id_for_location_history(row),
                "latitude": row["latitudeE7"] / 1e7,
                "longitude": row["longitudeE7"] / 1e7,
                "accuracy": row["accuracy"],
                "timestampMs": get_timestamp_ms(row["timestamp"]),
                "when": row["timestamp"],
            }
            for row in location_history["locations"]
        ),
        pk="id",
    )


def id_for_location_history(row):
    # We want an ID that is unique but can be sorted by in
    # date order - so we use the isoformat date + the first
    # 6 characters of a hash of the JSON
    first_six = hashlib.sha1(
        json.dumps(row, separators=(",", ":"), sort_keys=True).encode("utf8")
    ).hexdigest()[:6]
    return "{}-{}".format(
        row['timestamp'],
        first_six,
    )

example locations from mine

{
    "latitudeE7": 427220206,
    "longitudeE7": -923423972,
    "accuracy": 10,
    "deviceTag": -1312429967,
    "deviceDesignation": "PRIMARY",
    "timestamp": "2019-01-08T23:31:50.867Z"
  }
{
    "latitudeE7": 427011317,
    "longitudeE7": -923448300,
    "accuracy": 5,
    "deviceTag": -1312429967,
    "deviceDesignation": "PRIMARY",
    "timestamp": "2019-01-08T23:33:53Z"
  }, 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions