import 'package:logging/logging.dart'; abstract class AlbumUpgrader { Map? call(Map json); } /// Upgrade v1 Album to v2 class AlbumUpgraderV1 implements AlbumUpgrader { AlbumUpgraderV1({ this.logFilePath, }); @override call(Map json) { // v1 album items are corrupted in one of the updates, drop it _log.fine("[call] Upgrade v1 Album for file: $logFilePath"); final result = Map.from(json); result["items"] = []; return result; } /// File path for logging only final String? logFilePath; static final _log = Logger("entity.album.upgrader.AlbumUpgraderV1"); } /// Upgrade v2 Album to v3 class AlbumUpgraderV2 implements AlbumUpgrader { AlbumUpgraderV2({ this.logFilePath, }); @override call(Map json) { // move v2 items to v3 provider _log.fine("[call] Upgrade v2 Album for file: $logFilePath"); final result = Map.from(json); result["provider"] = { "type": "static", "content": { "items": result["items"], } }; result.remove("items"); // add the auto cover provider result["coverProvider"] = { "type": "auto", "content": {}, }; return result; } /// File path for logging only final String? logFilePath; static final _log = Logger("entity.album.upgrader.AlbumUpgraderV2"); } /// Upgrade v3 Album to v4 class AlbumUpgraderV3 implements AlbumUpgrader { AlbumUpgraderV3({ this.logFilePath, }); @override call(Map json) { // move v3 items to v4 provider _log.fine("[call] Upgrade v3 Album for file: $logFilePath"); final result = Map.from(json); // add the descending time sort provider result["sortProvider"] = { "type": "time", "content": { "isAscending": false, }, }; return result; } /// File path for logging only final String? logFilePath; static final _log = Logger("entity.album.upgrader.AlbumUpgraderV3"); }