Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5e2a7b53c9 | |||
| d88cfa2cd3 | |||
| cd30876beb | |||
| 544645b73b | |||
| 76be6dc8e7 |
@@ -50,6 +50,10 @@ public class Media
|
|||||||
{ ".xml", MediaType.Code },
|
{ ".xml", MediaType.Code },
|
||||||
{ ".json", MediaType.Code },
|
{ ".json", MediaType.Code },
|
||||||
{ ".py", MediaType.Code },
|
{ ".py", MediaType.Code },
|
||||||
|
{ ".rs", MediaType.Code },
|
||||||
|
{ ".zed", MediaType.Code },
|
||||||
|
{ ".ts", MediaType.Code },
|
||||||
|
{ ".astro", MediaType.Code },
|
||||||
};
|
};
|
||||||
|
|
||||||
[BsonConstructor]
|
[BsonConstructor]
|
||||||
|
|||||||
@@ -2,13 +2,15 @@ using AobaCore.Models;
|
|||||||
|
|
||||||
using MaybeError.Errors;
|
using MaybeError.Errors;
|
||||||
|
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
using MongoDB.Bson;
|
using MongoDB.Bson;
|
||||||
using MongoDB.Driver;
|
using MongoDB.Driver;
|
||||||
using MongoDB.Driver.GridFS;
|
using MongoDB.Driver.GridFS;
|
||||||
|
|
||||||
namespace AobaCore.Services;
|
namespace AobaCore.Services;
|
||||||
|
|
||||||
public class AobaService(IMongoDatabase db)
|
public class AobaService(IMongoDatabase db, ThumbnailService thumbnailService, ILogger<AobaService> logger)
|
||||||
{
|
{
|
||||||
private readonly IMongoCollection<Media> _media = db.GetCollection<Media>("media");
|
private readonly IMongoCollection<Media> _media = db.GetCollection<Media>("media");
|
||||||
private readonly GridFSBucket _gridFs = new(db);
|
private readonly GridFSBucket _gridFs = new(db);
|
||||||
@@ -69,6 +71,7 @@ public class AobaService(IMongoDatabase db)
|
|||||||
{
|
{
|
||||||
var fileId = await _gridFs.UploadFromStreamAsync(filename, data, cancellationToken: cancellationToken);
|
var fileId = await _gridFs.UploadFromStreamAsync(filename, data, cancellationToken: cancellationToken);
|
||||||
var media = new Media(fileId, filename, owner);
|
var media = new Media(fileId, filename, owner);
|
||||||
|
|
||||||
await AddMediaAsync(media, cancellationToken);
|
await AddMediaAsync(media, cancellationToken);
|
||||||
return media;
|
return media;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ namespace AobaCore.Services;
|
|||||||
public class ThumbnailService(IMongoDatabase db, AobaService aobaService)
|
public class ThumbnailService(IMongoDatabase db, AobaService aobaService)
|
||||||
{
|
{
|
||||||
private readonly GridFSBucket _gridfs = new GridFSBucket(db);
|
private readonly GridFSBucket _gridfs = new GridFSBucket(db);
|
||||||
private Lock _lock = new();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
@@ -121,25 +120,35 @@ public class ThumbnailService(IMongoDatabase db, AobaService aobaService)
|
|||||||
public Maybe<Stream> GenerateVideoThumbnail(Stream data, ThumbnailSize size, CancellationToken cancellationToken = default)
|
public Maybe<Stream> GenerateVideoThumbnail(Stream data, ThumbnailSize size, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
var w = (int)size;
|
var w = (int)size;
|
||||||
var source = new MemoryStream();
|
var fn = ObjectId.GenerateNewId().ToString();
|
||||||
|
var filePath = $"/tmp/{fn}.in";
|
||||||
|
using var source = new FileStream(filePath, FileMode.CreateNew);
|
||||||
data.CopyTo(source);
|
data.CopyTo(source);
|
||||||
source.Position = 0;
|
source.Flush();
|
||||||
var output = new MemoryStream();
|
source.Dispose();
|
||||||
FFMpegArguments.FromPipeInput(new StreamPipeSource(source), opt =>
|
data.Dispose();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
opt.WithCustomArgument("-t 5");
|
var output = new MemoryStream();
|
||||||
}).OutputToPipe(new StreamPipeSink(output), opt =>
|
FFMpegArguments.FromFileInput(filePath, false, opt =>
|
||||||
|
{
|
||||||
|
opt.WithCustomArgument("-t 5");
|
||||||
|
}).OutputToPipe(new StreamPipeSink(output), opt =>
|
||||||
|
{
|
||||||
|
opt.WithCustomArgument($"-vf \"crop='min(in_w,in_h)':'min(in_w,in_h)',scale={w}:{w}\" -loop 0 -r 15")
|
||||||
|
.ForceFormat("webp");
|
||||||
|
}).ProcessSynchronously();
|
||||||
|
output.Position = 0;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
catch(Exception ex)
|
||||||
{
|
{
|
||||||
opt.WithCustomArgument($"-vf \"crop='min(in_w,in_h)':'min(in_w,in_h)',scale={w}:{w}\" -loop 0 -r 15")
|
return ex;
|
||||||
.ForceFormat("webp");
|
}
|
||||||
}).Configure(cfg =>
|
finally
|
||||||
{
|
{
|
||||||
#if !DEBUG
|
File.Delete(filePath);
|
||||||
cfg.BinaryFolder = "/usr/bin";
|
}
|
||||||
#endif
|
|
||||||
}).ProcessSynchronously();
|
|
||||||
output.Position = 0;
|
|
||||||
return output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Maybe<Stream>> GenerateDocumentThumbnailAsync(Stream data, ThumbnailSize size, CancellationToken cancellationToken = default)
|
public async Task<Maybe<Stream>> GenerateDocumentThumbnailAsync(Stream data, ThumbnailSize size, CancellationToken cancellationToken = default)
|
||||||
|
|||||||
@@ -32,13 +32,14 @@ RUN dx bundle --platform web
|
|||||||
# Server Build
|
# Server Build
|
||||||
# This stage is used when running from VS in fast mode (Default for Debug configuration)
|
# This stage is used when running from VS in fast mode (Default for Debug configuration)
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
|
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
|
||||||
|
RUN apt-get update && apt-get install -y ffmpeg
|
||||||
USER $APP_UID
|
USER $APP_UID
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
EXPOSE 8081
|
EXPOSE 8081
|
||||||
|
|
||||||
# This stage is used to build the service project
|
# This stage is used to build the service project
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
|
FROM mcr.microsoft.com/dotnet/sdk:9.0-noble AS build
|
||||||
ARG BUILD_CONFIGURATION=Release
|
ARG BUILD_CONFIGURATION=Release
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
COPY ["AobaServer/AobaServer.csproj", "AobaServer/"]
|
COPY ["AobaServer/AobaServer.csproj", "AobaServer/"]
|
||||||
@@ -47,7 +48,7 @@ COPY . .
|
|||||||
# Copy Built bundle from client builder
|
# Copy Built bundle from client builder
|
||||||
COPY --from=client-builder /app/AobaClient/target/dx/aoba-client/release/web/public /src/AobaServer/wwwroot
|
COPY --from=client-builder /app/AobaClient/target/dx/aoba-client/release/web/public /src/AobaServer/wwwroot
|
||||||
WORKDIR "/src/AobaServer"
|
WORKDIR "/src/AobaServer"
|
||||||
RUN dotnet build "./AobaServer.csproj" -c $BUILD_CONFIGURATION -o /app/build
|
# RUN dotnet build "./AobaServer.csproj" -c $BUILD_CONFIGURATION #-o /app/build
|
||||||
|
|
||||||
# This stage is used to publish the service project to be copied to the final stage
|
# This stage is used to publish the service project to be copied to the final stage
|
||||||
FROM build AS publish
|
FROM build AS publish
|
||||||
@@ -57,8 +58,8 @@ RUN dotnet publish "./AobaServer.csproj" -c $BUILD_CONFIGURATION -o /app/publish
|
|||||||
# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
|
# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
|
||||||
FROM base AS final
|
FROM base AS final
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY --from=publish /app/publish .
|
COPY --from=publish /app/publish .
|
||||||
COPY --from=client-builder /bin/ffmpeg /bin/ffprobe /bin/ffplay /usr/bin/
|
ARG VERSION
|
||||||
|
|
||||||
ENV APP_VERSION=$VERSION
|
ENV APP_VERSION=$VERSION
|
||||||
ENTRYPOINT ["dotnet", "AobaServer.dll"]
|
ENTRYPOINT ["dotnet", "AobaServer.dll"]
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ using System.Text.Json.Serialization;
|
|||||||
|
|
||||||
namespace AobaServer.Services;
|
namespace AobaServer.Services;
|
||||||
|
|
||||||
public class AobaRpcService(AobaService aobaService, AccountsService accountsService, AuthInfo authInfo) : AobaRpc.AobaRpcBase
|
public class AobaRpcService(AobaService aobaService, AccountsService accountsService, AuthConfigService authConfig) : AobaRpc.AobaRpcBase
|
||||||
{
|
{
|
||||||
public override async Task<MediaResponse> GetMedia(Id request, ServerCallContext context)
|
public override async Task<MediaResponse> GetMedia(Id request, ServerCallContext context)
|
||||||
{
|
{
|
||||||
@@ -37,6 +37,7 @@ public class AobaRpcService(AobaService aobaService, AccountsService accountsSer
|
|||||||
var user = await accountsService.GetUserAsync(userId, context.CancellationToken);
|
var user = await accountsService.GetUserAsync(userId, context.CancellationToken);
|
||||||
if (user == null)
|
if (user == null)
|
||||||
return new ShareXResponse { Error = "User does not exist" };
|
return new ShareXResponse { Error = "User does not exist" };
|
||||||
|
var authInfo = await authConfig.GetDefaultAuthInfoAsync();
|
||||||
var token = user.GetToken(authInfo);
|
var token = user.GetToken(authInfo);
|
||||||
var dest = new ShareXDestination
|
var dest = new ShareXDestination
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user