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 ( + <> +
Statistics
+ + {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