Editors can now refresh audio downloads
This commit is contained in:
parent
3a6cd6b3bc
commit
000f04025b
@ -13,7 +13,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// The maximum age of files we accept until we force a refresh.
|
// The maximum age of files we accept until we force a refresh.
|
||||||
maxAge = 24 * time.Hour
|
maxAge = 7 * 24 * time.Hour
|
||||||
delayBetweenRequests = 1100 * time.Millisecond
|
delayBetweenRequests = 1100 * time.Millisecond
|
||||||
userAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.20 Safari/537.36"
|
userAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.20 Safari/537.36"
|
||||||
animeDirectory = "anime"
|
animeDirectory = "anime"
|
||||||
|
@ -78,6 +78,13 @@ component CharacterSidebar(character *arn.Character, friends []*arn.User, releva
|
|||||||
td.character-attributes-value!= markdown.Render(attribute.Value)
|
td.character-attributes-value!= markdown.Render(attribute.Value)
|
||||||
else
|
else
|
||||||
td.character-attributes-value= attribute.Value
|
td.character-attributes-value= attribute.Value
|
||||||
|
//- td.character-attributes-value
|
||||||
|
//- if strings.Contains(attribute.Value, ",")
|
||||||
|
//- ul
|
||||||
|
//- each part in strings.Split(attribute.Value, ",")
|
||||||
|
//- li= strings.TrimSpace(part)
|
||||||
|
//- else
|
||||||
|
//- span= attribute.Value
|
||||||
|
|
||||||
if len(relevantCharacters) > 0
|
if len(relevantCharacters) > 0
|
||||||
h3.mountable(data-mountable-type="sidebar") Relevant
|
h3.mountable(data-mountable-type="sidebar") Relevant
|
||||||
|
@ -39,6 +39,10 @@
|
|||||||
.character-attributes-value
|
.character-attributes-value
|
||||||
text-align right
|
text-align right
|
||||||
|
|
||||||
|
li
|
||||||
|
list-style-type none
|
||||||
|
margin 0
|
||||||
|
|
||||||
.character-anime
|
.character-anime
|
||||||
horizontal-wrap
|
horizontal-wrap
|
||||||
|
|
||||||
|
@ -39,6 +39,9 @@ func Register(l *layout.Layout, app *aero.Application) {
|
|||||||
app.Get("/api/next/soundtrack", soundtrack.Next)
|
app.Get("/api/next/soundtrack", soundtrack.Next)
|
||||||
app.Get("/api/character/:id/ranking", character.Ranking)
|
app.Get("/api/character/:id/ranking", character.Ranking)
|
||||||
|
|
||||||
|
// SoundTrack
|
||||||
|
app.Post("/api/soundtrack/:id/download", soundtrack.Download)
|
||||||
|
|
||||||
// Upload
|
// Upload
|
||||||
app.Post("/api/upload/avatar", upload.Avatar)
|
app.Post("/api/upload/avatar", upload.Avatar)
|
||||||
app.Post("/api/upload/cover", upload.Cover)
|
app.Post("/api/upload/cover", upload.Cover)
|
||||||
|
@ -13,6 +13,7 @@ func Register(l *layout.Layout) {
|
|||||||
l.Page("/users/noavatar", users.ActiveNoAvatar)
|
l.Page("/users/noavatar", users.ActiveNoAvatar)
|
||||||
l.Page("/users/games/osu", users.Osu)
|
l.Page("/users/games/osu", users.Osu)
|
||||||
l.Page("/users/games/overwatch", users.Overwatch)
|
l.Page("/users/games/overwatch", users.Overwatch)
|
||||||
|
l.Page("/users/games/ffxiv", users.FFXIV)
|
||||||
l.Page("/users/staff", users.Staff)
|
l.Page("/users/staff", users.Staff)
|
||||||
l.Page("/users/pro", users.Pro)
|
l.Page("/users/pro", users.Pro)
|
||||||
l.Page("/users/editors", users.Editors)
|
l.Page("/users/editors", users.Editors)
|
||||||
|
29
pages/soundtrack/download.go
Normal file
29
pages/soundtrack/download.go
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package soundtrack
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/aerogo/aero"
|
||||||
|
"github.com/animenotifier/arn"
|
||||||
|
"github.com/animenotifier/notify.moe/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Download tries to refresh the soundtrack file.
|
||||||
|
func Download(ctx *aero.Context) string {
|
||||||
|
id := ctx.Get("id")
|
||||||
|
user := utils.GetUser(ctx)
|
||||||
|
|
||||||
|
if user == nil || (user.Role != "editor" && user.Role != "admin") {
|
||||||
|
return ctx.Error(http.StatusUnauthorized, "Not logged in or not auhorized to edit this soundtrack")
|
||||||
|
}
|
||||||
|
|
||||||
|
track, err := arn.GetSoundTrack(id)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return ctx.Error(http.StatusNotFound, "Track not found", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
track.Download()
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
23
pages/users/ffxiv.pixy
Normal file
23
pages/users/ffxiv.pixy
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
component FinalFantasyXIVRankingList(users []*arn.User, url string)
|
||||||
|
h1.page-title FinalFantasy XIV ranking list
|
||||||
|
UsersTabs(url)
|
||||||
|
|
||||||
|
table.ranking-list
|
||||||
|
thead
|
||||||
|
tr.mountable
|
||||||
|
th #
|
||||||
|
th Player
|
||||||
|
th.ranking-class Class
|
||||||
|
th.ranking-level Level
|
||||||
|
th.ranking-score Item Level
|
||||||
|
tbody
|
||||||
|
for index, user := range users
|
||||||
|
tr.ranking.mountable
|
||||||
|
td= fmt.Sprint(index + 1) + "."
|
||||||
|
td.ranking-user
|
||||||
|
Avatar(user)
|
||||||
|
a.ranking-user-nick(href=user.Link())= user.Nick
|
||||||
|
td.ranking-class= user.Accounts.FinalFantasyXIV.Class
|
||||||
|
td.ranking-level= strconv.Itoa(user.Accounts.FinalFantasyXIV.Level)
|
||||||
|
td.ranking-score= strconv.Itoa(user.Accounts.FinalFantasyXIV.ItemLevel)
|
||||||
|
|
@ -149,6 +149,24 @@ func Overwatch(ctx *aero.Context) string {
|
|||||||
return ctx.HTML(components.OverwatchRankingList(users, ctx.URI()))
|
return ctx.HTML(components.OverwatchRankingList(users, ctx.URI()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FFXIV ...
|
||||||
|
func FFXIV(ctx *aero.Context) string {
|
||||||
|
users := arn.FilterUsers(func(user *arn.User) bool {
|
||||||
|
return user.HasAvatar() && user.HasNick() && user.IsActive() && user.Accounts.FinalFantasyXIV.ItemLevel > 0
|
||||||
|
})
|
||||||
|
|
||||||
|
// Sort by item level
|
||||||
|
sort.Slice(users, func(i, j int) bool {
|
||||||
|
return users[i].Accounts.FinalFantasyXIV.ItemLevel > users[j].Accounts.FinalFantasyXIV.ItemLevel
|
||||||
|
})
|
||||||
|
|
||||||
|
if len(users) > 50 {
|
||||||
|
users = users[:50]
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.HTML(components.FinalFantasyXIVRankingList(users, ctx.URI()))
|
||||||
|
}
|
||||||
|
|
||||||
// Staff ...
|
// Staff ...
|
||||||
func Staff(ctx *aero.Context) string {
|
func Staff(ctx *aero.Context) string {
|
||||||
users := arn.FilterUsers(func(user *arn.User) bool {
|
users := arn.FilterUsers(func(user *arn.User) bool {
|
||||||
|
@ -51,4 +51,5 @@ component UsersTabs(url string)
|
|||||||
if strings.Contains(url, "/users/games")
|
if strings.Contains(url, "/users/games")
|
||||||
.tabs
|
.tabs
|
||||||
Tab("Osu", "gamepad", "/users/games/osu")
|
Tab("Osu", "gamepad", "/users/games/osu")
|
||||||
Tab("Overwatch", "overwatch", "/users/games/overwatch")
|
Tab("Overwatch", "overwatch", "/users/games/overwatch")
|
||||||
|
Tab("FFXIV", "gamepad", "/users/games/ffxiv")
|
@ -1,6 +1,7 @@
|
|||||||
import AnimeNotifier from "../AnimeNotifier"
|
import AnimeNotifier from "../AnimeNotifier"
|
||||||
import { findAllInside } from "../Utils";
|
import { findAllInside } from "../Utils";
|
||||||
import { showSearchResults } from "./Search"
|
import { showSearchResults } from "./Search"
|
||||||
|
import { arrayAppend } from "./Serialization";
|
||||||
|
|
||||||
// newAnimeDiffIgnore
|
// newAnimeDiffIgnore
|
||||||
export function newAnimeDiffIgnore(arn: AnimeNotifier, button: HTMLButtonElement) {
|
export function newAnimeDiffIgnore(arn: AnimeNotifier, button: HTMLButtonElement) {
|
||||||
@ -72,6 +73,17 @@ export async function multiSearchAnime(arn: AnimeNotifier, textarea: HTMLTextAre
|
|||||||
showSearchResults(arn, results)
|
showSearchResults(arn, results)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Download soundtrack file
|
||||||
|
export async function downloadSoundTrackFile(arn: AnimeNotifier, button: HTMLButtonElement) {
|
||||||
|
let id = button.dataset.id
|
||||||
|
|
||||||
|
try {
|
||||||
|
await arn.post(`/api/soundtrack/${id}/download`)
|
||||||
|
arn.reloadContent()
|
||||||
|
} catch(err) {
|
||||||
|
arn.statusMessage.showError(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Start background job
|
// Start background job
|
||||||
export async function startJob(arn: AnimeNotifier, button: HTMLButtonElement) {
|
export async function startJob(arn: AnimeNotifier, button: HTMLButtonElement) {
|
||||||
|
@ -49,6 +49,13 @@ func Render(obj interface{}, title string, user *arn.User) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Redownload button
|
||||||
|
track, isSoundTrack := obj.(*arn.SoundTrack)
|
||||||
|
|
||||||
|
if isSoundTrack && !track.IsDraft && track.HasMediaByService("Youtube") && track.File == "" && (user.Role == "editor" || user.Role == "admin") {
|
||||||
|
b.WriteString(`<button class="mountable action" data-action="downloadSoundTrackFile" data-trigger="click" data-id="` + track.ID + `">` + utils.Icon("refresh") + `Redownload</button>`)
|
||||||
|
}
|
||||||
|
|
||||||
// Delete button
|
// Delete button
|
||||||
_, isDeletable := obj.(api.Deletable)
|
_, isDeletable := obj.(api.Deletable)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user