diff --git a/main.go b/main.go index 7c9854a..93f3678 100644 --- a/main.go +++ b/main.go @@ -3,8 +3,10 @@ package main import ( "database/sql" "encoding/xml" + "encoding/json" "fmt" "io/ioutil" + "net/http" "os" "path/filepath" @@ -121,7 +123,6 @@ func open_database(data_dir string) (*sql.DB, error) { return nil, fmt.Errorf("Could not open database: %v", err) } - // check if the database is new is_db_new := `SELECT CASE WHEN EXISTS(SELECT 1 FROM sqlite_master) THEN 0 ELSE 1 END AS IsEmpty;` @@ -158,7 +159,6 @@ CREATE TABLE episodes( } defer rows.Close() - rows.Next() var isEmpty int rows.Scan(&isEmpty) @@ -179,7 +179,7 @@ CREATE TABLE episodes( } type TVShow struct { - XMLName xml.Name `xml:"tvshow"` + XMLName xml.Name `xml:"tvshow" json:"-"` Title string `xml:"title"` OriginalTile string `xml:"originaltitle"` ShowTitle string `xml:"showtitle"` @@ -259,7 +259,7 @@ func insert_tvshow_nfo(show_dir string, stmt *sql.Stmt) bool { } type Episode struct { - XMLName xml.Name `xml:"episodedetails"` + XMLName xml.Name `xml:"episodedetails" json:"-"` Title string `xml:"title"` ShowTitle string `xml:"showtitle"` Season int `xml:"season"` @@ -343,6 +343,94 @@ func scan_tvshow_episodes(show_dir string, tx *sql.Tx) error { return nil } + +type GetShows struct { + Shows []TVShow +} +func get_shows_handler(data_dir string, w http.ResponseWriter, r *http.Request) { + log.Debugf("/get_shows called\n") + db, err := open_database(data_dir) + if err != nil { + log.Errorf("Could not open database: %v\n", err) + return + } + + rows, err := db.Query("SELECT title, original_title, show_title, year FROM tvshows") + if err != nil { + log.Errorf("Could not check if database was new: %v", err) + } + defer rows.Close() + + var return_json GetShows + + for { + if !rows.Next() { + err = rows.Err() + if err != nil { + log.Fatalf("Could not get row from database: %v\n", err) + return + } else { + log.Debugf("%v rows processed\n", len(return_json.Shows)) + break + } + } + var show TVShow + rows.Scan(&show.Title, &show.OriginalTile, &show.ShowTitle, &show.Year) + + return_json.Shows = append(return_json.Shows, show) + } + data, err := json.Marshal(return_json) + if err != nil { + log.Errorf("Could not marshal episode data: %v\n", err) + return + } + w.Write(data) +} + +type GetEpisodes struct { + Episodes []Episode +} + +func get_episodes_handler(data_dir string, w http.ResponseWriter, r *http.Request) { + log.Debugf("/get_episodes called\n") + db, err := open_database(data_dir) + if err != nil { + log.Errorf("Could not open database: %v\n", err) + return + } + + rows, err := db.Query("SELECT title, show_title, number, season, original_filename FROM episodes") + if err != nil { + log.Errorf("Could not check if database was new: %v", err) + } + defer rows.Close() + + var return_json GetEpisodes + + for { + if !rows.Next() { + err = rows.Err() + if err != nil { + log.Fatalf("Could not get row from database: %v\n", err) + return + } else { + log.Debugf("%v rows processed\n", len(return_json.Episodes)) + break + } + } + var episode Episode + rows.Scan(&episode.Title, &episode.ShowTitle, &episode.Episode, &episode.Season, &episode.OriginalFilename) + + return_json.Episodes = append(return_json.Episodes, episode) + } + data, err := json.Marshal(return_json) + if err != nil { + log.Errorf("Could not marshal episode data: %v\n", err) + return + } + w.Write(data) +} + var log = logging.MustGetLogger("ikinuki-server") func main() { @@ -382,4 +470,15 @@ func main() { log.Fatalf("Could not scan directory \"%v\": %v\n", config.ScanDirectory, err) } + http.HandleFunc("/get_episodes", func(w http.ResponseWriter, r *http.Request) { + get_episodes_handler(data_dir, w, r) + }) + http.HandleFunc("/get_shows", func(w http.ResponseWriter, r *http.Request) { + get_shows_handler(data_dir, w, r) + }) + + + connect_string := fmt.Sprintf("%v:%v", config.Address, config.Port) + log.Noticef("Launching HTTP server on %v\n", connect_string) + log.Fatal(http.ListenAndServe(connect_string, nil)) }