diff --git a/database/database.go b/database/database.go index 8daca90..8e582a3 100644 --- a/database/database.go +++ b/database/database.go @@ -43,6 +43,9 @@ type LetsPlay struct { PosterB sql.NullString Aired time.Time `sql:"default:null"` + MergeID sql.NullInt64 + MergeSeason sql.NullInt64 + Episodes []Episode } @@ -79,7 +82,6 @@ type Episode struct { Slug sql.NullString `sql:"not null;unique_index"` Name sql.NullString `sql:"not null"` - Season sql.NullInt64 `sql:"not null"` Episode sql.NullInt64 `sql:"not null"` ThumbS sql.NullString ThumbB sql.NullString @@ -89,6 +91,7 @@ type Episode struct { Rating sql.NullFloat64 Votes sql.NullInt64 Duration sql.NullInt64 + Season sql.NullInt64 `sql:"not null;default:1"` } var Db gorm.DB @@ -102,6 +105,11 @@ func InitDb(connection string) (error) { } Db.LogMode(false) + Db.Model(&LetsPlay{}).AddForeignKey("author_id", "authors(id)", "RESTRICT", "RESTRICT") + Db.Model(&LetsTest{}).AddForeignKey("author_id", "authors(id)", "RESTRICT", "RESTRICT") + Db.Model(&Episode{}).AddForeignKey("author_id", "authors(id)", "RESTRICT", "RESTRICT") + Db.Model(&Episode{}).AddForeignKey("lets_play_id", "lets_plays(id)", "RESTRICT", "RESTRICT") + Db.AutoMigrate(&Author{}, &LetsPlay{}, &LetsTest{}, &Episode{}) return err @@ -168,6 +176,16 @@ func (l *LetsPlay) BeforeSave() (err error) { } else { l.PosterB.Valid = true } + if l.MergeID.Int64 == 0 { + l.MergeID.Valid = false + } else { + l.MergeID.Valid = true + } + if l.MergeSeason.Int64 == 0 { + l.MergeSeason.Valid = false + } else { + l.MergeSeason.Valid = true + } return } diff --git a/gparser/cli.go b/gparser/cli.go index 0310027..4523b91 100644 --- a/gparser/cli.go +++ b/gparser/cli.go @@ -22,6 +22,10 @@ var aslug string var youtubeid string var poster string +var newslug string +var oldslug string +var newseason int64 + func InitCli() { flag.StringVar(&mode, "mode", "", "Specifies the action to be done. Can be add_lt and merge_lps") @@ -31,6 +35,11 @@ func InitCli() { flag.StringVar(&aslug, "author", "", "Author slug") flag.StringVar(&youtubeid, "youtube", "", "YouTube ID of the video") flag.StringVar(&poster, "poster", "", "Poster URL that should be used") + + // For merge_lps + flag.StringVar(&newslug, "newslug", "", "Slug of the final LP") + flag.StringVar(&oldslug, "oldslug", "", "Current slug of LP to be merged") + flag.Int64Var(&newseason, "newseason", 0, "Season the episodes of the old LP will become") } func DoCli() { @@ -43,7 +52,10 @@ func DoCli() { } ParseCliLT() } else if mode == "merge_lps" { - + if (oldslug == "" || newslug == "" || newseason == 0) { + log.Fatalf("oldslug, newslug, newseason must be specified") + } + MergeLPs() } os.Exit(0) } @@ -100,4 +112,19 @@ func ParseCliLT() { if err := database.Db.Create(<).Error; err != nil { log.Printf("ERR LT %s: Could not be added to databse (%+v)", slug, err) } +} + +func MergeLPs() { + var OldLP database.LetsPlay + var NewLP database.LetsPlay + database.Db.Where("slug = ?", oldslug).First(&OldLP) + database.Db.Where("slug = ?", newslug).First(&NewLP) + + database.Db.Exec("UPDATE episodes SET season=? WHERE lets_play_id = ?", newseason, OldLP.ID) + database.Db.Exec("UPDATE episodes SET lets_play_id=? WHERE lets_play_id = ?", NewLP.ID, OldLP.ID) + + OldLP.MergeID.Int64 = int64(NewLP.ID) + OldLP.MergeSeason.Int64 = newseason + + database.Db.Save(&OldLP) } \ No newline at end of file diff --git a/gparser/episodeparser.go b/gparser/episodeparser.go index 3920bab..36a9b34 100644 --- a/gparser/episodeparser.go +++ b/gparser/episodeparser.go @@ -69,7 +69,13 @@ func ParseEpisode(i int, s *goquery.Selection) { ur, _ = url.Parse(u) var LP database.LetsPlay database.Db.Where("slug = ?", path.Base(ur.Path)).First(&LP) - EP.LetsPlayID = LP.ID + if LP.MergeID.Valid == false { + EP.LetsPlayID = LP.ID + EP.Season.Int64 = 1 + } else { + EP.LetsPlayID = uint(LP.MergeID.Int64) + EP.Season.Int64 = LP.MergeSeason.Int64 + } res, err := GetHTTPResource(gu) if err != nil { log.Printf("ERR EP %s: Request failed (%+v)", slug, err) diff --git a/gparser/feedparser.go b/gparser/feedparser.go index 4160c67..038453e 100644 --- a/gparser/feedparser.go +++ b/gparser/feedparser.go @@ -83,7 +83,13 @@ func ParseFeedEpisode(u string) { return } } - EP.LetsPlayID = LP.ID + if LP.MergeID.Valid == false { + EP.LetsPlayID = LP.ID + EP.Season.Int64 = 1 + } else { + EP.LetsPlayID = uint(LP.MergeID.Int64) + EP.Season.Int64 = LP.MergeSeason.Int64 + } res, err := GetHTTPResource(u) if err != nil { log.Printf("ERR RS %s: Request failed (%+v)", slug, err) @@ -106,7 +112,6 @@ func ParseFeedEpisode(u string) { log.Printf("WAR RSS %s: Name does not match RegEx", slug) EP.Episode.Int64 = 0 } - EP.Season.Int64 = 1 doc.Find(".article > p").Each(func(i int, s *goquery.Selection) { EP.Descr.String += s.Text() + "\n" }) diff --git a/gserver/admin.go b/gserver/admin.go index 4e5e5d6..47b1449 100644 --- a/gserver/admin.go +++ b/gserver/admin.go @@ -70,6 +70,12 @@ func PostAdminLetsPlay(c *gin.Context) { if id, err := strconv.ParseUint(c.PostForm("authorid"), 10, 0); err == nil { LP.AuthorID = uint(id) } + if mergeid, err := strconv.ParseUint(c.PostForm("mergeid"), 10, 0); err == nil { + LP.MergeID.Int64 = int64(mergeid) + } + if mergeseason, err := strconv.ParseUint(c.PostForm("mergeseason"), 10, 0); err == nil { + LP.MergeSeason.Int64 = int64(mergeseason) + } LP.Slug.String = c.PostForm("slug") LP.Name.String = c.PostForm("name") if c.PostForm("posters") == "" && !strings.HasPrefix(c.PostForm("posterb"), "/") { diff --git a/gserver/templates/admin_lp.html b/gserver/templates/admin_lp.html index 6ecbf45..a164873 100644 --- a/gserver/templates/admin_lp.html +++ b/gserver/templates/admin_lp.html @@ -9,6 +9,12 @@ + + diff --git a/gserver/webapp.go b/gserver/webapp.go index 25b5c00..823e2e7 100644 --- a/gserver/webapp.go +++ b/gserver/webapp.go @@ -31,7 +31,7 @@ func GetIndex(c *gin.Context) { func GetLps(c *gin.Context) { var LPs []database.LetsPlay - database.Db.Where("aired IS NOT NULL").Order("name asc").Find(&LPs) + database.Db.Where("aired IS NOT NULL and merge_id IS NULL").Order("name asc").Find(&LPs) var data []gin.H for _, LP := range LPs { var AT database.Author @@ -235,7 +235,7 @@ func GetLEpisode(c *gin.Context) { //No EP in URL var EPs []database.Episode var AT database.Author - database.Db.Model(&LP).Order("episode asc").Related(&EPs) + database.Db.Model(&LP).Order("season asc").Order("episode asc").Related(&EPs) database.Db.Model(&LP).Related(&AT) var DEP []gin.H for _, EP := range EPs {