Skip to content

Commit

Permalink
Clear Song Long V1 (#46)
Browse files Browse the repository at this point in the history
* test

* add clear song/vacuum admin function

* tidy

* Update stream stats page
  • Loading branch information
dmamills authored Nov 8, 2021
1 parent f4f04bb commit 05c327a
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 31 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# opensourceradio ![travis-ci](https://api.travis-ci.org/dmamills/opensourceradio.svg?branch=master)
# opensourceradio ![travis-ci](https://api.travis-ci.org/dmamills/opensourceradio.svg?branch=master)

a proof of concept for self hosting streaming radio.

Expand Down
27 changes: 20 additions & 7 deletions client/src/admin/Stream/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,44 +2,57 @@ import React, { useState, useEffect } from 'react';

import StreamControls from './StreamControls';
import StreamStat from './StreamStat';
import { getStreamStats } from '../api';
import { getStreamStats, removeSongLogs } from '../api';
import { formatDate, makeDefaultStreamStats } from '../../utils';
import { p1 } from '../../styles';

const StreamPage = () => {
const [streamStats, setStreamStats] = useState({ ...makeDefaultStreamStats() });
const [songLogTotal, setSongLogTotal] = useState(0);
const [loading, setLoading] = useState(true);

useEffect(() => {
const statInterval = setInterval(() => {
setLoading(true);
loadStats();
}, 5000)
}, 30*1000)
loadStats();

return () => {
clearInterval(statInterval);
}
}, [false]);

const loadStats = () => {
getStreamStats().then(stats => {
setStreamStats(stats);
const loadStats = async () => {
try {
const { currentLog, total } = await getStreamStats();
setStreamStats(currentLog);
setSongLogTotal(total)
setLoading(false);
});
} catch(err) {
setStreamStats({...makeDefaultStreamStats()})
setLoading(false)
}
}

if(!streamStats) return null;
const startTime = formatDate(streamStats.schedule_start_time);
const stopTime = formatDate(streamStats.schedule_stop_time);
const playlist = streamStats.schedule_playlist.split(',');

const clearSongLogs = async () => {
await removeSongLogs()
}

return (
<div className={p1}>
<h1>Stream</h1>
<StreamControls />

<h2>Utility</h2>
<button onClick={clearSongLogs}>Clear Song Logs</button>
<h2>Stream State:</h2>
{ !loading && <div>
<StreamStat label="Song Log Count" value={songLogTotal} />
<StreamStat label="Schedule Id" value={streamStats.schedule_id} />
<StreamStat label="Current Song" value={streamStats.file_name} />
<StreamStat label="Start Time" value={startTime} />
Expand Down
14 changes: 10 additions & 4 deletions client/src/admin/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ export const fetchKey = () => {

export const storeKey = key => {
if(!key) return localStorage.removeItem(OSR_KEY);

return localStorage.setItem(OSR_KEY, key);
};

Expand All @@ -20,7 +19,11 @@ const get = url => {
return fetch(`${SERVER_URL}${url}`, {
headers
})
.then(res => res.json());
.then(response => {
if(response.status >= 400) return Promise.reject(response.json())
return response
})
.then(res => res.json())
};

const post = (url, data) => {
Expand All @@ -40,7 +43,6 @@ const del = url => {
method: 'DELETE'
})
.then(res => res.json());

};

export const authTest = key => {
Expand Down Expand Up @@ -128,9 +130,13 @@ export const postStopStream = () => {
};

export const getStreamStats = () => {
return get('/stream/log').then(res => res.currentLog);
return get('/stream/log').then(res => ({ currentLog: res.currentLog, total: res.total}));
};

export const removeSongLogs = () => {
return post('/stream/removeSongLog', {}).then(res => res.ok)
}

export const getNews = () => {
return get('/news').then(res => res.news);
}
Expand Down
3 changes: 2 additions & 1 deletion server/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion server/repo/MessageRepository.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ class MessageRepository {
return knex.select('name', 'message', knex.raw('created_at as timestamp'), 'active_song')
.from(tableName)
.orderBy('created_at', 'DESC')
.limit(50);
.limit(50)
.then(h => h.reverse());
}

static create(message, songName = '') {
Expand Down
18 changes: 16 additions & 2 deletions server/repo/SongLogRepository.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
const knex = require('knex')(require('../knexfile').development);
const tableName = 'song_log';

const { ROOT_AUDIO_PATH, getFiles, filesToFolders, sanitizeFilename } = require('../util');

const { ROOT_AUDIO_PATH } = require('../util');

class SongLogRepository {
static latest() {
Expand All @@ -12,6 +11,21 @@ class SongLogRepository {
.limit(1);
}

static count() {
return knex.count('id')
.from(tableName)
.first()
.then(res => res['count(`id`)'])
}

static removeAll() {
return knex(tableName).truncate();
}

static vaccum() {
return knex.schema.raw("VACUUM");
}

static latestSong() {
return knex.select('file_name')
.from(tableName)
Expand Down
11 changes: 5 additions & 6 deletions server/routes/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,15 @@ router.use('/schedules', schedulesRouter);
router.use('/stream', streamRouter);
router.use('/news', newsRouter);

router.get('/history', (req, res) => {
MessageRepository.latest()
.then((history) => {
history = history.reverse();
router.get('/history', async (req, res) => {
try {
const history = await MessageRepository.latest()
res.json({
history
});
}).catch(error => {
} catch(err) {
res.json({ history: [] });
});
}
});

module.exports = router;
41 changes: 32 additions & 9 deletions server/routes/stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ require('dotenv').config();
const express = require('express');
const router = express.Router();
const pm2 = require('pm2');
const { SongLogRepository } = require('../repo');

const { errorHandler, authMiddleware } = require('./middleware');
const { SongLogRepository } = require('../repo');
const { authMiddleware } = require('./middleware');

const processInfo = {
name: process.env.STREAM_NAME,
Expand Down Expand Up @@ -39,13 +39,36 @@ router.get('/status', authMiddleware, (req, res) => {
pm2.describe(processInfo.name, onStatus(res));
});

router.get('/log', authMiddleware, (req, res) => {
SongLogRepository.latest()
.then(logs => {
const currentLog = logs[0];
delete currentLog.ffmpeg_command;
res.json({ currentLog });
});
router.post('/removeSongLog', authMiddleware, async (req, res) => {
try {
await SongLogRepository.removeAll();
await SongLogRepository.vaccum();
return res.json({ ok: true });
} catch {
return res.json({ ok: false });
}
})

router.get('/log', authMiddleware, async (req, res) => {

try {
const logs = await SongLogRepository.latest()
const total = await SongLogRepository.count()

const currentLog = logs[0];
delete currentLog.ffmpeg_command;

res.json({
currentLog,
total
})
} catch(err) {
console.log('CAUGHT ERROR IN LOG', err.message)
return res.status(400).json({
currentLog: null,
total: 0
})
}
});

module.exports = router;

0 comments on commit 05c327a

Please sign in to comment.