8 Commits 418c37c09d ... f4531392fd

Author SHA1 Message Date
  Adam f4531392fd clamp long episodes’ overviews 4 years ago
  Adam 052443e282 mark series to watch, and episodes watched (or skipped) 4 years ago
  Adam d16ae4618b experience film 4 years ago
  Adam 305e746636 add films to watchlist 4 years ago
  Adam 314b3368f0 format %a, %b, and %h in dates 4 years ago
  Adam 554322c55a show experienced in film 4 years ago
  Adam 3a75011ec3 split flex classes in css 4 years ago
  Adam 526a2d9e65 clear old sessions 4 years ago
10 changed files with 359 additions and 36 deletions
  1. 2 1
      accounts/common.go
  2. 9 14
      accounts/login.go
  3. 172 12
      db/db.go
  4. 34 0
      i18n/en-GB.toml
  5. 3 3
      i18n/i18n.go
  6. 81 3
      libamuse/account.go
  7. 33 0
      libamuse/common.go
  8. 18 1
      libamuse/film.go
  9. 7 2
      libamuse/search.go
  10. 0 0
      libamuse/serie.go

+ 2 - 1
accounts/common.go

@@ -4,6 +4,7 @@ type User struct {
 	Username string
 	IsAdmin  bool
 	Session  string
+	Timezone string
 }
 
 func (u User) IsEmpty() bool {
@@ -11,7 +12,7 @@ func (u User) IsEmpty() bool {
 }
 
 type Authentication struct {
-	Token  string
+	Token     string
 	Necessary bool
 }
 

+ 9 - 14
accounts/login.go

@@ -6,9 +6,7 @@ import (
 	"notabug.org/apiote/amuse/db"
 
 	"bytes"
-	"crypto/rand"
 	"encoding/base64"
-	"encoding/hex"
 	"errors"
 	"fmt"
 	"strings"
@@ -151,19 +149,17 @@ func updateSfa(args ...interface{}) (interface{}, error) {
 	return gott.Tuple(args), err
 }
 
-func createToken(args ...interface{}) (interface{}, error) {
-	authResult := args[1].(*AuthResult)
-	sessionIdRaw := make([]byte, 128)
-	rand.Read(sessionIdRaw)
-	sessionId := hex.EncodeToString(sessionIdRaw)
-	authResult.token = sessionId
-	return gott.Tuple(args), nil
-}
-
 func createSession(args ...interface{}) (interface{}, error) {
 	authData := args[0].(*AuthData)
 	authResult := args[1].(*AuthResult)
-	err := db.CreateSession(authData.username, authResult.token, false) // todo long session
+	session, err := db.CreateSession(authData.username, false) // todo long session
+	authResult.token = session.Id
+	return gott.Tuple(args), err
+}
+
+func clearSessions(args ...interface{}) (interface{}, error) {
+	result := args[1].(*AuthResult)
+	err := db.ClearSessions(result.user.Username)
 	return gott.Tuple(args), err
 }
 
@@ -172,12 +168,11 @@ func Login(username, password, sfa string, remember bool) (string, error) {
 		NewResult(gott.Tuple{&AuthData{username: username, password: password,
 			sfa: sfa, remember: remember}, &AuthResult{}}).
 		Bind(findUser).
-		//todo Clear old sessions
+		Bind(clearSessions).
 		Map(unmarshalUser).
 		Bind(checkPassword).
 		Bind(checkSfa).
 		Bind(updateSfa).
-		Bind(createToken).
 		Bind(createSession).
 		Finish()
 	if err != nil {

+ 172 - 12
db/db.go

@@ -1,9 +1,12 @@
 package db
 
 import (
+	"notabug.org/apiote/amuse/tmdb"
 	"notabug.org/apiote/amuse/utils"
 
+	"crypto/rand"
 	"database/sql"
+	"encoding/hex"
 	"errors"
 	"fmt"
 	"os"
@@ -12,6 +15,15 @@ import (
 	_ "github.com/mattn/go-sqlite3"
 )
 
+type ItemType string
+
+const (
+	ItemTypeBook    ItemType = "book"
+	ItemTypeFilm             = "film"
+	ItemTypeTvserie          = "tvserie"
+	ItemTypeUnkown           = "unknown"
+)
+
 type EmptyError struct {
 	message string
 }
@@ -28,12 +40,14 @@ type User struct {
 	AvatarSmall   []byte
 	IsAdmin       bool
 	RecoveryCodes string
+	Timezone      string
 }
 
 type Session struct {
 	Id       string
 	Username string
 	Expiry   time.Time
+	IsLong   bool
 }
 
 func Migrate() error {
@@ -48,15 +62,22 @@ func Migrate() error {
 	if err != nil {
 		return err
 	}
-	_, err = db.Exec(`create table users(username text primary key, password text, sfa text, avatar blob, avatar_small blob, is_admin bool, recovery_codes text)`)
+	_, err = db.Exec(`create table users(username text primary key, password text, sfa text, avatar blob, avatar_small blob, is_admin bool, recovery_codes text, timezone text)`)
 	if err != nil {
 		return err
 	}
-	_, err = db.Exec(`create table sessions(id text primary key, username text, expiry datetime, foreign key(username) references users(username))`)
+	_, err = db.Exec(`create table sessions(id text primary key, username text, expiry datetime, is_long boolean, foreign key(username) references users(username))`)
+	if err != nil {
+		return err
+	}
+	_, err = db.Exec(`create table wantlist(username text, item_type text, item_id text, primary key(username, item_type, item_id), foreign key(username) references users(username))`)
+	if err != nil {
+		return err
+	}
+	_, err = db.Exec(`create table experiences(username text, item_type text, item_id text, time datetime, foreign key(username) references users(username))`)
 	if err != nil {
 		return err
 	}
-
 	return nil
 }
 
@@ -100,7 +121,7 @@ func GetUser(username string) (*User, error) {
 		return nil, err
 	}
 	defer db.Close()
-	rows, err := db.Query(`select password, sfa, recovery_codes, is_admin, avatar, avatar_small from users where username = ?`, username)
+	rows, err := db.Query(`select password, sfa, recovery_codes, is_admin, avatar, avatar_small, timezone from users where username = ?`, username)
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "Select err %v\n", err)
 		return nil, err
@@ -110,7 +131,7 @@ func GetUser(username string) (*User, error) {
 		return nil, EmptyError{message: "User does not exist"}
 	}
 	user := User{Username: username}
-	err = rows.Scan(&user.PasswordHash, &user.Sfa, &user.RecoveryCodes, &user.IsAdmin, &user.Avatar, &user.AvatarSmall)
+	err = rows.Scan(&user.PasswordHash, &user.Sfa, &user.RecoveryCodes, &user.IsAdmin, &user.Avatar, &user.AvatarSmall, &user.Timezone)
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "Scan err %v\n", err)
 		return nil, err
@@ -134,11 +155,15 @@ func UpdateRecoveryCodes(username, recoveryCodes string) error {
 	return nil
 }
 
-func CreateSession(username, sessionId string, long bool) error {
+func CreateSession(username string, long bool) (Session, error) {
+	sessionIdRaw := make([]byte, 64)
+	rand.Read(sessionIdRaw)
+	sessionId := hex.EncodeToString(sessionIdRaw)
+
 	db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "DB open err\n")
-		return err
+		return Session{}, err
 	}
 	defer db.Close()
 
@@ -148,12 +173,12 @@ func CreateSession(username, sessionId string, long bool) error {
 	} else {
 		length = "1 hour"
 	}
-	_, err = db.Exec(`insert into sessions values(?, ?, datetime('now', '`+length+`'))`, sessionId, username)
+	_, err = db.Exec(`insert into sessions values(?, ?, datetime('now', '`+length+`'), ?)`, sessionId, username, long)
 	if err != nil {
-		return err
+		return Session{}, err
 	}
 
-	return nil
+	return Session{Id: sessionId, Username: username, IsLong: long}, nil
 }
 
 func GetSession(token string) (*Session, error) {
@@ -164,7 +189,7 @@ func GetSession(token string) (*Session, error) {
 	}
 	defer db.Close()
 
-	rows, err := db.Query(`select username, expiry from sessions where id = ?`, token)
+	rows, err := db.Query(`select username, expiry, is_long from sessions where id = ?`, token)
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "Select err %v\n", err)
 		return nil, err
@@ -174,10 +199,145 @@ func GetSession(token string) (*Session, error) {
 		return nil, EmptyError{message: "Session does not exist"}
 	}
 	session := Session{Id: token}
-	err = rows.Scan(&session.Username, &session.Expiry)
+	err = rows.Scan(&session.Username, &session.Expiry, &session.IsLong)
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "Scan err %v\n", err)
 		return nil, err
 	}
 	return &session, nil
 }
