Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 69 additions & 3 deletions Activities.Strava/Activities/ManualSpeedOverrideService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,15 @@ namespace Activities.Strava.Activities
// 1-5: 15.3 km/t (or km/h)
// 1-5: 15,3 km/t (or km/h)
// 1,3,5,7-9: 15,3 km/t (or km/h)
// 1-5: 546.5 m (no support for km, to avoid parse confusion with km/h)
//
// Where e.g. 1-5 can be a range or just a single number. If overlapping overrides
// exist, it is undefined which one wins.
//
// For speed overrides, the lap index is before interval detection (so that
// it can be used to influence it), but distance overrides refer to interval numbers,
// as these are typically smaller adjustments (and they also need to run after
// Bislett adjustments, to be able to override them).
public static class ManualSpeedOverrideService
{
public static DetailedActivity TryParseManualSpeedOverrides(this DetailedActivity activity)
Expand Down Expand Up @@ -45,7 +51,41 @@ public static DetailedActivity TryParseManualSpeedOverrides(this DetailedActivit
};
}

// Recalculate global values, now that we may have changed laps.
return RecalcGlobalValues(activity);
}

public static DetailedActivity TryParseManualDistanceOverrides(this DetailedActivity activity)
{
var overrides = GetDistanceOverridesFromDescription(activity.Description);
overrides.AddRange(GetDistanceOverridesFromDescription(activity.PrivateNote));
if (!overrides.Any())
{
return activity;
}

foreach (var o in overrides)
{
var intervalIndex = 0;
activity = activity with
{
Laps = activity.Laps
.Select((lap, index) => lap.IsInterval && intervalIndex++ == o.Lap ? lap with
{
MovingTime = lap.ElapsedTime,
AverageSpeed = o.Distance / lap.ElapsedTime,
MaxSpeed = o.Distance / lap.ElapsedTime,
Distance = o.Distance
} : lap)
.ToList()
};
}

return RecalcGlobalValues(activity);
}

// Recalculate global values, now that we may have changed laps.
static DetailedActivity RecalcGlobalValues(this DetailedActivity activity)
{
activity = activity with
{
Distance = activity.Laps.Sum((lap) => lap.Distance),
Expand All @@ -60,6 +100,8 @@ public static DetailedActivity TryParseManualSpeedOverrides(this DetailedActivit
return activity;
}

const String lapsRegex = @"(?<laps> \d+ (?: [-–] \d+ )? (?: \s* , \s* \d+ (?: [-–] \d+ )? )* )";

public static List<(double Speed, int Lap)> GetSpeedOverridesFromDescription(string description)
{
var result = new List<(double Speed, int Lap)>();
Expand All @@ -69,8 +111,6 @@ public static DetailedActivity TryParseManualSpeedOverrides(this DetailedActivit
return result;
}

var lapsRegex = @"(?<laps> \d+ (?: [-–] \d+ )? (?: \s* , \s* \d+ (?: [-–] \d+ )? )* )";

var paceMatches = Regex.Matches(
description,
lapsRegex + @"\s* : \s* (?<min> \d+) : (?<sec> \d+) \s* / \s* km",
Expand Down Expand Up @@ -103,6 +143,32 @@ public static DetailedActivity TryParseManualSpeedOverrides(this DetailedActivit
return result;
}

public static List<(double Distance, int Lap)> GetDistanceOverridesFromDescription(string description)
{
var result = new List<(double Speed, int Lap)>();

if (string.IsNullOrWhiteSpace(description))
{
return result;
}

var distanceMatches = Regex.Matches(
description,
lapsRegex + @"\s* : \s* (?<dist> \d+ (?: [.,] \d* )? ) \s* m",
RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
foreach (Match match in distanceMatches)
{
var distance = Convert.ToDouble(match.Groups["dist"].Value.Replace(",", "."),
CultureInfo.InvariantCulture);
foreach (var lap in ParseLapRanges(match.Groups["laps"].Value))
{
result.Add((distance, lap));
}
}

return result;
}

static List<int> ParseLapRanges(string description)
{
var result = new List<int>();
Expand Down
1 change: 1 addition & 0 deletions Activities.Strava/Endpoints/ActivitiesClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ public static DetailedActivity ProcessActivity(DetailedActivity activity)
activity = activity.TryParseLactateMeasurements();
activity = activity.TryParseFeelingParameter();
activity = activity.TryAdjustBislettLaps();
activity = activity.TryParseManualDistanceOverrides();
return activity;
}

Expand Down