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); }
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>(), }); }
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); }