+
+func ClearSessions(username string) error {
+	db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "DB open err\n")
+		return err
+	}
+	defer db.Close()
+
+	_, err = db.Exec(`delete from sessions where username = ? and expiry < datetime('now')`, username)
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Delete err %v\n", err)
+		return err
+	}
+
+	return nil
+}
+
+func GetItemExperiences(username, itemId string, itemType ItemType) (map[string][]time.Time, error) {
+	times := map[string][]time.Time{}
+	user, err := GetUser(username)
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Get user err: %v\n", err)
+		return times, err
+	}
+	location, err := time.LoadLocation(user.Timezone)
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Load location err: %v\n", err)
+		return times, err
+	}
+
+	db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "DB open err\n")
+		return times, err
+	}
+	defer db.Close()
+	rows, err := db.Query(`select time, item_id from experiences where username = ? and item_type = ? and (item_id = ? or item_id like ?)`, username, itemType, itemId, itemId+"/%")
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Select err %v\n", err)
+		return times, err
+	}
+	defer rows.Close()
+
+	for rows.Next() {
+		var (
+			t  time.Time
+			id string
+		)
+		err := rows.Scan(&t, &id)
+		if err != nil {
+			fmt.Fprintf(os.Stderr, "Scan err %v\n", err)
+			return times, err
+		}
+		t = t.In(location)
+		times[id] = append(times[id], t)
+	}
+	return times, nil
+}
+
+func AddToExperiences(username, itemId string, itemType ItemType, datetime time.Time) error {
+	db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "DB open err\n")
+		return err
+	}
+	defer db.Close()
+
+	_, err = db.Exec(`insert into experiences values(?, ?, ?, ?)`, username, itemType, itemId, datetime)
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Insert err %v\n", err)
+		return err
+	}
+
+	//todo if !datetime.IsZero() then delete all datetime that .IsZero() where itemId = itemId
+	return nil
+}
+
+func AddToWantList(username, itemId string, itemType ItemType) error {
+	db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "DB open err\n")
+		return err
+	}
+	defer db.Close()
+
+	_, err = db.Exec(`insert into wantlist values(?, ?, ?)`, username, itemType, itemId)
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Insert err %v\n", err)
+		return err
+	}
+	return nil
+}
+
+func RemoveFromWantList(username, itemId string, itemType ItemType) error {
+	db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "DB open err\n")
+		return err
+	}
+	defer db.Close()
+
+	_, err = db.Exec(`delete from wantlist where username = ? and item_type = ? and item_id = ?`, username, itemType, itemId)
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Insert err %v\n", err)
+		return err
+	}
+	return nil
+}
+
+func IsOnWantList(username, itemId string, itemType ItemType) (bool, error) {
+	db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "DB open err\n")
+		return false, err
+	}
+	defer db.Close()
+
+	rows, err := db.Query(`select 1 from wantlist where username = ? and item_id = ? and item_type = ?`, username, itemId, string(itemType))
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Select err: %v\n", err)
+		return false, err
+	}
+	return rows.Next(), nil
+}
+
+func GetItemTypeFromShow(show tmdb.Show) ItemType {
+	if _, ok := show.(*tmdb.Film); ok {
+		return ItemTypeFilm
+	} else if _, ok := show.(*tmdb.TvSerie); ok {
+		return ItemTypeTvserie
+	} else {
+		return ItemTypeUnkown
+	}
+}

