diff --git a/main.go b/main.go
index 79744cc8..d74a4c3a 100644
--- a/main.go
+++ b/main.go
@@ -182,7 +182,7 @@ func configure(app *aero.Application) *aero.Application {
middleware.Firewall(),
middleware.Log(),
middleware.Session(),
- middleware.UserInfo()
+ middleware.UserInfo(),
)
// API
diff --git a/mixins/Input.pixy b/mixins/Input.pixy
index 2c0b93d1..df1a39e8 100644
--- a/mixins/Input.pixy
+++ b/mixins/Input.pixy
@@ -18,7 +18,7 @@ component InputSelection(id string, value string, label string, placeholder stri
label(for=id)= label + ":"
select.widget-ui-element.action(id=id, data-field=id, value=value, title=placeholder, data-action="save", data-trigger="change")
-component InputTags(id string, value []string, label string)
+component InputTags(id string, value []string, label string, tooltip string)
.widget-section
label(for=id)= label + ":"
.tags(id=id)
@@ -30,4 +30,6 @@ component InputTags(id string, value []string, label string)
button.tag-add.action(data-action="arrayAppend", data-trigger="click", data-field=id)
RawIcon("plus")
+
+ p!= tooltip
\ No newline at end of file
diff --git a/pages/anime/anime.go b/pages/anime/anime.go
index 1339dfef..d256057e 100644
--- a/pages/anime/anime.go
+++ b/pages/anime/anime.go
@@ -23,7 +23,9 @@ func Get(ctx *aero.Context) string {
return ctx.Error(http.StatusNotFound, "Anime not found", err)
}
- tracks, err := arn.GetSoundTracksByTag("anime:" + anime.ID)
+ tracks, err := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool {
+ return !track.IsDraft && len(track.Media) > 0 && arn.Contains(track.Tags, "anime:"+anime.ID)
+ })
if err != nil {
return ctx.Error(http.StatusNotFound, "Error fetching soundtracks", err)
diff --git a/pages/profile/tracks.go b/pages/profile/tracks.go
index 2b723403..083f3ae9 100644
--- a/pages/profile/tracks.go
+++ b/pages/profile/tracks.go
@@ -19,7 +19,9 @@ func GetSoundTracksByUser(ctx *aero.Context) string {
return ctx.Error(http.StatusNotFound, "User not found", err)
}
- tracks, err := arn.GetSoundTracksByUser(viewUser)
+ tracks, err := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool {
+ return !track.IsDraft && len(track.Media) > 0 && track.CreatedBy == viewUser.ID
+ })
if err != nil {
return ctx.Error(http.StatusInternalServerError, "Error fetching soundtracks", err)
diff --git a/pages/soundtrack/edit.go b/pages/soundtrack/edit.go
index 0246fa0d..dd72b80d 100644
--- a/pages/soundtrack/edit.go
+++ b/pages/soundtrack/edit.go
@@ -89,7 +89,15 @@ func RenderField(b *bytes.Buffer, v *reflect.Value, field reflect.StructField, i
case "string":
b.WriteString(components.InputText(idPrefix+field.Name, fieldValue.String(), field.Name, ""))
case "[]string":
- b.WriteString(components.InputTags(idPrefix+field.Name, fieldValue.Interface().([]string), field.Name))
+ b.WriteString(components.InputTags(idPrefix+field.Name, fieldValue.Interface().([]string), field.Name, field.Tag.Get("tooltip")))
+ case "bool":
+ if field.Name == "IsDraft" {
+ if fieldValue.Bool() {
+ b.WriteString(`
`)
+ } else {
+ b.WriteString(``)
+ }
+ }
case "[]*arn.ExternalMedia":
for sliceIndex := 0; sliceIndex < fieldValue.Len(); sliceIndex++ {
b.WriteString(``)
diff --git a/pages/soundtrack/soundtrack.go b/pages/soundtrack/soundtrack.go
index afc492c8..5a5c8e75 100644
--- a/pages/soundtrack/soundtrack.go
+++ b/pages/soundtrack/soundtrack.go
@@ -20,12 +20,15 @@ func Get(ctx *aero.Context) string {
ctx.Data = &arn.OpenGraph{
Tags: map[string]string{
"og:title": track.Title,
- "og:image": track.MainAnime().Image.Large,
"og:url": "https://" + ctx.App.Config.Domain + track.Link(),
"og:site_name": "notify.moe",
"og:type": "music.song",
},
}
+ if track.MainAnime() != nil {
+ ctx.Data.(*arn.OpenGraph).Tags["og:image"] = track.MainAnime().Image.Large
+ }
+
return ctx.HTML(components.Track(track))
}
diff --git a/pages/soundtrack/soundtrack.pixy b/pages/soundtrack/soundtrack.pixy
index 6c7a57dc..453ee76b 100644
--- a/pages/soundtrack/soundtrack.pixy
+++ b/pages/soundtrack/soundtrack.pixy
@@ -13,6 +13,12 @@ component Track(track *arn.SoundTrack)
h3.widget-title= media.Service
.sound-track-media
ExternalMedia(media)
+
+ .widget.mountable
+ h3.widget-title Tags
+ ul
+ each tag in track.Tags
+ li= tag
.footer.text-center.mountable
if track.EditedBy != ""
diff --git a/pages/soundtracks/soundtracks.go b/pages/soundtracks/soundtracks.go
index 93c8c7f6..11dee8b2 100644
--- a/pages/soundtracks/soundtracks.go
+++ b/pages/soundtracks/soundtracks.go
@@ -13,7 +13,7 @@ const maxTracks = 9
// Get renders the soundtracks page.
func Get(ctx *aero.Context) string {
tracks, err := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool {
- return !track.IsDraft
+ return !track.IsDraft && len(track.Media) > 0
})
if err != nil {
diff --git a/pages/soundtracks/soundtracks.pixy b/pages/soundtracks/soundtracks.pixy
index 82bbdf01..0d175189 100644
--- a/pages/soundtracks/soundtracks.pixy
+++ b/pages/soundtracks/soundtracks.pixy
@@ -2,7 +2,7 @@ component SoundTracks(tracks []*arn.SoundTrack)
h1 Soundtracks
.music-buttons
- a.button.ajax(href="/new/soundtrack")
+ a.button.action(data-action="newSoundTrack", data-trigger="click")
Icon("plus")
span Add soundtrack
diff --git a/scripts/Actions.ts b/scripts/Actions.ts
index eb8a8e53..65ec77fb 100644
--- a/scripts/Actions.ts
+++ b/scripts/Actions.ts
@@ -195,21 +195,29 @@ export function createThread(arn: AnimeNotifier) {
.catch(err => arn.statusMessage.showError(err))
}
-// Create soundtrack
-export function createSoundTrack(arn: AnimeNotifier, button: HTMLButtonElement) {
- let soundcloud = arn.app.find("soundcloud-link") as HTMLInputElement
- let youtube = arn.app.find("youtube-link") as HTMLInputElement
- let anime = arn.app.find("anime-link") as HTMLInputElement
- let osu = arn.app.find("osu-link") as HTMLInputElement
+// New soundtrack
+export function newSoundTrack(arn: AnimeNotifier, button: HTMLButtonElement) {
+ arn.post("/api/new/soundtrack", "")
+ .then(response => response.json())
+ .then(response => console.log(response))
+ .catch(err => arn.statusMessage.showError(err))
+}
- let soundtrack = {
- soundcloud: soundcloud.value,
- youtube: youtube.value,
- tags: [anime.value, osu.value],
- }
+// Publish
+export function publish(arn: AnimeNotifier, button: HTMLButtonElement) {
+ let endpoint = arn.findAPIEndpoint(button)
- arn.post("/api/new/soundtrack", soundtrack)
- .then(() => arn.app.load("/soundtracks"))
+ arn.post(endpoint + "/publish", "")
+ .then(() => arn.reloadContent())
+ .catch(err => arn.statusMessage.showError(err))
+}
+
+// Unpublish
+export function unpublish(arn: AnimeNotifier, button: HTMLButtonElement) {
+ let endpoint = arn.findAPIEndpoint(button)
+
+ arn.post(endpoint + "/unpublish", "")
+ .then(() => arn.reloadContent())
.catch(err => arn.statusMessage.showError(err))
}
diff --git a/scripts/AnimeNotifier.ts b/scripts/AnimeNotifier.ts
index 538d1b99..14e6f79d 100644
--- a/scripts/AnimeNotifier.ts
+++ b/scripts/AnimeNotifier.ts
@@ -671,7 +671,7 @@ export class AnimeNotifier {
post(url: string, body: any) {
if(this.isLoading) {
- return Promise.resolve()
+ return Promise.resolve(null)
}
if(typeof body !== "string") {
@@ -685,13 +685,16 @@ export class AnimeNotifier {
body,
credentials: "same-origin"
})
- .then(response => response.text())
- .then(body => {
+ .then(response => {
this.loading(false)
- if(body !== "ok") {
- throw body
+ if(response.status === 200) {
+ return Promise.resolve(response)
}
+
+ return response.text().then(err => {
+ throw err
+ })
})
.catch(err => {
this.loading(false)