Exemplo n.º 1
0
        private string ReadMediaFileEncoderStateJson(MediaFile mediaFile, out string mediaFileStateJson)
        {
            var fileStateInfosJson = (from ms in _mediaDataContext.Get <MediaFileStateInfo>()
                                      where ms.MediaFileId == mediaFile.Id
                                      select ms.StateInfoJson).SingleOrDefault();

            string encoderStateInfoJson = string.Empty;

            if (!string.IsNullOrEmpty(fileStateInfosJson))
            {
                var fileStateInfos = JsonConvert.DeserializeObject <MediaFileStateInfos>(fileStateInfosJson);
                using (var encoderFile = _storage.OpenAndRestoreState($"{mediaFile.Url}.enc.json",
                                                                      fileStateInfos.EncoderFileStateJson))
                {
                    encoderStateInfoJson = System.Text.Encoding.UTF8.GetString(encoderFile.ReadAllBytes());
                }

                mediaFileStateJson = fileStateInfos.MediaFileStateJson;
            }
            else
            {
                mediaFileStateJson = string.Empty;
            }

            return(encoderStateInfoJson);
        }
        public byte[] ReadImageResource(string imageGroupId, MediaImageSize imageSize, out string imageType)
        {
            imageType = string.Empty;

            Guid imageGroupGuid;

            if (!Guid.TryParse(imageGroupId, out imageGroupGuid))
            {
                return(null);
            }

            var mediaImage = (from mi in _mediaDataContext.Get <MediaImage>()
                              where mi.ImageGroup.Id == imageGroupGuid &&
                              mi.ImageSize == imageSize && mi.IsArchived == false
                              select new { Format = mi.Format, Url = mi.Url })
                             .FirstOrDefault();

            if (mediaImage == null || string.IsNullOrEmpty(mediaImage.Url))
            {
                return(null);
            }

            byte[] imageData = null;
            imageType = MediaFormatExtension.GetMimeType(mediaImage.Format);

            using (var stream = _storage.Open(mediaImage.Url))
            {
                imageData = new byte[stream.Length];
                if (stream.Read(imageData, 0, imageData.Length) != imageData.Length)
                {
                    imageData = null;
                }
            }
            return(imageData);
        }
Exemplo n.º 3
0
        public MediaLibraryInfo GetLibraryInfo(DateTime?updatedSince = null)
        {
            int updatedSinceUnix = updatedSince == null ? 0 : ((DateTime)updatedSince).ToUniversalTime().ToUnixTimestamp();
            var songs            = (from s in _dataContext.Get <Song>()
                                    where s.LastUpdatedUTC > updatedSinceUnix
                                    select new { Id = s.Id, AlbumId = s.AlbumId, ArtistId = s.Album.ArtistId }).ToList();

            var artistIds = songs.Select(x => x.ArtistId).Distinct();
            var artists   = (from art in _dataContext.Get <Artist>()
                             join aai in _dataContext.Get <ArtistAndMediaImage>() on art.Id equals aai.ArtistId into aaiGroup
                             from aai in aaiGroup.DefaultIfEmpty()
                             where artistIds.Contains(art.Id)
                             select new MLArtist
            {
                Id = art.Id.ToString(),
                Name = art.Name,
                Genre = art.Genre.Name,
                ArtworkImageId = aai != null ? aai.MediaImageGroupId.ToString() : string.Empty
            }).ToList();

            foreach (var artistId in artistIds)
            {
                var albumIds = songs.Where(x => x.ArtistId == artistId).Select(x => x.AlbumId).Distinct();
                var albums   = (from alb in _dataContext.Get <Album>()
                                join aai in _dataContext.Get <AlbumAndMediaImage>() on alb.Id equals aai.AlbumId into aaiGroup
                                from aai in aaiGroup.DefaultIfEmpty()
                                where albumIds.Contains(alb.Id)
                                select new MLAlbum
                {
                    Id = alb.Id.ToString(),
                    Name = alb.Name,
                    Year = alb.Year,
                    ArtworkImageId = aai != null ? aai.MediaImageGroupId.ToString() : string.Empty
                }).ToList();


                foreach (var albumId in albumIds)
                {
                    var songIds    = songs.Where(x => x.AlbumId == albumId).Select(x => x.Id);
                    var albumSongs = (from son in _dataContext.Get <Song>()
                                      where songIds.Contains(son.Id)
                                      select new MLSong
                    {
                        Id = son.Id.ToString(),
                        Name = son.Name,
                        DurationSec = son.DurationSec,
                        Track = son.TrackNumber
                    }).ToList();

                    albums.Find(x => x.Id == albumId.ToString()).Songs = albumSongs;
                }

                artists.Find(x => x.Id == artistId.ToString()).Albums = albums;
            }

            return(new MediaLibraryInfo
            {
                Artists = artists,
                Playlists = new List <MLPlaylist>(),
            });
        }
