diff --git a/app/src/components/Channels.js b/app/src/components/Channels.js
index ab982aea..4c600da1 100644
--- a/app/src/components/Channels.js
+++ b/app/src/components/Channels.js
@@ -1,5 +1,17 @@
import React from "react";
-import {Accordion, Button, Checkbox, Form, Grid, Header, Input, Loader, Responsive, Segment} from "semantic-ui-react";
+import {
+ Accordion,
+ Button,
+ Checkbox,
+ Form,
+ Grid,
+ Header,
+ Input,
+ Loader,
+ Responsive,
+ Segment,
+ Statistic
+} from "semantic-ui-react";
import {
createChannel,
deleteChannel,
@@ -14,7 +26,7 @@ import {
} from "../api";
import _ from "lodash";
import Container from "semantic-ui-react/dist/commonjs/elements/Container";
-import {APIForm, frequencyOptions, RequiredAsterisk, secondsToDate, secondsToFrequency} from "./Common";
+import {APIForm, frequencyOptions, humanFileSize, RequiredAsterisk, secondsToDate, secondsToFrequency} from "./Common";
import {Link} from "react-router-dom";
import Message from "semantic-ui-react/dist/commonjs/collections/Message";
import Confirm from "semantic-ui-react/dist/commonjs/addons/Confirm";
@@ -81,6 +93,31 @@ class DirectoryInput extends React.Component {
}
}
+function ChannelStatistics(props) {
+ if (!props.statistics) {
+ return <>>
+ }
+ let stats = props.statistics;
+
+ return (
+ <>
+
+
+ {stats.video_count}
+ Videos
+
+
+ {humanFileSize(stats.size, true)}
+ Total Size
+
+
+ {humanFileSize(stats.largest_video, true)}
+ Largest Video
+
+ >
+ )
+}
+
class ChannelPage extends APIForm {
@@ -103,6 +140,7 @@ class ChannelPage extends APIForm {
calculate_duration: true,
download_frequency: null,
},
+ statistics: null,
errors: {},
};
@@ -113,6 +151,10 @@ class ChannelPage extends APIForm {
if (!this.props.create) {
let channel_link = this.props.match.params.channel_link;
let channel = await getChannel(channel_link);
+ let statistics = channel.statistics;
+ if (statistics) {
+ this.setState({statistics: statistics || null});
+ }
this.initFormValues(channel);
}
}
@@ -395,6 +437,7 @@ class ChannelPage extends APIForm {
}
+ {}
)
}
diff --git a/modules/videos/channel/lib.py b/modules/videos/channel/lib.py
index d34d47d8..a88eabcd 100644
--- a/modules/videos/channel/lib.py
+++ b/modules/videos/channel/lib.py
@@ -88,7 +88,11 @@ def get_channel(source_id: str = None, link: str = None, url: str = None, return
raise UnknownChannel(f'No channel matches {link=} {source_id=} {url=}')
logger.debug(f'Found {channel=} using {source_id=} {link=} {url=}')
- return channel.dict() if return_dict else channel
+ if return_dict:
+ statistics = channel.get_statistics()
+ channel = channel.dict()
+ channel['statistics'] = statistics
+ return channel
def _spread_by_frequency(channels: List[Channel]):
diff --git a/modules/videos/models.py b/modules/videos/models.py
index c7aa50cb..e420fea6 100644
--- a/modules/videos/models.py
+++ b/modules/videos/models.py
@@ -338,3 +338,18 @@ class Channel(ModelHelper, Base):
link=self.link,
)
return d
+
+ def get_statistics(self):
+ """
+ Get statistics about this channel.
+ """
+ with get_db_curs() as curs:
+ stmt = 'SELECT SUM(size), MAX(size) FROM video WHERE channel_id = %s'
+ curs.execute(stmt, (self.id,))
+ size, largest_video = curs.fetchone()
+ statistics = dict(
+ video_count=len(self.videos),
+ size=size,
+ largest_video=largest_video,
+ )
+ return statistics