Example #1
0
def main():
    # Arguments parsing
    parser = argparse.ArgumentParser(
        "All arguments are optional and read from config.ini when not passed.")
    parser.add_argument("-d",
                        "--debug",
                        action="count",
                        default=0,
                        help="Increase debugging level")
    parser.add_argument("-c",
                        "--config",
                        default='config.ini',
                        help="Configuration file")
    parser.add_argument("-s",
                        "--start-date",
                        default="",
                        help="Start date for sync in YYYY-MM-DD format")
    parser.add_argument("-e",
                        "--end-date",
                        default="",
                        help="End data for sync in YYYY-MM-DD format")
    parser.add_argument("-g",
                        "--google-creds",
                        default="auth/google.json",
                        help="Google credentials file")
    parser.add_argument("-f",
                        "--fitbit-creds",
                        default="auth/fitbit.json",
                        help="Fitbit credentials file")
    parser.add_argument("-v",
                        "--version",
                        help="Fitbit-GoogleFit migration tool version",
                        action="store_true")
    args = parser.parse_args()

    # Show version information if required
    if args.version:
        print('         fitbit-googlefit version {}'.format(VERSION))
        print('')

    # Reading configuration from config file
    config = configparser.ConfigParser()
    config.read(args.config)
    params = config['params']

    # Init objects
    helper = Helper(args.fitbit_creds, args.google_creds)
    weighTime = time.fromisoformat(params.get('weigh_time'))
    convertor = Convertor(args.google_creds, params.get('project_number'),
                          None, weighTime)
    fitbitClient, googleClient = helper.GetFitbitClient(
    ), helper.GetGoogleClient()
    remote = Remote(fitbitClient, googleClient, convertor, helper)

    # Get user's time zone info from Fitbit -- since Fitbit time stamps are not epoch and stored in user's timezone.
    userProfile = remote.ReadFromFitbit(fitbitClient.user_profile_get)
    tzinfo = dateutil.tz.gettz(userProfile['user']['timezone'])
    convertor.UpdateTimezone(tzinfo)

    # setup Google Fit data sources for each data type supported
    for dataType in [
            'steps', 'distance', 'weight', 'heart_rate', 'calories',
            'activity', 'body_fat', 'sleep'
    ]:
        remote.CreateGoogleFitDataSource(dataType)

    # Decide the start and end dates of sync
    start_date_str = args.start_date if args.start_date != '' else params.get(
        'start_date')
    end_date_str = args.end_date if args.end_date != '' else params.get(
        'end_date')
    start_date = convertor.parseHumanReadableDate(start_date_str)
    end_date = convertor.parseHumanReadableDate(end_date_str)

    # Start syncing data for the given range
    for single_date in convertor.daterange(start_date, end_date):
        date_stamp = single_date.strftime(DATE_FORMAT)
        print('------------------------------   {}  -------------------------'.
              format(date_stamp))

        #----------------------------------     steps      ------------------------
        if params.getboolean('sync_steps'):
            remote.SyncFitbitToGoogleFit('steps', date_stamp)

        #----------------------------------     distance   ------------------------
        if params.getboolean('sync_distance'):
            remote.SyncFitbitToGoogleFit('distance', date_stamp)

        #----------------------------------     heart rate ------------------------
        if params.getboolean('sync_heartrate'):
            remote.SyncFitbitToGoogleFit('heart_rate', date_stamp)

        #----------------------------------     weight     ------------------------
        if params.getboolean('sync_weight'):
            remote.SyncFitbitToGoogleFit('weight', date_stamp)

        #----------------------------------     body fat   ------------------------
        if params.getboolean('sync_body_fat'):
            remote.SyncFitbitToGoogleFit('body_fat', date_stamp)

        #----------------------------------     calories   ------------------------
        if params.getboolean('sync_calories'):
            remote.SyncFitbitToGoogleFit('calories', date_stamp)

        #----------------------------------     sleep   ------------------------
        if params.getboolean('sync_sleep'):
            remote.SyncFitbitToGoogleFit('sleep', date_stamp)

        print('')

    #----------------------------------  activity logs  ------------------------
    if params.getboolean('sync_activities'):
        remote.SyncFitbitActivitiesToGoogleFit(start_date=start_date)