예제 #1
0
        public ActionResult DetailsById(int id = invalidId, string slug = null)
        {
            if (id == invalidId)
            {
                return(NoId());
            }

            // TODO: write test for null slug
            slug = slug ?? string.Empty;

            var tagName = queries.LoadTag(id, t => t.UrlSlug ?? string.Empty);

            if (slug != tagName)
            {
                return(RedirectToActionPermanent("DetailsById", new { id, slug = tagName }));
            }

            var contract = queries.GetDetails(id);

            var prop = PageProperties;

            var thumbUrl = Url.EntryImageOld(contract.Thumb, ImageSize.Original);

            if (!string.IsNullOrEmpty(thumbUrl))
            {
                PageProperties.OpenGraph.Image = thumbUrl;
            }

            prop.Description = markdownParser.GetPlainText(contract.Description.EnglishOrOriginal);

            return(RenderDetails(contract));
        }
예제 #2
0
        //
        // GET: /Artist/Details/5

        public ActionResult Details(int id = invalidId)
        {
            if (id == invalidId)
            {
                return(HttpNotFound());
            }

            WebHelper.VerifyUserAgent(Request);

            var model = queries.GetDetails(id);

            var hasDescription = !model.Description.IsEmpty;
            var prop           = PageProperties;

            prop.GlobalSearchType = EntryType.Artist;
            prop.Title            = model.Name;
            prop.Subtitle         = string.Format("({0})", Translate.ArtistTypeName(model.ArtistType));
            prop.Description      = hasDescription
                                ? markdownParser.GetPlainText(model.Description.EnglishOrOriginal)
                                : new ArtistDescriptionGenerator().GenerateDescription(model, a => Translate.ArtistTypeNames.GetName(a, CultureInfo.InvariantCulture));
            prop.CanonicalUrl              = UrlMapper.FullAbsolute(Url.Action("Details", new { id }));
            prop.OpenGraph.Image           = Url.ImageThumb(model, Model.Domain.Images.ImageSize.Original, fullUrl: true);
            prop.OpenGraph.Title           = hasDescription ? string.Format("{0} ({1})", model.Name, Translate.ArtistTypeName(model.ArtistType)) : model.Name;
            prop.OpenGraph.ShowTwitterCard = true;

            return(View(model));
        }
예제 #3
0
        //
        // GET: /Song/Details/5

        public ActionResult Details(int id = invalidId, int albumId = 0)
        {
            if (id == invalidId)
            {
                return(NoId());
            }

            WebHelper.VerifyUserAgent(Request);

            var contract = queries.GetSongDetails(id, albumId, GetHostnameForValidHit(), null, WebHelper.GetUserLanguageCodes(Request));
            var model    = new SongDetails(contract, PermissionContext);

            var hasDescription = !model.Notes.IsEmpty;
            var prop           = PageProperties;

            prop.GlobalSearchType = EntryType.Song;
            prop.Title            = model.Name;
            prop.Description      = hasDescription ?
                                    markdownParser.GetPlainText(model.Notes.EnglishOrOriginal) :
                                    new SongDescriptionGenerator().GenerateDescription(contract.Song, Translate.SongTypeNames);
            prop.OpenGraph.ShowTwitterCard = true;

            string titleAndArtist;

            if (!string.IsNullOrEmpty(model.ArtistString))
            {
                titleAndArtist = string.Format("{0} - {1}", model.Name, model.ArtistString);
            }
            else
            {
                titleAndArtist = model.Name;
            }
            prop.PageTitle = titleAndArtist;

            prop.Subtitle = string.Format("{0} ({1})", model.ArtistString, Translate.SongTypeNames[model.SongType]);

            if (!string.IsNullOrEmpty(model.ThumbUrlMaxSize))
            {
                prop.OpenGraph.Image = model.ThumbUrlMaxSize;
            }

            prop.CanonicalUrl    = VocaUriBuilder.CreateAbsolute(Url.Action("Details", new { id })).ToString();
            prop.OpenGraph.Title = hasDescription ? string.Format("{0} ({1})", titleAndArtist, Translate.SongTypeNames[model.SongType]) : model.Name;
            prop.OpenGraph.Type  = OpenGraphTypes.Song;

            return(View(model));
        }
예제 #4
0
        //
        // GET: /Album/Details/5

        public ActionResult Details(int id = invalidId)
        {
            if (id == invalidId)
            {
                return(NoId());
            }

            WebHelper.VerifyUserAgent(Request);

            var model = queries.GetAlbumDetails(id, WebHelper.IsValidHit(Request) ? WebHelper.GetRealHost(Request) : string.Empty);

            var prop = PageProperties;

            prop.Title                     = model.Name;
            prop.CanonicalUrl              = VocaUriBuilder.CreateAbsolute(Url.Action("Details", new { id })).ToString();
            prop.GlobalSearchType          = EntryType.Album;
            prop.OpenGraph.Image           = Url.ImageThumb(model, Model.Domain.Images.ImageSize.Original, fullUrl: true);
            prop.OpenGraph.Type            = OpenGraphTypes.Album;
            prop.OpenGraph.ShowTwitterCard = true;

            string titleAndArtist;

            if (!string.IsNullOrEmpty(model.ArtistString))
            {
                titleAndArtist = string.Format("{0} - {1}", model.Name, model.ArtistString);
            }
            else
            {
                titleAndArtist = model.Name;
            }

            PageProperties.OpenGraph.Title = string.Format("{0} ({1})", titleAndArtist, Translate.DiscTypeName(model.DiscType));

            PageProperties.PageTitle = titleAndArtist;
            PageProperties.Subtitle  = string.Format("{0} ({1})", model.ArtistString, Translate.DiscTypeName(model.DiscType));

            prop.Description = !model.Description.IsEmpty ?
                               markdownParser.GetPlainText(model.Description.EnglishOrOriginal) :
                               albumDescriptionGenerator.GenerateDescription(model, d => Translate.DiscTypeNames.GetName(d, CultureInfo.InvariantCulture));

            return(View(new AlbumDetails(model, PermissionContext)));
        }
예제 #5
0
        public ActionResult Details(int id = InvalidId)
        {
            if (id == InvalidId)
            {
                return(NotFound());
            }

            WebHelper.VerifyUserAgent(Request);

            var model = _queries.GetDetails(id, GetHostnameForValidHit());

            var hasDescription = !model.Description.IsEmpty;
            var prop           = PageProperties;

            prop.GlobalSearchType          = EntryType.Artist;
            prop.Title                     = model.Name;
            prop.Subtitle                  = $"({Translate.ArtistTypeName(model.ArtistType)})";
            prop.Description               = new ArtistDescriptionGenerator().GenerateDescription(model, _markdownParser.GetPlainText(model.Description.EnglishOrOriginal), Translate.ArtistTypeNames);
            prop.CanonicalUrl              = UrlMapper.FullAbsolute(Url.Action("Details", new { id }));
            prop.OpenGraph.Image           = Url.ImageThumb(model, Model.Domain.Images.ImageSize.Original, fullUrl: true);
            prop.OpenGraph.Title           = hasDescription ? $"{model.Name} ({Translate.ArtistTypeName(model.ArtistType)})" : model.Name;
            prop.OpenGraph.ShowTwitterCard = true;

            return(View(model));
        }
예제 #6
0
        private void TestGetPlainText(string expected, string input)
        {
            var result = parser.GetPlainText(input)?.Trim();

            Assert.AreEqual(expected, result, input);
        }