예제 #1
0
        public void AddSnapshotMiniature(SnapshotMiniature miniature)
        {
            PreventCacheOverflow(miniature.Data.Length);

            if (!_snapshotMiniaturesCache.ContainsKey(miniature.Snapshot.Id))
            {
                _snapshotMiniaturesCache.TryAdd(miniature.Snapshot.Id, miniature);
            }
        }
예제 #2
0
        public async Task <IEnumerable <SnapshotMiniature> > GetSnapshotMiniaturesAsync(IEnumerable <LocationSnapshot> snapshots)
        {
            if (!snapshots.Any())
            {
                return(new List <SnapshotMiniature>());
            }

            var miniatures = _miniaturesCache.GetSnapshotMiniatures(snapshots);

            if (miniatures.Count() == snapshots.Count())
            {
                return(miniatures);
            }

            var picturesUrl = await GetPicturesUrl();

            picturesUrl = $"{picturesUrl}?snapshotsIds={string.Join(",", snapshots.Select(_ => _.Id))}";

            var result = await _webClient.GetAsync <IEnumerable <ExpandoObject> >(picturesUrl);

            miniatures = result.Select(_ =>
            {
                var descriptor = (IDictionary <string, object>)_;
                return(new
                {
                    PictureFileName = descriptor["pictureFileName"].ToString(),
                    Thumbnail = descriptor["thumbnail"].ToString()
                });
            }).Join(snapshots, desc => desc.PictureFileName, snap => snap.PictureFileName, (desc, snap) =>
            {
                var miniature = new SnapshotMiniature
                {
                    Snapshot = snap,
                    Data     = Convert.FromBase64String(desc.Thumbnail)
                };

                _miniaturesCache.AddSnapshotMiniature(miniature);

                return(miniature);
            })
                         .ToList();

            return(miniatures);
        }