Skip to content

Commit 7d0d778

Browse files
committed
uploaded item old foreign keys dropped
1 parent 774a339 commit 7d0d778

File tree

8 files changed

+935
-63
lines changed

8 files changed

+935
-63
lines changed
Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,16 @@
1-
using System.Globalization;
2-
using ExifLibrary;
3-
using OneShelf.Common;
1+
using ExifLibrary;
42

53
namespace OneShelf.Videos.BusinessLogic.Services;
64

75
public class ExifService
86
{
9-
public async Task<DateTime> SetExifTimestamp(string path, string tempFileName)
7+
public async Task SetExifTimestamp(string path, string tempFileName, DateTime timestamp)
108
{
119
var image = await ImageFile.FromFileAsync(path);
1210
if (image.Errors.Any()) throw new($"Some image errors, {path}.");
1311
if (image.Properties.Contains(ExifTag.DateTime)) throw new($"The image contains a datetime, {path}.");
1412

15-
var dateTime = DateTime.ParseExact(Path.GetFileNameWithoutExtension(path).SelectSingle(x => x.Substring(x.IndexOf('@') + 1)), "dd-MM-yyyy_HH-mm-ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
16-
17-
image.Properties.Set(ExifTag.DateTime, dateTime);
13+
image.Properties.Set(ExifTag.DateTime, timestamp);
1814
await image.SaveAsync(tempFileName);
19-
20-
return dateTime;
2115
}
2216
}

OneShelf.Videos/OneShelf.Videos.BusinessLogic/Services/Service1.cs

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,37 @@ public Service1(IOptions<VideosOptions> options, VideosDatabase videosDatabase,
2323
_logger = logger;
2424
}
2525

26-
public async Task<List<(long chatId, int messageId, string path, DateTime publishedOn)>> GetExport1()
26+
public async Task<List<(int mediaId, string path, DateTime publishedOn)>> GetExport1()
2727
{
28-
var messages = await _videosDatabase.StaticMessages
29-
.Where(x => x.SelectedType == StaticMessageSelectedType.Photo)
30-
.Include(x => x.StaticChat)
28+
var messages = await _videosDatabase.Mediae
29+
.Where(x => x.StaticMessage != null)
30+
.Where(x => x.StaticMessage!.SelectedType == StaticMessageSelectedType.Photo)
31+
.Where(x => x.StaticMessage!.Media != null)
32+
.Where(x => x.UploadedItem == null)
33+
.Include(x => x.StaticMessage)
34+
.ThenInclude(x => x.StaticChat)
3135
.ThenInclude(x => x.StaticChatFolder)
32-
.Where(x => !_videosDatabase.UploadedItems.Any(y => y.StaticChatId == x.StaticChatId && y.StaticMessageId == x.Id))
3336
.ToListAsync();
3437

3538
return messages
36-
.Select(x => (x.StaticChat.Id, x.Id, Path.Combine(x.StaticChat.StaticChatFolder.Root, x.Photo!), x.Date))
39+
.Select(x => (x.Id, Path.Combine(x.StaticMessage!.StaticChat.StaticChatFolder.Root, x.StaticMessage.Photo!), x.StaticMessage.Date))
3740
.ToList();
3841
}
3942

40-
public async Task<List<(long chatId, int messageId, string path, DateTime publishedOn)>> GetExport2()
43+
public async Task<List<(int mediaId, string path, DateTime publishedOn)>> GetExport2()
4144
{
42-
var messages = await _videosDatabase.StaticMessages
43-
.Where(x => x.SelectedType == StaticMessageSelectedType.Video)
44-
.Include(x => x.StaticChat)
45+
var messages = await _videosDatabase.Mediae
46+
.Where(x => x.StaticMessage != null)
47+
.Where(x => x.StaticMessage!.SelectedType == StaticMessageSelectedType.Video)
48+
.Where(x => x.StaticMessage!.Media != null)
49+
.Where(x => x.UploadedItem == null)
50+
.Include(x => x.StaticMessage)
51+
.ThenInclude(x => x.StaticChat)
4552
.ThenInclude(x => x.StaticChatFolder)
46-
.Where(x => !_videosDatabase.UploadedItems.Any(y => y.StaticChatId == x.StaticChatId && y.StaticMessageId == x.Id))
4753
.ToListAsync();
4854

4955
return messages
50-
.Select(x => (x.StaticChat.Id, x.Id, Path.Combine(x.StaticChat.StaticChatFolder.Root, x.File!), x.Date))
56+
.Select(x => (x.Id, Path.Combine(x.StaticMessage!.StaticChat.StaticChatFolder.Root, x.StaticMessage.File!), x.StaticMessage.Date))
5157
.ToList();
5258
}
5359

@@ -93,32 +99,32 @@ public async Task SaveMessages()
9399
_logger.LogInformation("Saved.");
94100
}
95101

