Ejemplo n.º 1
0
    private Option <string> LocateNfoFile(MusicVideo musicVideo)
    {
        string path = musicVideo.MediaVersions.Head().MediaFiles.Head().Path;

        return(Optional(Path.ChangeExtension(path, "nfo"))
               .Filter(s => _localFileSystem.FileExists(s))
               .HeadOrNone());
    }
 public void LoadMiscFunctions(int trackId)
 {
     _track = DAL.AdHocData.Tracks.FirstOrDefault(x => x.Id == trackId);
     if (_track != null)
     {
         Vid = DAL.AdHocData.MusicVideos.FirstOrDefault(x => x.TrackId == trackId);
     }
 }
Ejemplo n.º 3
0
    private Option <string> LocateThumbnail(MusicVideo musicVideo)
    {
        string path = musicVideo.MediaVersions.Head().MediaFiles.Head().Path;

        return(ImageFileExtensions
               .Map(ext => Path.ChangeExtension(path, ext))
               .Filter(f => _localFileSystem.FileExists(f))
               .HeadOrNone());
    }
    private static List <Subtitle> GetSubtitles(PlayoutItemWithPath playoutItemWithPath)
    {
        List <Subtitle> allSubtitles = playoutItemWithPath.PlayoutItem.MediaItem switch
        {
            Episode episode => Optional(episode.EpisodeMetadata).Flatten().HeadOrNone()
            .Map(mm => mm.Subtitles)
            .IfNone(new List <Subtitle>()),
            Movie movie => Optional(movie.MovieMetadata).Flatten().HeadOrNone()
            .Map(mm => mm.Subtitles)
            .IfNone(new List <Subtitle>()),
            MusicVideo musicVideo => Optional(musicVideo.MusicVideoMetadata).Flatten().HeadOrNone()
            .Map(mm => mm.Subtitles)
            .IfNone(new List <Subtitle>()),
            OtherVideo otherVideo => Optional(otherVideo.OtherVideoMetadata).Flatten().HeadOrNone()
            .Map(mm => mm.Subtitles)
            .IfNone(new List <Subtitle>()),
            _ => new List <Subtitle>()
        };

        bool isMediaServer = playoutItemWithPath.PlayoutItem.MediaItem is PlexMovie or PlexEpisode or
                             JellyfinMovie or JellyfinEpisode or EmbyMovie or EmbyEpisode;

        if (isMediaServer)
        {
            string mediaItemFolder = Path.GetDirectoryName(playoutItemWithPath.Path);

            allSubtitles = allSubtitles.Map <Subtitle, Option <Subtitle> >(
                subtitle =>
            {
                if (subtitle.SubtitleKind == SubtitleKind.Sidecar)
                {
                    // need to prepend path with movie/episode folder
                    if (!string.IsNullOrWhiteSpace(mediaItemFolder))
                    {
                        subtitle.Path = Path.Combine(mediaItemFolder, subtitle.Path);

                        // skip subtitles that don't exist
                        if (!File.Exists(subtitle.Path))
                        {
                            return(None);
                        }
                    }
                }

                return(subtitle);
            })
                           .Somes()
                           .ToList();
        }

        return(allSubtitles);
    }
Ejemplo n.º 5
0
    private async Task <Either <BaseError, MediaItemScanResult <MusicVideo> > > UpdateMetadata(
        MediaItemScanResult <MusicVideo> result)
    {
        try
        {
            MusicVideo musicVideo = result.Item;

            Option <string> maybeNfoFile = LocateNfoFile(musicVideo);
            if (maybeNfoFile.IsNone)
            {
                if (!Optional(musicVideo.MusicVideoMetadata).Flatten().Any())
                {
                    musicVideo.MusicVideoMetadata ??= new List <MusicVideoMetadata>();

                    string path = musicVideo.MediaVersions.Head().MediaFiles.Head().Path;
                    _logger.LogDebug("Refreshing {Attribute} for {Path}", "Fallback Metadata", path);
                    if (await _localMetadataProvider.RefreshFallbackMetadata(musicVideo))
                    {
                        result.IsUpdated = true;
                    }
                }
            }

            foreach (string nfoFile in maybeNfoFile)
            {
                bool shouldUpdate = Optional(musicVideo.MusicVideoMetadata).Flatten().HeadOrNone().Match(
                    m => m.MetadataKind == MetadataKind.Fallback ||
                    m.DateUpdated != _localFileSystem.GetLastWriteTime(nfoFile),
                    true);

                if (shouldUpdate)
                {
                    _logger.LogDebug("Refreshing {Attribute} from {Path}", "Sidecar Metadata", nfoFile);
                    if (await _localMetadataProvider.RefreshSidecarMetadata(musicVideo, nfoFile))
                    {
                        result.IsUpdated = true;
                    }
                }
            }

            return(result);
        }
        catch (Exception ex)
        {
            _client.Notify(ex);
            return(BaseError.New(ex.ToString()));
        }
    }
        public void AddVideoToDB(string band, string album, string genre, string track, string filePath)
        {
            var _band    = DAL.GetBand(band, true);
            var _genre   = DAL.GetGenre(genre, true);
            var _album   = DAL.GetAlbum(album, true, _band.Id, _genre.Id);
            var vidTrack = DAL.Data.Tracks.Add(new Track()
            {
                AlbumID = _album.Id, Name = track, FilePath = filePath
            });

            DAL.SaveData();
            Vid = DAL.Data.MusicVideos.Add(new MusicVideo()
            {
                MusicVideoId = vidTrack.Id, TrackId = _track.Id
            });
            DAL.SaveData();
        }