+ 34 - 0
i18n/en-GB.toml

@@ -10,6 +10,14 @@
 [global]
 # format as per POSIX date(1p) without %c, %r, %x, %X
 date_format = "%d %B %Y"
+date_format_full = "%d %B %Y, %H:%M"
+
+experience_format_today = "today"
+experience_format_yesterday = "yesterday"
+experience_format_ereyester = "ereyester"
+experience_format_week = "last %A"
+experience_format_year = "on %b %d"
+experience_format_earlier = "on %d %B %Y"
 
 Monday = "Monday"
 Tuesday = "Tuesday"
@@ -18,6 +26,13 @@ Thursday = "Thursday"
 Friday = "Friday"
 Saturday = "Saturday"
 Sunday = "Sunday"
+Monday_short = "Mon"
+Tuesday_short = "Tue"
+Wednesday_short = "Wed"
+Thursday_short = "Thu"
+Friday_short = "Fri"
+Saturday_short = "Sat"
+Sunday_short = "Sun"
 
 January = "January"
 February = "February"
@@ -31,9 +46,23 @@ September = "September"
 October = "October"
 November = "November"
 December = "December"
+January_short = "Jan"
+February_short = "Feb"
+March_short = "Mar"
+April_short = "Apr"
+May_short = "May"
+June_short = "Jun"
+July_short = "Jul"
+August_short = "Aug"
+September_short = "Sep"
+October_short = "Oct"
+November_short = "Nov"
+December_short = "Dec"
 
 search = "search…"
 
