This commit is contained in:
Yami Odymel 2024-05-05 22:38:25 +08:00
parent 2c5d2a984c
commit 153cf4f800
No known key found for this signature in database
GPG Key ID: 68E469836934DB36
9 changed files with 38 additions and 12 deletions

View File

@ -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}}")

View File

@ -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
}
}

View File

@ -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, "", " ")

View File

@ -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

View File

@ -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"),

View File

@ -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,

View File

@ -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 -->

View File

@ -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)
},
}
}
}

View File

@ -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
}