Ejemplo n.º 7
0
        private void SetMusicVideoProperties(BaseItemDto dto, MusicVideo item)
        {
            if (!string.IsNullOrEmpty(item.Album))
            {
                var parentAlbum = _libraryManager.RootFolder
                                  .RecursiveChildren
                                  .OfType <MusicAlbum>()
                                  .FirstOrDefault(i => string.Equals(i.Name, item.Album, StringComparison.OrdinalIgnoreCase));

                if (parentAlbum != null)
                {
                    dto.AlbumId = GetClientItemId(parentAlbum);
                }
            }

            dto.Album   = item.Album;
            dto.Artists = string.IsNullOrEmpty(item.Artist) ? new string[] { } : new[] { item.Artist };
        }
Ejemplo n.º 8
0
        private void SetMusicVideoProperties(BaseItemDto dto, MusicVideo item)
        {
            if (!string.IsNullOrEmpty(item.Album))
            {
                var parentAlbum = _libraryManager.RootFolder
                                  .GetRecursiveChildren()
                                  .Where(i => i is MusicAlbum)
                                  .FirstOrDefault(i => string.Equals(i.Name, item.Album, StringComparison.OrdinalIgnoreCase));

                if (parentAlbum != null)
                {
                    dto.AlbumId = GetDtoId(parentAlbum);
                }
            }

            dto.Album   = item.Album;
            dto.Artists = item.Artists;
        }
Ejemplo n.º 9
0
        private void SetMusicVideoProperties(BaseItemDto dto, MusicVideo item)
        {
            if (!string.IsNullOrEmpty(item.Album))
            {
                var parentAlbumIds = _libraryManager.GetItemIds(new InternalItemsQuery
                {
                    IncludeItemTypes = new[] { typeof(MusicAlbum).Name },
                    Name             = item.Album,
                    Limit            = 1
                });

                if (parentAlbumIds.Count > 0)
                {
                    dto.AlbumId = parentAlbumIds[0];
                }
            }

            dto.Album = item.Album;
        }