+unknown = "unknown"
+
 [index]
 # `{}` is replaced with search field
 let_amuse_you = "Let {} amuse You"
@@ -74,6 +103,9 @@ source = "Source"
 runtime = "Runtime"
 status = "Status"
 empty_payroll = "Empty payroll"
+watched = "Watched"
+Watchlist = "Watchlist"
+onWatchlist = "You want to watch this film"
 
 [serie]
 season = "Season"
@@ -89,6 +121,8 @@ based_on = "Based on"
 latest_episode = "Latest episode"
 empty_payroll = "Empty payroll"
 no_episodes = "This season is empty"
+watched = "Watched"
+next_episode = "Next episode"
 
 [person]
 cast = "Cast"

+ 3 - 3
i18n/i18n.go

@@ -98,16 +98,16 @@ func LoadStrings(language string) (Translation, error) {
 }
 
 func FormatDate(date time.Time, format string, translation map[string]string) string {
-	// todo %a
+	format = strings.ReplaceAll(format, "%a", translation[date.Weekday().String()+"_short"])
 	format = strings.ReplaceAll(format, "%A", translation[date.Weekday().String()])
-	// todo %b
+	format = strings.ReplaceAll(format, "%b", translation[date.Month().String()+"_short"])
 	format = strings.ReplaceAll(format, "%B", translation[date.Month().String()])
 	// %c intentionally ommitted
 	format = strings.ReplaceAll(format, "%C", fmt.Sprintf("%d", date.Year()/100))
 	format = strings.ReplaceAll(format, "%d", fmt.Sprintf("%02d", date.Day()))
 	format = strings.ReplaceAll(format, "%D", fmt.Sprintf("%02d/%02d/%02d", date.Month(), date.Day(), date.Year()%100))
 	format = strings.ReplaceAll(format, "%e", fmt.Sprintf("%2d", date.Day()))
-	// todo %h == %b
+	format = strings.ReplaceAll(format, "%h", translation[date.Month().String()+"_short"])
 	format = strings.ReplaceAll(format, "%H", fmt.Sprintf("%02d", date.Hour()))
 	hour := date.Hour() % 12
 	if hour == 0 {

+ 81 - 3
libamuse/account.go

@@ -5,9 +5,11 @@ import (
 	"notabug.org/apiote/amuse/db"
 
 	"errors"
-	"time"
 	"fmt"
 	"os"
+	"time"
+
+	"notabug.org/apiote/gott"
 )
 
 func VerifyAuthToken(token accounts.Authentication) (accounts.User, error) {
@@ -36,8 +38,84 @@ func VerifyAuthToken(token accounts.Authentication) (accounts.User, error) {
 	}
 	user := accounts.User{
 		Username: dbUser.Username,
-		IsAdmin: dbUser.IsAdmin,
-		Session: token.Token,
+		IsAdmin:  dbUser.IsAdmin,
+		Session:  token.Token,
+		Timezone: dbUser.Timezone,
 	}
 	return user, nil
 }
+
+func addToWantlist(args ...interface{}) (interface{}, error) {
+	data := args[0].(*RequestData)
+	result := args[1].(*Result)
+	itemType := args[2].(string)
+
+	err := db.AddToWantList(result.user.Username, data.id, db.ItemType(itemType))
+
+	return gott.Tuple(args), err
+}
+
+func AddToWantlist(username string, auth accounts.Authentication, itemId, itemType, language, mimetype string) error {
+	auth.Necessary = true
+	_, err := gott.
+		NewResult(gott.Tuple{&RequestData{id: itemId, language: language, mimetype: mimetype, auth: auth, username: username}, &Result{}, itemType}).
+		Bind(parseLanguage).
+		Bind(verifyToken).
+		Bind(verifyUser).
+		Bind(addToWantlist).
+		Finish()
+
+	return err
+}
+
+func parseExperienceDate(args ...interface{}) (interface{}, error) {
+	result := args[1].(*Result)
+	datetime := args[3].(string)
+	var t time.Time
+	var err error = nil
+	if datetime == "" {
+		t = time.Now()
+	} else {
+		location, _ := time.LoadLocation(result.user.Timezone)
+		t, err = time.ParseInLocation(time.RFC3339, datetime, location)
+	}
+	t = t.In(time.UTC)
+	result.result = t
+	return gott.Tuple(args), err
+}
+
+func addToExperiences(args ...interface{}) (interface{}, error) {
+	data := args[0].(*RequestData)
+	result := args[1].(*Result)
+	itemType := args[2].(string)
+	t := result.result.(time.Time)
+
+	err := db.AddToExperiences(result.user.Username, data.id, db.ItemType(itemType), t)
+
+	return gott.Tuple(args), err
+}
+
+func removeFromWantList(args ...interface{}) (interface{}, error) {
+	data := args[0].(*RequestData)
+	result := args[1].(*Result)
+	itemType := args[2].(string)
+
+	err := db.RemoveFromWantList(result.user.Username, data.id, db.ItemType(itemType))
+
+	return gott.Tuple(args), err
+}
+
+func AddToExperiences(username string, auth accounts.Authentication, itemId, itemType, datetime, language, mimetype string) error {
+	auth.Necessary = true
+	_, err := gott.
+		NewResult(gott.Tuple{&RequestData{id: itemId, language: language, mimetype: mimetype, auth: auth, username: username}, &Result{}, itemType, datetime}).
+		Bind(parseLanguage).
+		Bind(verifyToken).
+		Bind(verifyUser).
+		Bind(parseExperienceDate).
+		Bind(addToExperiences).
+		Bind(removeFromWantList).
+		Finish()
+
+	return err
+}

+ 33 - 0
libamuse/common.go

@@ -5,8 +5,10 @@ import (
 	"notabug.org/apiote/amuse/front"
 	"notabug.org/apiote/amuse/tmdb"
 	"notabug.org/apiote/amuse/wikidata"
+	"notabug.org/apiote/amuse/db"
 
 	"database/sql"
+	"errors"
 	"golang.org/x/text/language"
 
 	"notabug.org/apiote/gott"
@@ -16,6 +18,7 @@ type Data interface {
 	getLanguage() string
 	getMimeType() string
 	getAuth() accounts.Authentication
+	getReqUsername() string
 }
 
 func verifyToken(args ...interface{}) (interface{}, error) {
@@ -29,6 +32,15 @@ func verifyToken(args ...interface{}) (interface{}, error) {
 	return gott.Tuple(args), err
 }
 
+func verifyUser(args ...interface{}) (interface{}, error) {
+	data := args[0].(Data)
+	result := args[1].(*Result)
+	if result.user.Username != data.getReqUsername() {
+		return gott.Tuple(args), accounts.AuthError{Err: errors.New("403")}
+	}
+	return gott.Tuple(args), nil
+}
+
 func createDbConnection(args ...interface{}) (interface{}, error) {
 	requestData := args[0].(*RequestData)
 	db, err := sql.Open("sqlite3", "./amuse.db")
@@ -81,6 +93,22 @@ func getBasedOn(args ...interface{}) (interface{}, error) {
 	return gott.Tuple(args), err
 }
 
+func isOnWantList(args ...interface{}) (interface{}, error) {
+	data := args[0].(*RequestData)
+	result := args[1].(*Result)
+	show := result.result.(tmdb.Show)
+
+	if result.user.IsEmpty() {
+		return gott.Tuple(args), nil
+	}
+
+	itemType := db.GetItemTypeFromShow(show)
+
+	isOnList, err := db.IsOnWantList(result.user.Username, data.id, itemType)
+	show.SetOnWantList(isOnList)
+	return gott.Tuple(args), err
+}
+
 type RequestData struct {
 	id         string
 	etag       string
@@ -89,6 +117,7 @@ type RequestData struct {
 	mimetype   string
 	code       int
 	auth       accounts.Authentication
+	username   string
 }
 
 type Result struct {
@@ -111,3 +140,7 @@ func (d RequestData) getMimeType() string {
 func (d RequestData) getAuth() accounts.Authentication {
 	return d.auth
 }
+
+func (d RequestData) getReqUsername() string {
+	return d.username
+}

+ 18 - 1
libamuse/film.go

@@ -1,8 +1,9 @@
 package libamuse
 
 import (
-	"notabug.org/apiote/amuse/tmdb"
 	"notabug.org/apiote/amuse/accounts"
+	"notabug.org/apiote/amuse/db"
+	"notabug.org/apiote/amuse/tmdb"
 
 	"strconv"
 
@@ -42,6 +43,20 @@ func renderFilm(args ...interface{}) interface{} {
 	return gott.Tuple(args)
 }
 
+func getFilmExperiences(args ...interface{}) (interface{}, error) {
+	data := args[0].(*RequestData)
+	result := args[1].(*Result)
+	film := result.result.(*tmdb.Film)
+
+	if result.user.IsEmpty() {
+		return gott.Tuple(args), nil
+	}
+	
+	exp, err := db.GetItemExperiences(result.user.Username, data.id, db.ItemTypeFilm)
+	film.Experiences = exp[data.id]
+	return gott.Tuple(args), err
+}
+
 func ShowFilm(id, language, mimetype string, auth accounts.Authentication) (string, error) {
 	auth.Necessary = false
 	request := &RequestData{id: id, language: language, mimetype: mimetype, auth: auth}
@@ -53,6 +68,8 @@ func ShowFilm(id, language, mimetype string, auth accounts.Authentication) (stri
 		Bind(getFilm).
 		Bind(getCollection).
 		Bind(getBasedOn).
+		Bind(getFilmExperiences).
+		Bind(isOnWantList).
 		Bind(createRenderer).
 		Map(renderFilm).
 		Finish()

+ 7 - 2
libamuse/search.go

@@ -1,9 +1,9 @@
 package libamuse
 
 import (
+	"notabug.org/apiote/amuse/accounts"
 	"notabug.org/apiote/amuse/tmdb"
 	"notabug.org/apiote/amuse/wikidata"
-	"notabug.org/apiote/amuse/accounts"
 
 	"notabug.org/apiote/gott"
 
@@ -15,7 +15,8 @@ type QueryData struct {
 	language string
 	mimetype string
 	page     string
-	auth       accounts.Authentication
+	auth     accounts.Authentication
+	username string
 }
 
 func (d QueryData) getLanguage() string {
@@ -30,6 +31,10 @@ func (d QueryData) getAuth() accounts.Authentication {
 	return d.auth
 }
 
+func (d QueryData) getReqUsername() string {
+	return d.username
+}
+
 func searchTmdb(args ...interface{}) (interface{}, error) {
 	data := args[0].(*QueryData)
 	result := args[1].(*Result)

+ 0 - 0
libamuse/serie.go


Some files were not shown because too many files changed in this diff