96-
public async Task<List<(int albumId, string title, List<(string? mediaItemId, long chatId, int messageId)> items)>> GetAlbums()
102+
public async Task<List<(int albumId, string title, List<(string mediaItemId, int mediaId)> items)>> GetAlbums()
97103
{
98104
var albums = await _videosDatabase.Albums
99105
.Where(x => x.UploadedAlbum == null)
100106
.Include(x => x.Constraints)
101107
.ThenInclude(x => x.StaticTopic)
102108
.ToListAsync();
103109

104-
var messages = (await _videosDatabase.StaticMessages
105-
.Where(x => x.SelectedType.HasValue && x.StaticTopicId.HasValue)
110+
var messages = (await _videosDatabase.Mediae
111+
.Where(x => x.StaticMessage != null)
112+
.Where(x => x.StaticMessage!.SelectedType.HasValue && x.StaticMessage.StaticTopicId.HasValue)
106113
.Select(m => new
107114
{
108-
TopicId = m.StaticTopicId,
109-
ChatId = m.StaticChatId,
110-
m.Width,
111-
m.Height,
112-
m.Date,
115+
TopicId = m.StaticMessage!.StaticTopicId,
116+
m.StaticMessage.Width,
117+
m.StaticMessage.Height,
118+
m.StaticMessage.Date,
119+
m.StaticMessage.SelectedType,
113120
m.Id,
114-
m.SelectedType,
115121
})
116122
.ToListAsync())
117123
.ToLookup(x => x.TopicId!.Value);
118124

119125
var uploadedItems = await _videosDatabase.UploadedItems
120126
.Where(i => _videosDatabase.InventoryItems.Any(j => j.Id == i.MediaItemId && (j.IsPhoto || j.MediaMetadataVideoStatus == "READY")))
121-
.ToDictionaryAsync(x => new { ChatId = x.StaticChatId, MessageId = x.StaticMessageId, }, x => x.MediaItemId);
127+
.ToDictionaryAsync(x => x.MediaId, x => x.MediaItemId);
122128

123129
return albums
124130
.Select(a => (a.Id, a.Title,
@@ -132,9 +138,11 @@ public async Task SaveMessages()
132138
if (c.Before.HasValue && m.Date > c.Before) return false;
133139
return true;
134140
}))
135-
.Select(x => new { x.ChatId, MessageId = x.Id })
141+
.Select(x => x.Id)
136142
.Distinct()
137-
.Select(x => (uploadedItems.GetValueOrDefault(x), x.ChatId, x.MessageId))
143+
.Select(x => (mediaItemId: uploadedItems.GetValueOrDefault(x), x))
144+
.Where(x => x.mediaItemId != null)
145+
.Select(x => (x.mediaItemId!, x.x))
138146
.ToList()))
139147
.ToList();
140148
}

OneShelf.Videos/OneShelf.Videos.BusinessLogic/Services/Service2.cs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using OneShelf.Common;
55
using OneShelf.Videos.Database;
66
using OneShelf.Videos.Database.Models;
7+
using System.Globalization;
78

