included parsing of pptx files; finished image segments processing

This commit is contained in:
krut_ni 2025-06-24 14:29:31 +02:00
parent 129ddb237e
commit 32b43bbd04
2 changed files with 59 additions and 19 deletions

View File

@ -48,12 +48,12 @@ public sealed partial class RustService
var sseEvent = JsonSerializer.Deserialize<SseEvent>(jsonContent); var sseEvent = JsonSerializer.Deserialize<SseEvent>(jsonContent);
if (sseEvent != null) if (sseEvent != null)
{ {
var content = await SseHandler.ProcessEventAsync(sseEvent); var content = await SseHandler.ProcessEventAsync(sseEvent, false);
resultBuilder.Append(content); resultBuilder.Append(content);
eventCount++; eventCount++;
} }
} }
catch (JsonException ex) { return string.Empty; } catch (JsonException) { resultBuilder.AppendLine(); }
} }
var result = resultBuilder.ToString(); var result = resultBuilder.ToString();

View File

@ -1,11 +1,14 @@
using System.Text; using System.Collections.Concurrent;
using System.Text;
using AIStudio.Settings.DataModel; using AIStudio.Settings.DataModel;
namespace AIStudio.Tools; namespace AIStudio.Tools;
public static class SseHandler public static class SseHandler
{ {
public static async Task<string> ProcessEventAsync(SseEvent? sseEvent) private static readonly ConcurrentDictionary<string, List<PptxImageData>> PPTX_IMAGES = new();
public static async Task<string> ProcessEventAsync(SseEvent? sseEvent, bool extractImages = true)
{ {
var result = new StringBuilder(); var result = new StringBuilder();
@ -41,6 +44,18 @@ public static class SseHandler
case ImageMetadata imageMetadata: case ImageMetadata imageMetadata:
result.AppendLine($"{sseEvent.Content}"); result.AppendLine($"{sseEvent.Content}");
break; break;
case PresentationMetadata presentationMetadata:
var slideNumber = presentationMetadata.Presentation?.SlideNumber ?? 0;
var image = presentationMetadata.Presentation?.Image ?? null;
result.AppendLine($"{sseEvent.Content}");
if (image != null)
{
var isEnd = ProcessImageSegment(image);
if (isEnd && extractImages) { result.AppendLine(BuildImage(image.Id!)); }
}
break;
default: default:
result.AppendLine(sseEvent.Content); result.AppendLine(sseEvent.Content);
@ -60,24 +75,49 @@ public static class SseHandler
return result.ToString(); return result.ToString();
} }
private static void ProcessImageSegment(PptxImageData pptxImageData, Dictionary<string, List<string>> images, StringBuilder resultBuilder, ILogger logger) private static bool ProcessImageSegment(PptxImageData pptxImageData)
{ {
if (string.IsNullOrEmpty(pptxImageData.Id) || string.IsNullOrEmpty(pptxImageData.Content)) if (string.IsNullOrEmpty(pptxImageData.Id)) { return false; }
{
return;
}
if (!images.ContainsKey(pptxImageData.Id)) var id = pptxImageData.Id;
{ var segment = pptxImageData.Segment ?? 0;
images[pptxImageData.Id] = new List<string>(); var content = pptxImageData.Content ?? string.Empty;
} var isEnd = pptxImageData.IsEnd;
images[pptxImageData.Id].Add(pptxImageData.Content); var imageSegment = new PptxImageData()
if (pptxImageData.IsEnd)
{ {
resultBuilder.AppendLine("[Präsentationsbild eingebettet]"); Id = id,
// TODO Content = content,
} Segment = segment,
IsEnd = isEnd,
};
PPTX_IMAGES.AddOrUpdate(
id,
_ => [imageSegment],
(_, existingList) =>
{
existingList.Add(imageSegment);
return existingList;
}
);
return isEnd;
}
private static string BuildImage(string id)
{
if (!PPTX_IMAGES.TryGetValue(id, out var imageSegments)) return string.Empty;
var sortedSegments = imageSegments
.OrderBy(item => item.Segment)
.ToList();
var base64Image = string.Join(string.Empty, sortedSegments
.Where(item => item.Content != null)
.Select(item => item.Content));
PPTX_IMAGES.Remove(id, out _);
return base64Image;
} }
} }