mirror of
https://github.com/teacat/chaturbate-dvr.git
synced 2025-10-29 16:59:59 +00:00
Fixed #55
This commit is contained in:
parent
2c5d2a984c
commit
153cf4f800
@ -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}}")
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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, "", " ")
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"),
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -122,6 +122,10 @@
|
||||
</div>
|
||||
<!-- / Field: Filename Pattern -->
|
||||
|
||||
<!-- Field: Check Interval -->
|
||||
<input type="hidden" x-model="form_data.interval" />
|
||||
<!-- / Field: Check Interval -->
|
||||
|
||||
<div class="ts-divider has-vertically-spaced-large"></div>
|
||||
|
||||
<!-- Field: Splitting Options -->
|
||||
|
||||
@ -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)
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
9
main.go
9
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
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user