release / govulncheck (push) Successful in 18s
release / web (push) Successful in 1m26s
release / go (push) Successful in 1m45s
release / integration (push) Successful in 5m6s
release / android (push) Successful in 5m58s
release / Build signed APK (releases and dev) (push) Successful in 6m17s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 26s
release / Verify release artifacts (tag releases only) (push) Skipped
The operator chose option 2: an album holding a video rip that is the only copy of its song is searched in Lidarr (AlbumSearch), at most once a week and ten albums a pass. Lidarr grabs only when the quality profile allows an upgrade, so nothing is removed and the rip stays held back either way. - lidarr.Client.SearchAlbums posts the AlbumSearch command. - ListAlbumsWithSoleCopyRips finds the albums: a held-back rip with no present clean copy sharing its song or its pending group, and not searched in the last week (audit action lidarr_rip_search). - Suspect sources shows when Lidarr last searched the track's album. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import { describe, expect, test } from 'vitest';
|
|
import { suspectSourcesNextOffset } from './admin';
|
|
import type { AdminSuspectResponse, AdminSuspectTrack } from './types';
|
|
|
|
function track(id: string): AdminSuspectTrack {
|
|
return {
|
|
track_id: id,
|
|
title: id,
|
|
artist_id: 'ar',
|
|
artist_name: 'Artist',
|
|
album_id: 'al',
|
|
album_title: 'Album',
|
|
file_path: `/music/${id}.mp3`,
|
|
duration_sec: 180,
|
|
disc_number: null,
|
|
track_number: null,
|
|
markers: [],
|
|
verdict: null,
|
|
verdict_at: null,
|
|
searched_at: null
|
|
};
|
|
}
|
|
|
|
function page(offset: number, total: number): AdminSuspectResponse {
|
|
return {
|
|
total,
|
|
limit: 50,
|
|
offset,
|
|
groups: [
|
|
{ directory: 'a', tracks: [track('1'), track('2')] },
|
|
{ directory: 'b', tracks: [track('3')] }
|
|
]
|
|
};
|
|
}
|
|
|
|
// limit and total are in tracks, so the next offset must count tracks across
|
|
// groups, not the number of groups.
|
|
describe('suspectSourcesNextOffset', () => {
|
|
test('counts tracks, not groups', () => {
|
|
expect(suspectSourcesNextOffset(page(0, 10))).toBe(3);
|
|
});
|
|
|
|
test('stops at the total', () => {
|
|
expect(suspectSourcesNextOffset(page(7, 10))).toBeUndefined();
|
|
});
|
|
});
|