audioPlayListManager.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. //
  2. // audioPlayListManager.m
  3. // 双子星云手机
  4. //
  5. // Created by xd h on 2024/7/15.
  6. //
  7. #import "audioPlayListManager.h"
  8. #import <MJExtension.h>
  9. @implementation audioPlayListManager
  10. + (instancetype)shareManager {
  11. static audioPlayListManager *_instance;
  12. static dispatch_once_t onceToken;
  13. dispatch_once(&onceToken, ^{
  14. _instance = [[self alloc] init];
  15. });
  16. return _instance;
  17. }
  18. - (instancetype)init {
  19. if (self = [super init]) {
  20. }
  21. return self;
  22. }
  23. - (NSString*)uid{
  24. if(!_uid || _uid.length == 0){
  25. return @"userName";
  26. }
  27. return _uid;
  28. }
  29. - (NSString *)getFullDirector {
  30. NSString *account = self.uid;
  31. if (account.length != 0)
  32. {
  33. NSString *fileFolder = [HWDataManager documentPathForAccount:account fileFolder:KaudioPlayListDirector];
  34. // 创建文件储存路径
  35. if (![[NSFileManager defaultManager] fileExistsAtPath:fileFolder]) {
  36. [[NSFileManager defaultManager] createDirectoryAtPath:fileFolder withIntermediateDirectories:YES attributes:nil error:nil];
  37. }
  38. return fileFolder;
  39. }else {
  40. HLog(@"创建文件失败!");
  41. return @"";
  42. }
  43. }
  44. #pragma mark- last file plist Path
  45. - (NSString *)getAudioPlayListPlistPath {
  46. NSString *fileFolder = [self getFullDirector];
  47. return [fileFolder stringByAppendingPathComponent:@"audioPlayList.plist"];;
  48. }
  49. #pragma mark- last file plist
  50. - (NSMutableDictionary *)audioPlayPList {
  51. if (!_audioPlayPList) { // 内存没有
  52. _audioPlayPList = [[NSDictionary dictionaryWithContentsOfFile:[self getAudioPlayListPlistPath]] mutableCopy]; // 本地加载
  53. if (!_audioPlayPList) { // 本地没有,分配内存
  54. _audioPlayPList = [NSMutableDictionary dictionary];
  55. }
  56. }
  57. return _audioPlayPList;
  58. }
  59. - (NSMutableArray*)audioPlayListArr{
  60. if (!_audioPlayListArr) { // 内存没有
  61. NSMutableArray *dataArr = [NSMutableArray new];
  62. if (self.audioPlayPList) {
  63. if([[self.audioPlayPList allKeys] containsObject:KaudioPlayListkey]){
  64. NSArray *lastDataArr = self.audioPlayPList[KaudioPlayListkey];
  65. for (int i=0; i<lastDataArr.count; i++) {
  66. NSDictionary *dict = lastDataArr[i];
  67. lastFileModel *model = [lastFileModel mj_objectWithKeyValues:dict];
  68. if(model){
  69. [dataArr addObject:model];
  70. }
  71. }
  72. //数组按第一次预览时间倒序
  73. if(dataArr.count >= 2){
  74. NSArray *sortArr = [dataArr sortedArrayUsingComparator:^NSComparisonResult(lastFileModel* obj1, lastFileModel* obj2) {
  75. NSTimeInterval time1 = obj1.lastPreTime;
  76. NSTimeInterval time2 = obj2.lastPreTime;
  77. if (time1 < time2) {
  78. return NSOrderedDescending;
  79. }
  80. if (time1 > time2) {
  81. return NSOrderedAscending;
  82. }
  83. return NSOrderedSame;
  84. }];
  85. dataArr = [NSMutableArray arrayWithArray:sortArr];
  86. }
  87. }
  88. }
  89. _audioPlayListArr = dataArr;
  90. }
  91. return _audioPlayListArr;
  92. }
  93. /** 增加配置信息 */
  94. - (BOOL)saveFileInfoWith:(lastFileModel *)lastFileMod with:(NSString*)fullPath {
  95. if(!lastFileMod || !fullPath){
  96. return NO;
  97. }
  98. BOOL flag = NO;
  99. @synchronized (self) {
  100. //NSString *key = fullPath;
  101. //1.本地持久化
  102. NSMutableDictionary *dictM = self.audioPlayPList;
  103. NSMutableArray *dataArr = self.audioPlayListArr;
  104. BOOL isInPlayList = NO;
  105. NSMutableArray *saveDictArr = [NSMutableArray new];
  106. for (lastFileModel*model in dataArr) {
  107. if([model.path isEqualToString:fullPath]){
  108. isInPlayList = YES;
  109. break;
  110. }
  111. //把原来的数据加到saveDictArr
  112. //lastFileMod.localPath = [self getAudioCacheFullPathBy:model.name];
  113. NSDictionary *dict = [model lastFileInfoFun];
  114. [saveDictArr addObject:dict];
  115. }
  116. if(isInPlayList){
  117. HLog(@"音乐保存在播放列表里面了")
  118. return NO;
  119. }
  120. //1.写到内存
  121. //[dataArr addObject:lastFileMod];
  122. [dataArr insertObject:lastFileMod atIndex:0];
  123. //2.本地持久化 把新的的数据加到saveDictArr
  124. lastFileMod.lastPreTime = [iTools getNowTimeStamp];
  125. lastFileMod.localPath = [self getAudioCacheFullPathBy:lastFileMod.name];
  126. NSDictionary *dict = [lastFileMod lastFileInfoFun];
  127. [saveDictArr addObject:dict];
  128. if(saveDictArr){
  129. [dictM setValue:saveDictArr forKey:KaudioPlayListkey];
  130. }
  131. NSString * PlistPath = [self getAudioPlayListPlistPath];
  132. flag = [dictM writeToFile:PlistPath atomically:YES];
  133. }
  134. return flag;
  135. }
  136. /** 删除配置信息 */
  137. - (BOOL)deleteFileInfoWithUrl:(NSString *)fullPath {
  138. if(!fullPath){
  139. return NO;
  140. }
  141. BOOL flag = NO;
  142. @synchronized (self) {
  143. //1.内存删除
  144. for (lastFileModel*preModel in self.audioPlayListArr) {
  145. if([preModel.path isEqualToString:fullPath]){
  146. [self.audioPlayListArr removeObject:preModel];
  147. break;
  148. }
  149. }
  150. //2.本地持久化删除
  151. NSMutableArray *saveDictArr = [NSMutableArray new];
  152. for (lastFileModel*model in self.audioPlayListArr) {
  153. NSDictionary *dict = [model lastFileInfoFun];
  154. [saveDictArr addObject:dict];
  155. }
  156. [self.audioPlayPList setValue:saveDictArr forKey:KaudioPlayListkey];
  157. flag = [self.audioPlayPList writeToFile:[self getAudioPlayListPlistPath] atomically:YES];
  158. }
  159. return flag;
  160. }
  161. - (NSString*)getAudioCacheFullPathBy:(NSString*)name
  162. {
  163. NSString*fullPathDirector = [NSString stringWithFormat:@"%@/%@",DocumentPath,@"playAudioCache"];
  164. // 创建文件储存路径
  165. if (![[NSFileManager defaultManager] fileExistsAtPath:fullPathDirector]) {
  166. [[NSFileManager defaultManager] createDirectoryAtPath:fullPathDirector withIntermediateDirectories:YES attributes:nil error:nil];
  167. }
  168. NSString*fullPath = [NSString stringWithFormat:@"%@/%@",fullPathDirector,name];
  169. return fullPath;
  170. }
  171. //df准备播放是下载
  172. - (void)beginToDownloadByUrl:(NSString*)url
  173. {
  174. if(!url)return;
  175. //解码
  176. //NSString * urlString = [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  177. NSString *urlFileName = [url lastPathComponent];
  178. NSString *filePath = [iTools base64UrlDecoder:urlFileName];
  179. //NSString * fileName = [filePath lastPathComponent];
  180. NSString *urlStr = ksharedAppDelegate.NASFileByBoxService;
  181. // NSString *fileUrl = [[NSString alloc] initWithFormat:@"%@getFiles/%@",urlStr,urlFileName];
  182. NSString *fileUrl = [[NSString alloc] initWithFormat:@"%@getFile?path=%@",urlStr,filePath];
  183. fileUrl = [fileUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  184. if (![self checkDownloadDoneBy:filePath]) {
  185. [[audioPlayDownloadManager shareManager] addDownloadWithURLs:@[fileUrl]];
  186. }
  187. }
  188. //检测是否下载完成
  189. - (BOOL)checkDownloadDoneBy:(NSString*)filePath
  190. {
  191. lastFileModel*preDownloadModel = nil;
  192. for (lastFileModel*model in self.audioPlayListArr) {
  193. if([model.path isEqualToString:filePath]){
  194. preDownloadModel = model;
  195. break;
  196. }
  197. }
  198. if(!preDownloadModel){
  199. return NO;
  200. }
  201. //NSString *curFilePath = preDownloadModel.localPath;
  202. NSString *curFilePath = [[audioPlayListManager shareManager] getAudioCacheFullPathBy:preDownloadModel.name];
  203. // 创建NSFileManager实例
  204. NSFileManager *fileManager = [NSFileManager defaultManager];
  205. // 使用fileExistsAtPath方法检查文件是否存在
  206. BOOL fileExists = [fileManager fileExistsAtPath:curFilePath];
  207. // 再加一层判断看看
  208. if(!fileExists){
  209. NSDictionary *attributes = [fileManager attributesOfItemAtPath:curFilePath error:nil];
  210. if (attributes) {
  211. fileExists = YES;;
  212. } else {
  213. HLog(@"文件不存在:%@",filePath);
  214. }
  215. }
  216. if(preDownloadModel && preDownloadModel.isDownDoneType && fileExists){
  217. return YES;
  218. }
  219. return NO;
  220. }
  221. /** 更新下载完成 */
  222. - (void)changeFileToDonewith:(NSString*)url
  223. {
  224. NSString * decodeUrl= [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  225. NSArray *urlArr = [decodeUrl componentsSeparatedByString:@"?path="];
  226. if(urlArr.count >= 2){
  227. NSString *filePath = urlArr.lastObject;
  228. for (lastFileModel*model in self.audioPlayListArr) {
  229. if([model.path isEqualToString:filePath]){
  230. model.isDownDoneType = YES;
  231. [self updateLoaclInfoFun];
  232. break;
  233. }
  234. }
  235. }
  236. }
  237. //本地更新数据持久化
  238. - (void)updateLoaclInfoFun
  239. {
  240. @synchronized (self) {
  241. //1.本地持久化
  242. NSMutableDictionary *dictM = self.audioPlayPList;
  243. NSMutableArray *dataArr = self.audioPlayListArr;
  244. NSMutableArray *saveDictArr = [NSMutableArray new];
  245. for (lastFileModel*model in dataArr) {
  246. model.localPath = [self getAudioCacheFullPathBy:model.name];
  247. NSDictionary *dict = [model lastFileInfoFun];
  248. [saveDictArr addObject:dict];
  249. }
  250. //2.本地持久化
  251. if(saveDictArr){
  252. [dictM setValue:saveDictArr forKey:KaudioPlayListkey];
  253. }
  254. NSString * PlistPath = [self getAudioPlayListPlistPath];
  255. [dictM writeToFile:PlistPath atomically:YES];
  256. }
  257. }
  258. /** 检测是否下载完成 */
  259. - (NSString*)checkFileToDownloadDonewith:(NSString*)url
  260. {
  261. NSString *urlFileName = [url lastPathComponent];
  262. NSString *filePath = [iTools base64UrlDecoder:urlFileName];
  263. for (lastFileModel*model in self.audioPlayListArr) {
  264. if([model.path isEqualToString:filePath]){
  265. if (model.isDownDoneType) {
  266. if(model.localPath){
  267. NSString *curFilePath = [[audioPlayListManager shareManager] getAudioCacheFullPathBy:model.name];
  268. // 创建NSFileManager实例
  269. NSFileManager *fileManager = [NSFileManager defaultManager];
  270. // 使用fileExistsAtPath方法检查文件是否存在
  271. BOOL fileExists = [fileManager fileExistsAtPath:curFilePath];
  272. if (fileExists) {
  273. return curFilePath;
  274. } else {
  275. return @"";
  276. }
  277. }
  278. }
  279. break;
  280. }
  281. }
  282. return @"";
  283. }
  284. @end