aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--controller/controller.go5
-rw-r--r--routes/routes.go1
-rw-r--r--templates/_footer.tmpl14
-rw-r--r--templates/_head.tmpl1
-rw-r--r--templates/index.tmpl4
-rw-r--r--worker/worker.go43
6 files changed, 59 insertions, 9 deletions
diff --git a/controller/controller.go b/controller/controller.go
index 3e029f0..7cbee6a 100644
--- a/controller/controller.go
+++ b/controller/controller.go
@@ -49,3 +49,8 @@ func (e *Env) DeleteEntry(c *gin.Context) {
e.Entries.Delete(id)
c.HTML(http.StatusOK, "entry", entry)
}
+
+func (e *Env) GetJobs(c *gin.Context) {
+ jobs := e.Worker.GetJobs()
+ c.JSON(http.StatusOK, jobs)
+}
diff --git a/routes/routes.go b/routes/routes.go
index a609019..79264c5 100644
--- a/routes/routes.go
+++ b/routes/routes.go
@@ -29,5 +29,6 @@ func HandleRequests() {
r.GET("entries/:id", env.GetEntry)
r.POST("entries/:id", env.UpdateEntry)
r.DELETE("entries/:id", env.DeleteEntry)
+ r.GET("jobs/", env.GetJobs)
r.Run(":8000")
}
diff --git a/templates/_footer.tmpl b/templates/_footer.tmpl
index 07bc857..97a5bf8 100644
--- a/templates/_footer.tmpl
+++ b/templates/_footer.tmpl
@@ -8,6 +8,20 @@
window.location.href = '/'
});
}
+
+ function getStatus() {
+ fetch("/jobs/", { method: 'GET'})
+ .then((res) => { return objs = res.json(); })
+ .then((objs) => {
+ for (i in objs) {
+ span = document.getElementById("status_"+objs[i].Id);
+ span.textContent = objs[i].Status;
+ }
+ });
+ }
+
+setInterval(getStatus, 1000);
+
</script>
</body>
</html>
diff --git a/templates/_head.tmpl b/templates/_head.tmpl
index 2bb58c4..b99510f 100644
--- a/templates/_head.tmpl
+++ b/templates/_head.tmpl
@@ -2,6 +2,7 @@
<!DOCTYPE html>
<html>
<head>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/assets/bulma.min.css">
</head>
<body>
diff --git a/templates/index.tmpl b/templates/index.tmpl
index 9bb7512..ae7f674 100644
--- a/templates/index.tmpl
+++ b/templates/index.tmpl
@@ -8,6 +8,7 @@
<th scope="col">Title</th>
<th scope="col">Link</th>
<th scope="col">Output</th>
+ <th scope="col">Status</th>
<th scope="col"></th>
</tr>
</thead>
@@ -19,6 +20,9 @@
<td>{{ .Link }}</td>
<td>{{ .OutputFolder }}</td>
<td>
+ <span id="status_{{ .ID }}" class="tag is-primary is-light"></span>
+ </td>
+ <td>
<a href="entries/{{ .ID }}" >Edit</a>
</span>
<a onclick="deleteEntry({{ .ID }})">Delete</a>
diff --git a/worker/worker.go b/worker/worker.go
index 5e0c844..f56716f 100644
--- a/worker/worker.go
+++ b/worker/worker.go
@@ -10,11 +10,13 @@ import (
)
const (
- statusStoped = "STOPPED"
- statusStarted = "STARTED"
+ statusNotQueued = "NOTQUEUED"
+ statusQueued = "QUEUED"
+ statusStarted = "RUNNING"
- commandStart = "START"
- commandStop = "STOP"
+ commandStart = "START"
+ commandEnqueue = "ENQUEUE"
+ commandDequeue = "DEQUEUE"
)
type command struct {
@@ -27,18 +29,29 @@ type Worker struct {
c chan command
}
+type Job struct {
+ Id uint
+ Status string
+}
+
+func (w *Worker) CanEnqueue(index uint) bool {
+ v, found := w.jobs[index]
+ return !found || v == statusNotQueued
+}
+
func (w *Worker) SpawnWorker(index uint, link string, output string) {
- if v, found := w.jobs[index]; found && v == statusStarted {
+ if !w.CanEnqueue(index) {
return
}
- w.c <- command{action: commandStart, index: index}
+ w.c <- command{action: commandEnqueue, index: index}
task := work.NewTask(func(ctx context.Context) error {
+ w.c <- command{action: commandStart, index: index}
yt.RunYtDlpProcess(link, output)
return nil
}).After(func(ctx context.Context, task *work.Task) {
- w.c <- command{action: commandStop, index: index}
+ w.c <- command{action: commandDequeue, index: index}
})
work.Enqueue(task)
@@ -48,10 +61,12 @@ func (w *Worker) startReader() {
for true {
command := <-w.c
- if command.action == commandStop {
- w.jobs[command.index] = statusStoped
+ if command.action == commandEnqueue {
+ w.jobs[command.index] = statusQueued
} else if command.action == commandStart {
w.jobs[command.index] = statusStarted
+ } else if command.action == commandDequeue {
+ w.jobs[command.index] = statusNotQueued
} else {
panic(1)
}
@@ -74,3 +89,13 @@ func (w *Worker) StartWorker(model db.EntryModel) {
go w.startReader()
go w.startScheduler(model)
}
+
+func (w *Worker) GetJobs() []Job {
+ jobs := []Job{}
+
+ for k, v := range w.jobs {
+ jobs = append(jobs, Job{Id: k, Status: v})
+ }
+
+ return jobs
+}