diff --git a/README.md b/README.md index 5ae7e10..9566f1e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ For Chaturbate-**only**, private/ticket stream is **unsupported**. ## Usage -Download **`source code (zip)`** from **[Release](https://github.com/teacat/chaturbate-dvr/releases)** page. Unzip **`/bin`** folder and look up for executable that **fits your system**. +Download executable from **[Release](https://github.com/teacat/chaturbate-dvr/releases)** page.   @@ -98,6 +98,7 @@ GLOBAL OPTIONS: --gui-username value, --gui-u value username for auth web (optional) --gui-password value, --gui-p value password for auth web (optional) --framerate value, -f value preferred framerate (default: 30) + --interval value, -i value minutes to check if the channel is online (default: 1) --resolution value, -r value preferred resolution (default: 1080) --resolution-fallback value, --rf value fallback to 'up' (larger) or 'down' (smaller) resolution if preferred resolution is not available (default: "down") --filename-pattern value, --fp value filename pattern for videos (default: "videos/{{.Username}}_{{.Year}}-{{.Month}}-{{.Day}}_{{.Hour}}-{{.Minute}}-{{.Second}}{{if .Sequence}}_{{.Sequence}}{{end}}") diff --git a/chaturbate/channel.go b/chaturbate/channel.go index d393e3a..7ce4ea3 100644 --- a/chaturbate/channel.go +++ b/chaturbate/channel.go @@ -26,6 +26,7 @@ type Channel struct { ChannelURL string filenamePattern string LastStreamedAt string + Interval int Framerate int Resolution int ResolutionFallback string @@ -98,8 +99,8 @@ func (w *Channel) Run() { } } - w.log(logTypeInfo, "channel is offline, check again 1 min later") - <-time.After(1 * time.Minute) // 1 minute cooldown to check online status + w.log(logTypeInfo, "channel is offline, check again %d min(s) later", w.Interval) + <-time.After(time.Duration(w.Interval) * time.Minute) // minutes cooldown to check online status } } diff --git a/chaturbate/manager.go b/chaturbate/manager.go index 446e85e..6c36f10 100644 --- a/chaturbate/manager.go +++ b/chaturbate/manager.go @@ -31,6 +31,7 @@ type Config struct { ResolutionFallback string SplitDuration int SplitFilesize int + Interval int } // Manager @@ -99,6 +100,7 @@ func (m *Manager) CreateChannel(conf *Config) error { Framerate: conf.Framerate, Resolution: conf.Resolution, ResolutionFallback: conf.ResolutionFallback, + Interval: conf.Interval, LastStreamedAt: "-", SegmentDuration: 0, SplitDuration: conf.SplitDuration, @@ -176,6 +178,7 @@ func (m *Manager) SaveChannels() error { FilenamePattern: v.filenamePattern, SplitDuration: v.SplitDuration, SplitFilesize: v.SplitFilesize, + Interval: v.Interval, }) } b, err := json.MarshalIndent(configs, "", " ") diff --git a/handler/create_channel.go b/handler/create_channel.go index 634e668..7ef7f04 100644 --- a/handler/create_channel.go +++ b/handler/create_channel.go @@ -21,6 +21,7 @@ type CreateChannelRequest struct { ResolutionFallback string `json:"resolution_fallback"` SplitDuration int `json:"split_duration"` SplitFilesize int `json:"split_filesize"` + Interval int `json:"interval"` } type CreateChannelResponse struct { @@ -59,6 +60,7 @@ func (h *CreateChannelHandler) Handle(c *gin.Context) { FilenamePattern: req.FilenamePattern, SplitDuration: req.SplitDuration, SplitFilesize: req.SplitFilesize, + Interval: req.Interval, }); err != nil { c.AbortWithError(http.StatusInternalServerError, err) return diff --git a/handler/get_settings.go b/handler/get_settings.go index 157f157..2942838 100644 --- a/handler/get_settings.go +++ b/handler/get_settings.go @@ -22,6 +22,7 @@ type GetSettingsHandlerResponse struct { FilenamePattern string `json:"filename_pattern"` SplitDuration int `json:"split_duration"` SplitFilesize int `json:"split_filesize"` + Interval int `json:"interval"` LogLevel string `json:"log_level"` Port string `json:"port"` GUI string `json:"gui"` @@ -57,6 +58,7 @@ func (h *GetSettingsHandler) Handle(c *gin.Context) { FilenamePattern: h.cli.String("filename-pattern"), SplitDuration: h.cli.Int("split-duration"), SplitFilesize: h.cli.Int("split-filesize"), + Interval: h.cli.Int("interval"), LogLevel: h.cli.String("log-level"), Port: h.cli.String("port"), GUI: h.cli.String("gui"), diff --git a/handler/list_channels.go b/handler/list_channels.go index cfb2daf..87be69f 100644 --- a/handler/list_channels.go +++ b/handler/list_channels.go @@ -28,6 +28,7 @@ type ListChannelsResponseChannel struct { SplitDuration string `json:"split_duration"` SegmentFilesize string `json:"segment_filesize"` SplitFilesize string `json:"split_filesize"` + Interval int `json:"interval"` IsOnline bool `json:"is_online"` IsPaused bool `json:"is_paused"` Logs []string `json:"logs"` @@ -74,6 +75,7 @@ func (h *ListChannelsHandler) Handle(c *gin.Context) { SplitDuration: channel.SplitDurationStr(), SegmentFilesize: channel.SegmentFilesizeStr(), SplitFilesize: channel.SplitFilesizeStr(), + Interval: channel.Interval, IsOnline: channel.IsOnline, IsPaused: channel.IsPaused, Logs: channel.Logs, diff --git a/handler/view/index.html b/handler/view/index.html index 23e4b08..6e7cc4c 100644 --- a/handler/view/index.html +++ b/handler/view/index.html @@ -122,6 +122,10 @@ + + + +
diff --git a/handler/view/script.js b/handler/view/script.js index 2068a45..ba59a7f 100644 --- a/handler/view/script.js +++ b/handler/view/script.js @@ -11,6 +11,7 @@ function data() { filename_pattern: "{{.Username}}_{{.Year}}-{{.Month}}-{{.Day}}_{{.Hour}}-{{.Minute}}-{{.Second}}{{if .Sequence}}_{{.Sequence}}{{end}}", split_filesize: 0, split_duration: 0, + interval: 1, }, // openCreateDialog @@ -46,7 +47,7 @@ function data() { this.error() return [null, true] } - return [(await resp.json()), false] + return [await resp.json(), false] } catch { this.error() return [null, true] @@ -83,6 +84,7 @@ function data() { filename_pattern: this.settings.filename_pattern, split_filesize: this.settings.split_filesize.toString(), split_duration: this.settings.split_duration.toString(), + interval: this.settings.interval.toString(), } }, @@ -96,6 +98,7 @@ function data() { filename_pattern: this.form_data.filename_pattern, split_filesize: parseInt(this.form_data.split_filesize), split_duration: parseInt(this.form_data.split_duration), + interval: parseInt(this.form_data.interval), }) }, @@ -121,7 +124,6 @@ function data() { alert("The program is terminated, any error messages are safe to ignore.") await this.call("terminate_program", {}) } - }, // resumeChannel @@ -184,12 +186,14 @@ function data() { }, downloadLogs(username) { - var a = window.document.createElement('a'); - a.href = window.URL.createObjectURL(new Blob([this.channels[this.channels.findIndex(ch => ch.username === username)].logs.join('\n')], { type: 'text/plain', oneTimeOnly: true })); + var a = window.document.createElement("a") + a.href = window.URL.createObjectURL( + new Blob([this.channels[this.channels.findIndex(ch => ch.username === username)].logs.join("\n")], { type: "text/plain", oneTimeOnly: true }) + ) a.download = `${username}_logs.txt` - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); + document.body.appendChild(a) + a.click() + document.body.removeChild(a) }, // @@ -205,4 +209,4 @@ function data() { }, 1) }, } -} \ No newline at end of file +} diff --git a/main.go b/main.go index c245d21..7a67ec6 100644 --- a/main.go +++ b/main.go @@ -31,7 +31,7 @@ const logo = ` func main() { app := &cli.App{ Name: "chaturbate-dvr", - Version: "1.0.4", + Version: "1.0.5", Usage: "Records your favorite Chaturbate stream 😎🫵", Flags: []cli.Flag{ &cli.StringFlag{ @@ -98,6 +98,12 @@ func main() { Usage: "port to expose the web interface and API", Value: "8080", }, + &cli.IntFlag{ + Name: "interval", + Aliases: []string{"i"}, + Usage: "minutes to check if the channel is online", + Value: 1, + }, //&cli.StringFlag{ // Name: "gui", // Usage: "enabling GUI, availables: 'no', 'web'", @@ -128,6 +134,7 @@ func start(c *cli.Context) error { FilenamePattern: c.String("filename-pattern"), SplitDuration: c.Int("split-duration"), SplitFilesize: c.Int("split-filesize"), + Interval: c.Int("interval"), }); err != nil { return err }