JXEpisodeInfo.m 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // JXEpisodeInfo.m
  3. // AICity
  4. //
  5. // Created by TogetherWatch on 2025-10-20.
  6. // Feature: 010-ui-ios - iOS平台完整功能实现(对标Android)
  7. //
  8. #import "JXEpisodeInfo.h"
  9. @implementation JXEpisodeInfo
  10. #pragma mark - 初始化方法
  11. - (instancetype)init {
  12. self = [super init];
  13. if (self) {
  14. _episodeId = @"";
  15. _episodeNumber = 0;
  16. _title = @"";
  17. _thumbnailUrl = @"";
  18. _duration = 0;
  19. _likeCount = 0;
  20. _isPaid = NO;
  21. _isActive = YES;
  22. _tcplayerAppId = @"";
  23. _tcplayerFileId = @"";
  24. _tcplayerSign = @"";
  25. _tcplayerSign265 = @"";
  26. _tcplayerSign264 = @"";
  27. }
  28. return self;
  29. }
  30. - (instancetype)initWithDictionary:(NSDictionary *)dict {
  31. self = [super init];
  32. if (self) {
  33. _episodeId = dict[@"id"] ?: dict[@"jx_episode_id"] ?: @"";
  34. _episodeNumber = [dict[@"episodeNumber"] ?: dict[@"episode_number"] integerValue];
  35. _title = dict[@"title"] ?: @"";
  36. _thumbnailUrl = dict[@"thumbnailUrl"] ?: dict[@"thumbnail"] ?: @"";
  37. _duration = [dict[@"duration"] integerValue];
  38. _likeCount = [dict[@"likeCount"] longLongValue];
  39. _isPaid = [dict[@"isPaid"] ?: dict[@"is_paid"] boolValue];
  40. _isActive = [dict[@"isActive"] ?: dict[@"is_active"] boolValue];
  41. // 播放源信息
  42. _tcplayerAppId = dict[@"tcplayer_app_id"] ?: @"";
  43. _tcplayerFileId = dict[@"tcplayer_file_id"] ?: @"";
  44. _tcplayerSign = dict[@"tcplayer_sign"] ?: @"";
  45. _tcplayerSign265 = dict[@"tcplayer_sign_265"] ?: @"";
  46. _tcplayerSign264 = dict[@"tcplayer_sign_264"] ?: @"";
  47. }
  48. return self;
  49. }
  50. + (instancetype)episodeInfoWithDictionary:(NSDictionary *)dict {
  51. return [[self alloc] initWithDictionary:dict];
  52. }
  53. - (NSDictionary *)toDictionary {
  54. return @{
  55. @"id": self.episodeId,
  56. @"episodeNumber": @(self.episodeNumber),
  57. @"title": self.title,
  58. @"thumbnailUrl": self.thumbnailUrl,
  59. @"duration": @(self.duration),
  60. @"likeCount": @(self.likeCount),
  61. @"isPaid": @(self.isPaid),
  62. @"isActive": @(self.isActive),
  63. @"tcplayer_app_id": self.tcplayerAppId ?: @"",
  64. @"tcplayer_file_id": self.tcplayerFileId ?: @"",
  65. @"tcplayer_sign": self.tcplayerSign ?: @"",
  66. @"tcplayer_sign_265": self.tcplayerSign265 ?: @"",
  67. @"tcplayer_sign_264": self.tcplayerSign264 ?: @""
  68. };
  69. }
  70. #pragma mark - UI格式化方法
  71. - (NSString *)formattedDuration {
  72. NSInteger minutes = self.duration / 60;
  73. NSInteger seconds = self.duration % 60;
  74. return [NSString stringWithFormat:@"%02ld:%02ld", (long)minutes, (long)seconds];
  75. }
  76. - (NSString *)formattedLikeCount {
  77. return [self formatCount:self.likeCount];
  78. }
  79. - (NSString *)formatCount:(long long)count {
  80. if (count >= 10000) {
  81. return [NSString stringWithFormat:@"%.1fw", count / 10000.0];
  82. } else if (count >= 1000) {
  83. return [NSString stringWithFormat:@"%.1fk", count / 1000.0];
  84. } else {
  85. return [NSString stringWithFormat:@"%lld", count];
  86. }
  87. }
  88. #pragma mark - NSObject
  89. - (NSString *)description {
  90. return [NSString stringWithFormat:@"<JXEpisodeInfo: 第%ld集, title=%@, duration=%@, isPaid=%@>",
  91. (long)self.episodeNumber,
  92. self.title,
  93. [self formattedDuration],
  94. @(self.isPaid)];
  95. }
  96. @end