Ejemplo n.º 10
0
    private static string GetTitle(PlayoutItem playoutItem)
    {
        if (!string.IsNullOrWhiteSpace(playoutItem.CustomTitle))
        {
            return(playoutItem.CustomTitle);
        }

        return(playoutItem.MediaItem switch
        {
            Movie m => m.MovieMetadata.HeadOrNone().Map(mm => mm.Title ?? string.Empty)
            .IfNone("[unknown movie]"),
            Episode e => e.Season.Show.ShowMetadata.HeadOrNone().Map(em => em.Title ?? string.Empty)
            .IfNone("[unknown show]"),
            MusicVideo mv => mv.Artist.ArtistMetadata.HeadOrNone().Map(am => am.Title ?? string.Empty)
            .IfNone("[unknown artist]"),
            OtherVideo ov => ov.OtherVideoMetadata.HeadOrNone().Map(vm => vm.Title ?? string.Empty)
            .IfNone("[unknown video]"),
            Song s => s.SongMetadata.HeadOrNone().Map(sm => sm.Artist ?? string.Empty)
            .IfNone("[unknown artist]"),
            _ => "[unknown]"
        });
        /// <summary>
        /// Provides a MusicVideo Metadata Result from a json object.
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static MetadataResult <MusicVideo> YTDLJsonToMusicVideo(YTDLData json)
        {
            var item   = new MusicVideo();
            var result = new MetadataResult <MusicVideo>
            {
                HasMetadata = true,
                Item        = item
            };

            result.Item.Name    = String.IsNullOrEmpty(json.track) ? json.title : json.track;
            result.Item.Artists = new List <string> {
                json.artist
            };
            result.Item.Album    = json.album;
            result.Item.Overview = json.description;
            var date = DateTime.ParseExact(json.upload_date, "yyyyMMdd", null);

            result.Item.ProductionYear = date.Year;
            result.Item.PremiereDate   = date;
            result.AddPerson(Utils.CreatePerson(json.uploader, json.channel_id));

            return(result);
        }
Ejemplo n.º 12
0
    private async Task <Either <BaseError, MediaItemScanResult <MusicVideo> > > UpdateThumbnail(
        MediaItemScanResult <MusicVideo> result,
        CancellationToken cancellationToken)
    {
        try
        {
            MusicVideo musicVideo = result.Item;

            Option <string> maybeThumbnail = LocateThumbnail(musicVideo);
            foreach (string thumbnailFile in maybeThumbnail)
            {
                MusicVideoMetadata metadata = musicVideo.MusicVideoMetadata.Head();
                await RefreshArtwork(thumbnailFile, metadata, ArtworkKind.Thumbnail, None, None, cancellationToken);
            }

            return(result);
        }
        catch (Exception ex)
        {
            _client.Notify(ex);
            return(BaseError.New(ex.ToString()));
        }
    }
Ejemplo n.º 13
0
 public Task <ItemUpdateType> FetchAsync(MusicVideo item, MetadataRefreshOptions options, CancellationToken cancellationToken)
 {
     return(FetchInternal(item, options, cancellationToken));
 }
Ejemplo n.º 14
0
 public Task <ItemUpdateType> FetchAsync(MusicVideo item, IDirectoryService directoryService, CancellationToken cancellationToken)
 {
     return(FetchVideoInfo(item, directoryService, cancellationToken));
 }
Ejemplo n.º 15
0
    private async Task UpdateMusicVideo(ISearchRepository searchRepository, MusicVideo musicVideo)
    {
        Option <MusicVideoMetadata> maybeMetadata = musicVideo.MusicVideoMetadata.HeadOrNone();

        if (maybeMetadata.IsSome)
        {
            MusicVideoMetadata metadata = maybeMetadata.ValueUnsafe();

            try
            {
                var doc = new Document
                {
                    new StringField(IdField, musicVideo.Id.ToString(), Field.Store.YES),
                    new StringField(TypeField, MusicVideoType, Field.Store.YES),
                    new TextField(TitleField, metadata.Title, Field.Store.NO),
                    new StringField(SortTitleField, metadata.SortTitle.ToLowerInvariant(), Field.Store.NO),
                    new TextField(LibraryNameField, musicVideo.LibraryPath.Library.Name, Field.Store.NO),
                    new StringField(LibraryIdField, musicVideo.LibraryPath.Library.Id.ToString(), Field.Store.NO),
                    new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO),
                    new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES),
                    new StringField(StateField, musicVideo.State.ToString(), Field.Store.NO)
                };

                await AddLanguages(searchRepository, doc, musicVideo.MediaVersions);

                foreach (MediaVersion version in musicVideo.MediaVersions.HeadOrNone())
                {
                    doc.Add(
                        new Int32Field(MinutesField, (int)Math.Ceiling(version.Duration.TotalMinutes), Field.Store.NO));
                }

                if (metadata.ReleaseDate.HasValue)
                {
                    doc.Add(
                        new StringField(
                            ReleaseDateField,
                            metadata.ReleaseDate.Value.ToString("yyyyMMdd"),
                            Field.Store.NO));
                }

                doc.Add(new StringField(AddedDateField, metadata.DateAdded.ToString("yyyyMMdd"), Field.Store.NO));

                if (!string.IsNullOrWhiteSpace(metadata.Album))
                {
                    doc.Add(new TextField(AlbumField, metadata.Album, Field.Store.NO));
                }

                if (!string.IsNullOrWhiteSpace(metadata.Plot))
                {
                    doc.Add(new TextField(PlotField, metadata.Plot ?? string.Empty, Field.Store.NO));
                }

                foreach (Genre genre in metadata.Genres)
                {
                    doc.Add(new TextField(GenreField, genre.Name, Field.Store.NO));
                }

                foreach (Tag tag in metadata.Tags)
                {
                    doc.Add(new TextField(TagField, tag.Name, Field.Store.NO));
                }

                foreach (Studio studio in metadata.Studios)
                {
                    doc.Add(new TextField(StudioField, studio.Name, Field.Store.NO));
                }

                if (musicVideo.Artist != null)
                {
                    foreach (ArtistMetadata artistMetadata in musicVideo.Artist.ArtistMetadata)
                    {
                        doc.Add(new TextField(ArtistField, artistMetadata.Title, Field.Store.NO));
                    }
                }

                _writer.UpdateDocument(new Term(IdField, musicVideo.Id.ToString()), doc);
            }
            catch (Exception ex)
            {
                metadata.MusicVideo = null;
                _logger.LogWarning(ex, "Error indexing music video with metadata {@Metadata}", metadata);
            }
        }
    }
