Merge pull request #1534 from InterN0te/master-showActiveTorrent

Add an option to show active torrents when completed torrents are hidden in Torrent Queue widget
This commit is contained in:
Tagaishi
2023-11-06 04:11:34 +01:00
committed by GitHub
3 changed files with 85 additions and 19 deletions

View File

@@ -10,6 +10,12 @@
"displayCompletedTorrents": { "displayCompletedTorrents": {
"label": "Display completed torrents" "label": "Display completed torrents"
}, },
"displayActiveTorrents": {
"label": "Display active torrents"
},
"speedLimitOfActiveTorrents": {
"label": "Upload speed to consider a torrent as active (kB/s)"
},
"displayStaleTorrents": { "displayStaleTorrents": {
"label": "Display stale torrents" "label": "Display stale torrents"
}, },

View File

@@ -20,13 +20,15 @@ describe('TorrentTile', () => {
labelFilter: [], labelFilter: [],
labelFilterIsWhitelist: false, labelFilterIsWhitelist: false,
displayCompletedTorrents: true, displayCompletedTorrents: true,
displayActiveTorrents: true,
speedLimitOfActiveTorrents: 10,
displayStaleTorrents: false, displayStaleTorrents: false,
}, },
}; };
const torrents: NormalizedTorrent[] = [ const torrents: NormalizedTorrent[] = [
constructTorrent('ABC', 'Nice Torrent', false, 672), constructTorrent('ABC', 'Nice Torrent', false, 672, 672),
constructTorrent('HH', 'I am completed', true, 0), constructTorrent('HH', 'I am completed', true, 0, 0),
constructTorrent('HH', 'I am stale', false, 0), constructTorrent('HH', 'I am stale', false, 0, 0),
]; ];
// act // act
@@ -55,13 +57,15 @@ describe('TorrentTile', () => {
labelFilter: [], labelFilter: [],
labelFilterIsWhitelist: false, labelFilterIsWhitelist: false,
displayCompletedTorrents: true, displayCompletedTorrents: true,
displayActiveTorrents: true,
speedLimitOfActiveTorrents: 10,
displayStaleTorrents: true, displayStaleTorrents: true,
}, },
}; };
const torrents: NormalizedTorrent[] = [ const torrents: NormalizedTorrent[] = [
constructTorrent('ABC', 'Nice Torrent', false, 672), constructTorrent('ABC', 'Nice Torrent', false, 672, 672),
constructTorrent('HH', 'I am completed', true, 0), constructTorrent('HH', 'I am completed', true, 0, 0),
constructTorrent('HH', 'I am stale', false, 0), constructTorrent('HH', 'I am stale', false, 0, 0),
]; ];
// act // act
@@ -74,7 +78,7 @@ describe('TorrentTile', () => {
expect(filtered.includes(torrents[2])).toBe(true); expect(filtered.includes(torrents[2])).toBe(true);
}); });
it('filter when completed', () => { it('filter when completed without active torrent', () => {
// arrange // arrange
const widget: ITorrent = { const widget: ITorrent = {
id: 'abc', id: 'abc',
@@ -90,13 +94,15 @@ describe('TorrentTile', () => {
labelFilter: [], labelFilter: [],
labelFilterIsWhitelist: false, labelFilterIsWhitelist: false,
displayCompletedTorrents: false, displayCompletedTorrents: false,
displayActiveTorrents: false,
speedLimitOfActiveTorrents: 10,
displayStaleTorrents: true, displayStaleTorrents: true,
}, },
}; };
const torrents: NormalizedTorrent[] = [ const torrents: NormalizedTorrent[] = [
constructTorrent('ABC', 'Nice Torrent', false, 672), constructTorrent('ABC', 'Nice Torrent', false, 672, 672),
constructTorrent('HH', 'I am completed', true, 0), constructTorrent('HH', 'I am completed', true, 0, 672),
constructTorrent('HH', 'I am stale', false, 0), constructTorrent('HH', 'I am stale', false, 0, 0),
]; ];
// act // act
@@ -109,6 +115,47 @@ describe('TorrentTile', () => {
expect(filtered.at(1)).toBe(torrents[2]); expect(filtered.at(1)).toBe(torrents[2]);
}); });
it('filter when completed with active torrent', () => {
// arrange
const widget: ITorrent = {
id: 'abc',
area: {
type: 'sidebar',
properties: {
location: 'left',
},
},
shape: {},
type: 'torrents-status',
properties: {
labelFilter: [],
labelFilterIsWhitelist: false,
displayCompletedTorrents: false,
displayActiveTorrents: true,
speedLimitOfActiveTorrents: 10,
displayStaleTorrents: true,
},
};
const torrents: NormalizedTorrent[] = [
constructTorrent('ABC', 'Nice Torrent', false, 672, 672),
constructTorrent('HH', 'I am completed and uploading less than 10 ko/s (10239 ≈ 9.99ko/s)', true, 0, 10239),
constructTorrent('HH', 'I am completed and uploading more than 10 ko/s (10241 ≈ 10.01ko/s)', true, 0, 10241),
constructTorrent('HH', 'I am completed', true, 0, 0),
constructTorrent('HH', 'I am stale', false, 0, 0),
];
// act
const filtered = filterTorrents(widget, torrents);
// assert
expect(filtered.length).toBe(3);
expect(filtered.at(0)).toBe(torrents[0]);
expect(filtered.includes(torrents[1])).toBe(false);
expect(filtered.at(1)).toBe(torrents[2]);
expect(filtered.includes(torrents[3])).toBe(false);
expect(filtered.at(2)).toBe(torrents[4]);
});
it('filter by label when whitelist', () => { it('filter by label when whitelist', () => {
// arrange // arrange
const widget: ITorrent = { const widget: ITorrent = {
@@ -125,13 +172,15 @@ describe('TorrentTile', () => {
labelFilter: ['music', 'movie'], labelFilter: ['music', 'movie'],
labelFilterIsWhitelist: true, labelFilterIsWhitelist: true,
displayCompletedTorrents: true, displayCompletedTorrents: true,
displayActiveTorrents: true,
speedLimitOfActiveTorrents: 10,
displayStaleTorrents: true, displayStaleTorrents: true,
}, },
}; };
const torrents: NormalizedTorrent[] = [ const torrents: NormalizedTorrent[] = [
constructTorrent('1', 'A sick drop', false, 672, 'music'), constructTorrent('1', 'A sick drop', false, 672, 672, 'music'),
constructTorrent('2', 'I cried', true, 0, 'movie'), constructTorrent('2', 'I cried', true, 0, 0, 'movie'),
constructTorrent('3', 'Great Animations', false, 0, 'anime'), constructTorrent('3', 'Great Animations', false, 0, 0, 'anime'),
]; ];
// act // act
@@ -160,13 +209,15 @@ describe('TorrentTile', () => {
labelFilter: ['music', 'movie'], labelFilter: ['music', 'movie'],
labelFilterIsWhitelist: false, labelFilterIsWhitelist: false,
displayCompletedTorrents: false, displayCompletedTorrents: false,
displayActiveTorrents: false,
speedLimitOfActiveTorrents: 10,
displayStaleTorrents: true, displayStaleTorrents: true,
}, },
}; };
const torrents: NormalizedTorrent[] = [ const torrents: NormalizedTorrent[] = [
constructTorrent('ABC', 'Nice Torrent', false, 672, 'anime'), constructTorrent('ABC', 'Nice Torrent', false, 672, 672, 'anime'),
constructTorrent('HH', 'I am completed', true, 0, 'movie'), constructTorrent('HH', 'I am completed', true, 0, 0, 'movie'),
constructTorrent('HH', 'I am stale', false, 0, 'tv'), constructTorrent('HH', 'I am stale', false, 0, 0, 'tv'),
]; ];
// act // act
@@ -184,7 +235,8 @@ const constructTorrent = (
id: string, id: string,
name: string, name: string,
isCompleted: boolean, isCompleted: boolean,
downloadSpeed: number, downloadSpeed: number, // Bytes per second in @ctrl/shared-torrent
uploadSpeed: number, // Bytes per second in @ctrl/shared-torrent
label?: string label?: string
): NormalizedTorrent => ({ ): NormalizedTorrent => ({
id, id,
@@ -208,6 +260,6 @@ const constructTorrent = (
totalSize: 839539535, totalSize: 839539535,
totalSelected: 0, totalSelected: 0,
totalUploaded: 378535535, totalUploaded: 378535535,
uploadSpeed: 8349, uploadSpeed,
label, label,
}); });

View File

@@ -40,6 +40,14 @@ const definition = defineWidget({
type: 'switch', type: 'switch',
defaultValue: true, defaultValue: true,
}, },
displayActiveTorrents: {
type: 'switch',
defaultValue: true,
},
speedLimitOfActiveTorrents: { // Unit : kB/s
type: 'number',
defaultValue: 10,
},
displayStaleTorrents: { displayStaleTorrents: {
type: 'switch', type: 'switch',
defaultValue: true, defaultValue: true,
@@ -194,7 +202,7 @@ function TorrentTile({ widget }: TorrentTileProps) {
export const filterTorrents = (widget: ITorrent, torrents: NormalizedTorrent[]) => { export const filterTorrents = (widget: ITorrent, torrents: NormalizedTorrent[]) => {
let result = torrents; let result = torrents;
if (!widget.properties.displayCompletedTorrents) { if (!widget.properties.displayCompletedTorrents) {
result = result.filter((torrent) => !torrent.isCompleted); result = result.filter((torrent) => !torrent.isCompleted || (widget.properties.displayActiveTorrents && torrent.uploadSpeed > widget.properties.speedLimitOfActiveTorrents * 1024));
} }
if (widget.properties.labelFilter.length > 0) { if (widget.properties.labelFilter.length > 0) {