89
namespace OneShelf.Videos.BusinessLogic.Services;
910

@@ -68,15 +69,15 @@ public async Task SaveInventory()
6869
_logger.LogInformation("Saved.");
6970
}
7071

71-
public async Task UploadPhotos(List<(long chatId, int messageId, string path, DateTime publishedOn)> items)
72+
public async Task UploadPhotos(List<(int mediaId, string path, DateTime publishedOn)> items)
7273
{
7374
await _extendedGooglePhotosService.LoginAsync();
7475

75-
var itemsByKey = items.ToDictionary(x => (x.chatId, x.messageId));
76-
var fileNameTimestamps = new Dictionary<(long chatId, int messageId), DateTime>();
76+
var itemsByKey = items.ToDictionary(x => x.mediaId);
77+
var fileNameTimestamps = new Dictionary<int, DateTime>();
7778
var result = await _extendedGooglePhotosService.UploadMultiple(
7879
items
79-
.Select(x => ((x.chatId, x.messageId), x.path, (string?)null))
80+
.Select(x => (x.mediaId, x.path, (string?)null))
8081
.ToList(),
8182
newItems => AddToDatabase(itemsByKey, newItems, fileNameTimestamps),
8283
async (x, i) =>
@@ -88,11 +89,13 @@ public async Task UploadPhotos(List<(long chatId, int messageId, string path, Da
8889
}
8990

9091
Directory.CreateDirectory(tempDirectory);
91-
var tempFileName = Path.Combine(Path.GetTempPath(), i.ToString(), Path.GetFileName(itemsByKey[x].path));
92-
var timestampFromFile = await _exifService.SetExifTimestamp(itemsByKey[x].path, tempFileName);
92+
var fileName = itemsByKey[x].path;
93+
var tempFileName = Path.Combine(Path.GetTempPath(), i.ToString(), Path.GetFileName(fileName));
94+
var exifTimestamp = DateTime.ParseExact(Path.GetFileNameWithoutExtension(fileName).SelectSingle(x => x.Substring(x.IndexOf('@') + 1)), "dd-MM-yyyy_HH-mm-ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
95+
await _exifService.SetExifTimestamp(fileName, tempFileName, exifTimestamp);
9396
lock (fileNameTimestamps)
9497
{
95-
fileNameTimestamps[x] = timestampFromFile;
98+
fileNameTimestamps[x] = exifTimestamp;
9699
}
97100

98101
return tempFileName;
@@ -102,19 +105,19 @@ public async Task UploadPhotos(List<(long chatId, int messageId, string path, Da
102105
Console.WriteLine($"started: {items.Count}, finished: {result.Count}");
103106
}
104107

105-
public async Task UploadVideos(List<(long chatId, int messageId, string path, DateTime publishedOn)> items)
108+
public async Task UploadVideos(List<(int mediaId, string path, DateTime publishedOn)> items)
106109
{
107110
await _extendedGooglePhotosService.LoginAsync();
108111

109-
var added = (await _videosDatabase.UploadedItems.Select(x => new { ChatId = x.StaticChatId, MessageId = x.StaticMessageId }).ToListAsync()).ToHashSet();
112+
var added = (await _videosDatabase.UploadedItems.Select(x => x.MediaId).ToListAsync()).ToHashSet();
110113
Console.WriteLine($"initial items: {items.Count}");
111-
items = items.Where(x => !added.Contains(new { ChatId = x.chatId, MessageId = x.messageId })).ToList();
114+
items = items.Where(x => !added.Contains(x.mediaId)).ToList();
112115
Console.WriteLine($"remaining items: {items.Count}");
113116

114-
var itemsByKey = items.ToDictionary(x => (x.chatId, x.messageId));
117+
var itemsByKey = items.ToDictionary(x => x.mediaId);
115118
var result = await _extendedGooglePhotosService.UploadMultiple(
116119
items
117-
.Select(x => ((x.chatId, x.messageId), x.path,
120+
.Select(x => (x.mediaId, x.path,
118121
//$"chatId = {x.chatId}, messageId = {x.messageId}, published on = {x.publishedOn}, filename = {Path.GetFileName(x.path)}"
119122
(string?)null))
120123
.ToList(),
@@ -126,22 +129,22 @@ public async Task UploadVideos(List<(long chatId, int messageId, string path, Da
126129
}
127130

128131
private async Task AddToDatabase(
129-
Dictionary<(long chatId, int messageId), (long chatId, int messageId, string path, DateTime publishedOn)> items,
130-
Dictionary<(long chatId, int messageId), NewMediaItemResult> newItems,
131-
Dictionary<(long chatId, int messageId), DateTime>? fileNameTimestamps = null)
132+
Dictionary<int, (int mediaId, string path, DateTime publishedOn)> items,
133+
Dictionary<int, NewMediaItemResult> newItems,
134+
Dictionary<int, DateTime>? fileNameTimestamps = null)
132135
{
133-
_videosDatabaseOperations.AddItems(newItems.Select(i => items[i.Key].SelectSingle(x => (x.chatId, x.messageId, x.path, x.publishedOn, result: i.Value, fileNameTimestamp: fileNameTimestamps?[i.Key]))));
136+
_videosDatabaseOperations.AddItems(newItems.Select(i => items[i.Key].SelectSingle(x => (x.mediaId, x.path, x.publishedOn, result: i.Value, fileNameTimestamp: fileNameTimestamps?[i.Key]))));
134137
await _videosDatabase.SaveChangesAsync();
135138
}
136139

137-
public async Task CreateAlbums(List<(int albumId, string title, List<(string? mediaItemId, long chatId, int messageId)> items)> albums)
140+
public async Task CreateAlbums(List<(int albumId, string title, List<(string mediaItemId, int mediaId)> items)> albums)
138141
{
139142
await _extendedGooglePhotosService.LoginAsync();
140143
foreach (var (albumId, title, items) in albums)
141144
{
142145
_logger.LogInformation("{title} uploading...", title);
143146
var googleAlbum = await _extendedGooglePhotosService.CreateAlbumAsync(title);
144-
await _extendedGooglePhotosService.AddMediaItemsToAlbumWithRetryAsync(googleAlbum!.id, items.Where(x => x.mediaItemId != null).Select(x => x.mediaItemId!).ToList());
147+
await _extendedGooglePhotosService.AddMediaItemsToAlbumWithRetryAsync(googleAlbum!.id, items.Select(x => x.mediaItemId).ToList());
145148

146149
_videosDatabase.UploadedAlbums.Add(new()
147150
{

OneShelf.Videos/OneShelf.Videos.BusinessLogic/Services/VideosDatabaseOperations.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ namespace OneShelf.Videos.BusinessLogic.Services;
77

88
public class VideosDatabaseOperations(VideosDatabase videosDatabase)
99
{
10-
public void AddItems(IEnumerable<(long chatId, int messageId, string path, DateTime publishedOn, NewMediaItemResult result, DateTime? fileNameTimestamp)> items)
10+
public void AddItems(IEnumerable<(int mediaId, string path, DateTime publishedOn, NewMediaItemResult result, DateTime? fileNameTimestamp)> items)
1111
{
1212
videosDatabase.UploadedItems.AddRange(items.Select(i => new UploadedItem
1313
{
1414
CreatedOn = DateTime.Now,
15-
StaticChatId = i.chatId,
16-
StaticMessageId = i.messageId,
15+
MediaId = i.mediaId,
1716
TelegramPublishedOn = i.publishedOn,
1817
Status = i.result.status.status,
1918
StatusCode = i.result.status.code,

0 commit comments

Comments
 (0)