Public Access
Use consistent meeting artifact filenames
PR and Push Build/Test / build-and-test (push) Successful in 10m14s
PR and Push Build/Test / build-and-test (push) Successful in 10m14s
This commit is contained in:
@@ -35,7 +35,7 @@ public sealed class MarkdownMeetingNoteStore : IMeetingNoteStore
|
||||
Directory.CreateDirectory(folder);
|
||||
|
||||
var path = string.IsNullOrWhiteSpace(note.Path)
|
||||
? Path.Combine(folder, $"{DateTimeOffset.Now:yyyyMMdd-HHmmss-fffffff}-{Slugify(note.Frontmatter.Title)}.md")
|
||||
? Path.Combine(folder, MeetingArtifactFileNames.Create(note.Frontmatter.StartTime ?? DateTimeOffset.Now, MeetingArtifactFileNames.Note))
|
||||
: note.Path;
|
||||
var frontmatter = PrepareFrontmatter(note.Frontmatter, path);
|
||||
var content = Render(frontmatter, note.UserNotes);
|
||||
@@ -108,16 +108,6 @@ public sealed class MarkdownMeetingNoteStore : IMeetingNoteStore
|
||||
return string.Join(Environment.NewLine, lines);
|
||||
}
|
||||
|
||||
private static string Slugify(string value)
|
||||
{
|
||||
var slug = new string(value
|
||||
.ToLowerInvariant()
|
||||
.Select(character => char.IsLetterOrDigit(character) ? character : '-')
|
||||
.ToArray());
|
||||
slug = string.Join("-", slug.Split('-', StringSplitOptions.RemoveEmptyEntries));
|
||||
return string.IsNullOrWhiteSpace(slug) ? "meeting" : slug;
|
||||
}
|
||||
|
||||
private static string EscapeScalar(string value)
|
||||
{
|
||||
return string.IsNullOrWhiteSpace(value) ? "\"\"" : EscapeListItem(value);
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
namespace MeetingAssistant.MeetingNotes;
|
||||
|
||||
public static class MeetingArtifactFileNames
|
||||
{
|
||||
public const string Note = "note";
|
||||
public const string Context = "context";
|
||||
public const string Transcript = "transcript";
|
||||
public const string Summary = "summary";
|
||||
|
||||
public static string Create(DateTimeOffset startedAt, string artifactType)
|
||||
{
|
||||
return $"{startedAt:yyyyMMdd-HHmm}-{artifactType}.md";
|
||||
}
|
||||
}
|
||||
@@ -9,10 +9,8 @@ public interface ITranscriptStore
|
||||
|
||||
Task<TranscriptSession> CreateSessionAsync(
|
||||
MeetingAssistantOptions options,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
return CreateSessionAsync(cancellationToken);
|
||||
}
|
||||
DateTimeOffset startedAt,
|
||||
CancellationToken cancellationToken);
|
||||
|
||||
Task AppendAsync(TranscriptSession session, TranscriptionSegment segment, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
@@ -156,9 +156,9 @@ public sealed class MeetingRecordingCoordinator
|
||||
|
||||
var launchProfile = ResolveProfile(launchProfileName);
|
||||
var runOptions = launchProfile.Options;
|
||||
currentSession = await transcriptStore.CreateSessionAsync(runOptions, cancellationToken);
|
||||
var recordedAudio = await recordedAudioStore.CreateSessionAsync(runOptions, cancellationToken);
|
||||
var startedAt = inactivityClock.Now;
|
||||
currentSession = await transcriptStore.CreateSessionAsync(runOptions, startedAt, cancellationToken);
|
||||
var recordedAudio = await recordedAudioStore.CreateSessionAsync(runOptions, cancellationToken);
|
||||
var assistantContextPath = GetAssistantContextPath(startedAt, runOptions);
|
||||
var summaryPath = GetSummaryPath(startedAt, runOptions);
|
||||
currentMeetingNote = await meetingNoteStore.SaveAsync(
|
||||
@@ -1491,12 +1491,12 @@ public sealed class MeetingRecordingCoordinator
|
||||
|
||||
private string GetAssistantContextPath(DateTimeOffset startedAt, MeetingAssistantOptions runOptions)
|
||||
{
|
||||
return GetMeetingArtifactPath(runOptions.Vault, runOptions.Vault.AssistantContextFolder, startedAt, "assistant-context");
|
||||
return GetMeetingArtifactPath(runOptions.Vault, runOptions.Vault.AssistantContextFolder, startedAt, MeetingArtifactFileNames.Context);
|
||||
}
|
||||
|
||||
private string GetSummaryPath(DateTimeOffset startedAt, MeetingAssistantOptions runOptions)
|
||||
{
|
||||
return GetMeetingArtifactPath(runOptions.Vault, runOptions.Vault.SummariesFolder, startedAt, "summary");
|
||||
return GetMeetingArtifactPath(runOptions.Vault, runOptions.Vault.SummariesFolder, startedAt, MeetingArtifactFileNames.Summary);
|
||||
}
|
||||
|
||||
private static string GetMeetingArtifactPath(
|
||||
@@ -1506,7 +1506,7 @@ public sealed class MeetingRecordingCoordinator
|
||||
string artifactName)
|
||||
{
|
||||
var folder = VaultPath.Resolve(vault, configuredFolder);
|
||||
return Path.Combine(folder, $"{startedAt:yyyyMMdd-HHmm}-{artifactName}.md");
|
||||
return Path.Combine(folder, MeetingArtifactFileNames.Create(startedAt, artifactName));
|
||||
}
|
||||
|
||||
private static bool ShouldAbortRunOnStop(RecordingRun run, DateTimeOffset stoppedAt)
|
||||
|
||||
@@ -17,17 +17,18 @@ public sealed class VaultTranscriptStore : ITranscriptStore
|
||||
|
||||
public async Task<TranscriptSession> CreateSessionAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
return await CreateSessionAsync(options, cancellationToken);
|
||||
return await CreateSessionAsync(options, DateTimeOffset.Now, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task<TranscriptSession> CreateSessionAsync(
|
||||
MeetingAssistantOptions options,
|
||||
DateTimeOffset startedAt,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var folder = VaultPath.Resolve(options.Vault, options.Vault.TranscriptsFolder);
|
||||
Directory.CreateDirectory(folder);
|
||||
|
||||
var fileName = $"{DateTimeOffset.Now:yyyyMMdd-HHmmss-fffffff}-transcript.md";
|
||||
var fileName = MeetingArtifactFileNames.Create(startedAt, MeetingArtifactFileNames.Transcript);
|
||||
var path = Path.Combine(folder, fileName);
|
||||
await File.WriteAllTextAsync(path, $"# Meeting Transcript{Environment.NewLine}{Environment.NewLine}", cancellationToken);
|
||||
logger.LogInformation("Created meeting transcript file {TranscriptPath}", path);
|
||||
|
||||
Reference in New Issue
Block a user