Ejemplo n.º 16
0
    public int Compare(MediaItem x, MediaItem y)
    {
        if (x == null || y == null)
        {
            return(0);
        }

        DateTime date1 = x switch
        {
            Episode e => e.EpisodeMetadata.HeadOrNone().Match(
                em => em.ReleaseDate ?? DateTime.MaxValue,
                () => DateTime.MaxValue),
            Movie m => m.MovieMetadata.HeadOrNone().Match(
                mm => mm.ReleaseDate ?? DateTime.MaxValue,
                () => DateTime.MaxValue),
            MusicVideo mv => mv.MusicVideoMetadata.HeadOrNone().Match(
                mvm => mvm.ReleaseDate ?? DateTime.MaxValue,
                () => DateTime.MaxValue),
            _ => DateTime.MaxValue
        };

        DateTime date2 = y switch
        {
            Episode e => e.EpisodeMetadata.HeadOrNone().Match(
                em => em.ReleaseDate ?? DateTime.MaxValue,
                () => DateTime.MaxValue),
            Movie m => m.MovieMetadata.HeadOrNone().Match(
                mm => mm.ReleaseDate ?? DateTime.MaxValue,
                () => DateTime.MaxValue),
            MusicVideo mv => mv.MusicVideoMetadata.HeadOrNone().Match(
                mvm => mvm.ReleaseDate ?? DateTime.MaxValue,
                () => DateTime.MaxValue),
            _ => DateTime.MaxValue
        };

        if (date1 != date2)
        {
            return(date1.CompareTo(date2));
        }

        string songDate1 = x switch
        {
            Song s => s.SongMetadata.HeadOrNone().Match(sm => sm.Date ?? string.Empty, () => string.Empty),
            _ => string.Empty
        };

        string songDate2 = y switch
        {
            Song s => s.SongMetadata.HeadOrNone().Match(sm => sm.Date ?? string.Empty, () => string.Empty),
            _ => string.Empty
        };

        if (songDate1 != songDate2)
        {
            return(string.Compare(songDate1, songDate2, StringComparison.Ordinal));
        }

        int season1 = x switch
        {
            Episode e => e.Season?.SeasonNumber ?? int.MaxValue,
            _ => int.MaxValue
        };

        int season2 = y switch
        {
            Episode e => e.Season?.SeasonNumber ?? int.MaxValue,
            _ => int.MaxValue
        };

        if (season1 != season2)
        {
            return(season1.CompareTo(season2));
        }

        int episode1 = x switch
        {
            Episode e => e.EpisodeMetadata.HeadOrNone().Match(
                em => em.EpisodeNumber,
                () => int.MaxValue),
            _ => int.MaxValue
        };

        int episode2 = y switch
        {
            Episode e => e.EpisodeMetadata.HeadOrNone().Match(
                em => em.EpisodeNumber,
                () => int.MaxValue),
            _ => int.MaxValue
        };

        if (episode1 != episode2)
        {
            return(episode1.CompareTo(episode2));
        }

        string album1 = x switch
        {
            Song s => s.SongMetadata.HeadOrNone().Match(sm => sm.Album ?? string.Empty, () => string.Empty),
            _ => string.Empty
        };

        string album2 = y switch
        {
            Song s => s.SongMetadata.HeadOrNone().Match(sm => sm.Album ?? string.Empty, () => string.Empty),
            _ => string.Empty
        };

        if (album1 != album2)
        {
            return(string.Compare(album1, album2, StringComparison.Ordinal));
        }

        string track1 = x switch
        {
            Song s => s.SongMetadata.HeadOrNone().Match(sm => sm.Track ?? string.Empty, () => string.Empty),
            _ => string.Empty
        };

        string track2 = y switch
        {
            Song s => s.SongMetadata.HeadOrNone().Match(sm => sm.Track ?? string.Empty, () => string.Empty),
            _ => string.Empty
        };

        if (track1 != track2)
        {
            return(string.Compare(track1, track2, StringComparison.Ordinal));
        }

        return(x.Id.CompareTo(y.Id));
    }
}