// // JXEpisodeInfo.m // AICity // // Created by TogetherWatch on 2025-10-20. // Feature: 010-ui-ios - iOS平台完整功能实现(对标Android) // #import "JXEpisodeInfo.h" @implementation JXEpisodeInfo #pragma mark - 初始化方法 - (instancetype)init { self = [super init]; if (self) { _episodeId = @""; _episodeNumber = 0; _title = @""; _thumbnailUrl = @""; _duration = 0; _likeCount = 0; _isPaid = NO; _isActive = YES; _tcplayerAppId = @""; _tcplayerFileId = @""; _tcplayerSign = @""; _tcplayerSign265 = @""; _tcplayerSign264 = @""; } return self; } - (instancetype)initWithDictionary:(NSDictionary *)dict { self = [super init]; if (self) { _episodeId = dict[@"id"] ?: dict[@"jx_episode_id"] ?: @""; _episodeNumber = [dict[@"episodeNumber"] ?: dict[@"episode_number"] integerValue]; _title = dict[@"title"] ?: @""; _thumbnailUrl = dict[@"thumbnailUrl"] ?: dict[@"thumbnail"] ?: @""; _duration = [dict[@"duration"] integerValue]; _likeCount = [dict[@"likeCount"] longLongValue]; _isPaid = [dict[@"isPaid"] ?: dict[@"is_paid"] boolValue]; _isActive = [dict[@"isActive"] ?: dict[@"is_active"] boolValue]; // 播放源信息 _tcplayerAppId = dict[@"tcplayer_app_id"] ?: @""; _tcplayerFileId = dict[@"tcplayer_file_id"] ?: @""; _tcplayerSign = dict[@"tcplayer_sign"] ?: @""; _tcplayerSign265 = dict[@"tcplayer_sign_265"] ?: @""; _tcplayerSign264 = dict[@"tcplayer_sign_264"] ?: @""; } return self; } + (instancetype)episodeInfoWithDictionary:(NSDictionary *)dict { return [[self alloc] initWithDictionary:dict]; } - (NSDictionary *)toDictionary { return @{ @"id": self.episodeId, @"episodeNumber": @(self.episodeNumber), @"title": self.title, @"thumbnailUrl": self.thumbnailUrl, @"duration": @(self.duration), @"likeCount": @(self.likeCount), @"isPaid": @(self.isPaid), @"isActive": @(self.isActive), @"tcplayer_app_id": self.tcplayerAppId ?: @"", @"tcplayer_file_id": self.tcplayerFileId ?: @"", @"tcplayer_sign": self.tcplayerSign ?: @"", @"tcplayer_sign_265": self.tcplayerSign265 ?: @"", @"tcplayer_sign_264": self.tcplayerSign264 ?: @"" }; } #pragma mark - UI格式化方法 - (NSString *)formattedDuration { NSInteger minutes = self.duration / 60; NSInteger seconds = self.duration % 60; return [NSString stringWithFormat:@"%02ld:%02ld", (long)minutes, (long)seconds]; } - (NSString *)formattedLikeCount { return [self formatCount:self.likeCount]; } - (NSString *)formatCount:(long long)count { if (count >= 10000) { return [NSString stringWithFormat:@"%.1fw", count / 10000.0]; } else if (count >= 1000) { return [NSString stringWithFormat:@"%.1fk", count / 1000.0]; } else { return [NSString stringWithFormat:@"%lld", count]; } } #pragma mark - NSObject - (NSString *)description { return [NSString stringWithFormat:@"", (long)self.episodeNumber, self.title, [self formattedDuration], @(self.isPaid)]; } @end