Exemplo n.º 4
0
        public bool UploadMedia(Stream media, string fileName, Guid userId, string mediaFormat = MediaFormatExtension.AudioMp3)
        {
            // Get latest not synced upload by the user or create new media upload entry.
            Guid mediaUploadId = (from mu in _mediaDataContext.Get <MediaUpload>()
                                  where mu.UserId == userId && mu.IsSynced == false
                                  select mu.Id).FirstOrDefault();

            // Create media upload entry.
            if (mediaUploadId == Guid.Empty)
            {
                mediaUploadId = Guid.NewGuid();
                _mediaDataContext.Add(new MediaUpload()
                {
                    Id     = mediaUploadId,
                    UserId = userId
                });

                _mediaDataContext.SaveChanges();
            }

            // Copy media file under media upload entry.
            string mediaPath = $"{mediaUploadId}{DirDelimiter}{fileName}";

            if (!_localStorage.Store(mediaPath, media, MediaFormatExtension.GetMimeType(mediaFormat)))
            {
                return(false);
            }

            // Read metadata from media file and serialize into json.
            var metadataJson = string.Empty;

            using (var mediaFile = _localStorage.Open(mediaPath))
            {
                IEnumerable <AttachedPicture> pictures;
                var metadata = mediaFile.ReadMetadata(mediaFormat, out pictures);

                // Create attached picture files.
                if (pictures != null && pictures.Any())
                {
                    metadata.AlbumImagesUrl = new Dictionary <AttachedPictureType, string>();

                    foreach (var pic in pictures)
                    {
                        string filePath = $"{mediaUploadId}{DirDelimiter}artwork{DirDelimiter}{fileName}-{pic.Type}.jpeg";
                        using (var pictureStream = new MemoryStream(pic.PictureData, false))
                        {
                            if (_localStorage.Store(filePath, pictureStream, MediaFormatExtension.GetMimeType(mediaFormat)))
                            {
                                if (pic.Type == AttachedPictureType.Artist || pic.Type == AttachedPictureType.Band)
                                {
                                    metadata.ArtistImageUrl = filePath;
                                }
                                else
                                {
                                    metadata.AlbumImagesUrl.Add(pic.Type, filePath);
                                }
                            }
                        }
                    }
                }

                if (metadata != null)
                {
                    metadataJson = Newtonsoft.Json.JsonConvert.SerializeObject(metadata);
                }
            }

            // Create entry in media table using mediaupload id.
            _mediaDataContext.Add(new MediaFile()
            {
                Id            = Guid.NewGuid(),
                MediaUploadId = mediaUploadId,
                UserId        = userId,
                Format        = mediaFormat,
                MediaInfoJson = metadataJson,
                TempUrl       = mediaPath,
                FileSize      = media.Length,
            });

            // var mediaUpload = _mediaDataContext.Get<MediaUpload>().Where(x => x.Id == mediaUploadId).FirstOrDefault();
            // mediaUpload.NumOfMedia++;
            //_mediaDataContext.Update(mediaUpload);

            _mediaDataContext.Update <MediaUpload>(x => x.Id == mediaUploadId, x => x.NumOfMedia++);
            _mediaDataContext.SaveChanges();
            return(true);
        }