amuse.git

commit a325c899b614b7853a666f239e2c1466f338a663

Author: Adam <git@apiote.tk>

watch whole season at once

 db/db.go | 4 ++--
 i18n/en-GB.toml | 1 +
 libamuse/account.go | 20 +++++++++++++-------
 libamuse/serie.go | 17 ++++++++++++-----
 templates/tvserie.html | 9 +++++++++
 tmdb/serie.go | 25 +++++++------------------


diff --git a/db/db.go b/db/db.go
index 978e7af9a3db4b9e12773756193e5ee4f3872f61..23bc3b4bcc70d409942b15ca35072482999fded8 100644
--- a/db/db.go
+++ b/db/db.go
@@ -373,7 +373,7 @@
 	return int(insertedRowsNumber - deletedRowsNumber), nil
 }
 
-func SkipSpecials(username, itemId string, episodes []string, itemType datastructure.ItemType) (int, error) {
+func WatchWholeSerie(username, itemId string, episodes []string, itemType datastructure.ItemType, datetime time.Time) (int, error) {
 	db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "DB open err\n")
@@ -412,7 +412,7 @@ 	for _, episodeId := range episodes {
 		if watched[episodeId] > 0 {
 			continue
 		}
-		_, err = tx.Exec(`insert into experiences values(?, ?, ?, ?)`, username, itemType, episodeId, "0001-01-01 00:00:00+00:00")
+		_, err = tx.Exec(`insert into experiences values(?, ?, ?, ?)`, username, itemType, episodeId, datetime)
 		if err != nil {
 			if err.Error()[:6] != "UNIQUE" {
 				fmt.Fprintf(os.Stderr, "Insert err %v\n", err)




diff --git a/i18n/en-GB.toml b/i18n/en-GB.toml
index 8f70a295766f96b7652fdc304e473746c5f32090..a00330b30612f56ac18e93c672685b04ffa091ae 100644
--- a/i18n/en-GB.toml
+++ b/i18n/en-GB.toml
@@ -149,6 +149,7 @@ episodes = "Episodes"
 skipped = "Skipped"
 want_watch = "Want to watch"
 skip_specials = "Skip all specials"
+watched_whole_season = "Watched whole season"
 
 [person]
 cast = "Cast"




diff --git a/libamuse/account.go b/libamuse/account.go
index 6ea4e11e15ff1a940609293684bd2bff59441021..0827924d75a7b20fbb100bb6ceb3cc7ce55fb7d9 100644
--- a/libamuse/account.go
+++ b/libamuse/account.go
@@ -163,7 +163,7 @@ 	id := strings.Split(itemId, "/")
 	if len(id) > 1 && id[1][3] == 'A' {
 		arg, err := gott.
 			NewResult(gott.Tuple(args)).
-			Bind(getSeason0).
+			Bind(getSeason).
 			Finish()
 		if err == nil {
 			args = arg.(gott.Tuple)
@@ -186,11 +186,13 @@
 	id := strings.Split(itemId, "/")
 	if len(id) > 1 && id[1][3] == 'A' {
 		serie := result.result.(*tmdb.TvSerie)
+		var season int
+		fmt.Sscanf(id[1][1:3], "%d", &season)
 		episodes := []string{}
-		for _, episode := range serie.Seasons[0].Episodes {
+		for _, episode := range serie.Seasons[season].Episodes {
 			episodes = append(episodes, data.id+"/"+episode.Episode_code)
 		}
-		refs, err = db.SkipSpecials(result.user.Username, id[0], episodes, datastructure.ItemType(itemType))
+		refs, err = db.WatchWholeSerie(result.user.Username, id[0], episodes, datastructure.ItemType(itemType), t)
 	} else {
 		refs, err = db.AddToExperiences(result.user.Username, itemId, datastructure.ItemType(itemType), t)
 	}
@@ -213,11 +215,15 @@
 	var err error
 	if len(id) > 1 && id[1][3] == 'A' {
 		serie := result.result.(*tmdb.TvSerie)
-		episodes := []string{}
-		for _, episode := range serie.Seasons[0].Episodes {
-			episodes = append(episodes, data.id+"/"+episode.Episode_code)
+		var season int
+		fmt.Sscanf(id[1][1:3], "%d", &season)
+		if season == 0 {
+			episodes := []string{}
+			for _, episode := range serie.Seasons[0].Episodes {
+				episodes = append(episodes, data.id+"/"+episode.Episode_code)
+			}
+			err = db.ClearSpecials(result.user.Username, id[0], episodes, datastructure.ItemType(itemType))
 		}
-		err = db.ClearSpecials(result.user.Username, id[0], episodes, datastructure.ItemType(itemType))
 	}
 	return gott.Tuple(args), err
 }




diff --git a/libamuse/serie.go b/libamuse/serie.go
index 521d830267da953390b8db839e9c2667c9cac83e..a62aa17095a8ba37621264f4c95977140a381a5c 100644
--- a/libamuse/serie.go
+++ b/libamuse/serie.go
@@ -2,11 +2,13 @@ package libamuse
 
 import (
 	"notabug.org/apiote/amuse/accounts"
+	"notabug.org/apiote/amuse/datastructure"
 	"notabug.org/apiote/amuse/db"
 	"notabug.org/apiote/amuse/tmdb"
-	"notabug.org/apiote/amuse/datastructure"
 
+	"fmt"
 	"sort"
+	"strings"
 
 	"notabug.org/apiote/gott"
 )
@@ -37,12 +39,17 @@ 	tvSerie.Seasons = seasons
 	return gott.Tuple(args), err
 }
 
-func getSeason0(args ...interface{}) (interface{}, error) {
+func getSeason(args ...interface{}) (interface{}, error) {
 	result := args[1].(*Result)
+	itemId := args[3].(string)
+	id := strings.Split(itemId, "/")
+	var seasonNumber int
+	fmt.Sscanf(id[1][1:3], "%d", &seasonNumber)
 	tvSerie := result.result.(*tmdb.TvSerie)
 	languages := result.languages
-	seasons, err := tmdb.GetSeason0(tvSerie, languages[0].String())
-	tvSerie.Seasons = seasons
+	season, err := tmdb.GetSeason(tvSerie, languages[0].String(), seasonNumber)
+	tvSerie.Seasons = make([]tmdb.Season, seasonNumber+1)
+	tvSerie.Seasons[seasonNumber] = season
 	return gott.Tuple(args), err
 }
 
@@ -134,7 +141,7 @@ 		}
 		watchedAndSkipped += 1
 	}
 	if tvSerie.AllEpisodes > 0 {
-		tvSerie.Progress = min(watched * 100 / (tvSerie.AllEpisodes - skipped), 100)
+		tvSerie.Progress = min(watched*100/(tvSerie.AllEpisodes-skipped), 100)
 	}
 	tvSerie.WatchedEpisodes = watched
 	tvSerie.SkippedEpisodes = skipped




diff --git a/templates/tvserie.html b/templates/tvserie.html
index 849c1f864aaff3bfba87c649f9f73af6e3edab75..25b568f5fb7d9d9a1e94d0830862b584cb61de92 100644
--- a/templates/tvserie.html
+++ b/templates/tvserie.html
@@ -188,6 +188,15 @@ 						
 						<input type="checkbox" class="display-none" name="isOtherTime" value="true" checked />
 						<button type="submit" class="border-text hover-bg-grey padding-tb-_25 cursor-hand text font-1_5"><span class="padding-lr-_5 material-icon font-1_5">&#xe044;</span><span class="sans padding-lr-_5">{{$.Strings.Serie.skip_specials}}</span></button>
 					</form>
+					{{else}}
+					<form action="/users/{{$.State.User.Username}}/experiences/" method="POST" class="flex flex-centre">
+						<input type="hidden" name="itemId" value="{{$.Data.Id}}/S{{.Season_number_string}}A{{len .Episodes}}" />
+						<input type="hidden" name="itemType" value="tvserie" />
+						<input type="hidden" name="experiencedDate" value="0001-01-01"/>
+						<input type="hidden" name="experiencedTime" value="00:00"/>
+						<input type="checkbox" class="display-none" name="isOtherTime" value="true"/>
+						<button type="submit" class="border-text hover-bg-dark-accent cursor-hand text-black font-1_5"><span class="padding-lr-_5 material-icon font-1_5">&#xe01f;</span><span class="sans padding-lr-_5">{{$.Strings.Serie.watched_whole_season}}</span></button>
+					</form>
 					{{end}}
 					{{range .Episodes}}
 					<div class="flex margin-tb-1">




diff --git a/tmdb/serie.go b/tmdb/serie.go
index 27e34f73b41f619abfa95dc6a7961f1346fb17db..1e86ff12fe45aa39e39d67201a922bb8cdd0b6fc 100644
--- a/tmdb/serie.go
+++ b/tmdb/serie.go
@@ -39,9 +39,10 @@ 	return i18n.FormatDateNice(e.Experiences[0], strings, timezone)
 }
 
 type Season struct {
-	Season_number int `json:"season_number"`
-	Episodes      []Episode
-	Credits       ShowCredits
+	Season_number        int `json:"season_number"`
+	Season_number_string string
+	Episodes             []Episode
+	Credits              ShowCredits
 }
 
 type TvSerie struct {
@@ -201,6 +202,7 @@ 	for i, episode := range season.Episodes {
 		episode.Episode_code = fmt.Sprintf("S%02dE%02d", season.Season_number, episode.Episode_number)
 		season.Episodes[i] = episode
 	}
+	season.Season_number_string = fmt.Sprintf("%02d", season.Season_number)
 	result.Result = season
 	return gott.Tuple(args), err
 }
@@ -241,7 +243,7 @@ 		return serie.(gott.Tuple)[1].(*network.Result).Result.(*TvSerie), nil
 	}
 }
 
-func getSeason(serie *TvSerie, language string, seasonNumber int) (Season, error) {
+func GetSeason(serie *TvSerie, language string, seasonNumber int) (Season, error) {
 	seasonNumberS := strconv.FormatInt(int64(seasonNumber), 10)
 	s, err := gott.
 		NewResult(gott.Tuple{&network.Request{Id: serie.Id, Language: language, Subid: seasonNumberS}, &network.Result{}}).
@@ -260,24 +262,11 @@ 	season := *s.(gott.Tuple)[1].(*network.Result).Result.(*Season)
 	return season, err
 }
 
-func GetSeason0(serie *TvSerie, language string) ([]Season, error) {
-	seasons := []Season{}
-	var (
-		err    error
-		season Season
-	)
-	if serie.Seasons[0].Season_number == 0 {
-		season, err = getSeason(serie, language, 0)
-		seasons = append(seasons, season)
-	}
-	return seasons, err
-}
-
 func GetSeasons(serie *TvSerie, language string) ([]Season, error) {
 	var err error
 	var seasons []Season
 	for _, serieSeason := range serie.Seasons {
-		season, err2 := getSeason(serie, language, serieSeason.Season_number)
+		season, err2 := GetSeason(serie, language, serieSeason.Season_number)
 		err = utils.Or(err, err2)
 		seasons = append(seasons, season)
 	}