You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
518 lines
20 KiB
518 lines
20 KiB
// |
|
// MusiclistViewControllers.m |
|
// Lookfit |
|
// |
|
// Created by ecell on 2023/3/13. |
|
// Copyright © 2023 Sheldon. All rights reserved. |
|
// |
|
|
|
#import "MusiclistViewControllers.h" |
|
#import <MediaPlayer/MediaPlayer.h> |
|
#import "MusicListTableViewCell.h" |
|
#import "MusicModel.h" |
|
#import "JL_RunSDK.h" |
|
#import <SVProgressHUD/SVProgressHUD.h> |
|
#import "transferPopViews.h" |
|
#import "BLEConst.h" |
|
|
|
@interface MusiclistViewControllers ()<UITableViewDelegate,UITableViewDataSource> |
|
|
|
@property (nonatomic ,strong) UITableView *listTable; |
|
@property (nonatomic ,strong) NSMutableArray *songArr; |
|
@property (nonatomic ,strong) NSMutableArray *selectArr; |
|
@property (nonatomic ,strong) NSMutableArray *updataArr; |
|
@property (nonatomic ,weak) UIButton *selectbtn; |
|
@property (nonatomic ,assign) BOOL isSelect; |
|
@property (nonatomic ,weak) UIButton *addBtn; |
|
|
|
@property (nonatomic ,assign) NSInteger coutn; |
|
|
|
@property (nonatomic ,weak) transferPopViews *popview; |
|
|
|
|
|
@property (nonatomic ,assign) NSInteger jisuan; |
|
|
|
@end |
|
|
|
@implementation MusiclistViewControllers |
|
|
|
- (void)viewDidLoad { |
|
[super viewDidLoad]; |
|
// Do any additional setup after loading the view. |
|
self.isSelect = NO; |
|
[self getItunesMusic]; |
|
[self.view addSubview:self.listTable]; |
|
self.listTable.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 180 - 50); |
|
|
|
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; |
|
button.backgroundColor = [UIColor colorWithRed:230.0/255.0 green:230.0/255.0 blue:230.0/255.0 alpha:1]; |
|
button.frame = CGRectMake(30, self.view.frame.size.height-180, self.view.frame.size.width-60, 50); |
|
[button setTitle:NSLocalizedString(@"添加音乐", nil) forState:UIControlStateNormal]; |
|
button.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size: 20]; |
|
[button setTitleColor:[UIColor colorWithRed:245.0/255.0 green:124.0/255.0 blue:5.0/255.0 alpha:1] forState:0]; |
|
button.layer.cornerRadius = 25; |
|
button.layer.masksToBounds = YES; |
|
self.addBtn = button; |
|
[button addTarget:self action:@selector(addmu) forControlEvents:UIControlEventTouchUpInside]; |
|
[self.view addSubview:button]; |
|
|
|
[[JL_RunSDK sharedInstance] loadRootFiles]; |
|
} |
|
|
|
- (void)addmu |
|
{ |
|
if (self.selectArr.count <= 0) |
|
{ |
|
[SVProgressHUD showErrorWithStatus:NSLocalizedString(@"请选择需要同步的音乐", nil)]; |
|
return; |
|
} |
|
[self.updataArr removeAllObjects]; |
|
transferPopViews *popview = [transferPopViews new]; |
|
self.popview = popview; |
|
[popview subPopView]; |
|
self.coutn = 0; |
|
[self chuanshu]; |
|
} |
|
|
|
- (void)chuanshu |
|
{ |
|
if (self.coutn < self.selectArr.count) |
|
{ |
|
self.popview.numberLabel.text = [NSString stringWithFormat:@"(%ld/%ld)",self.coutn+1,self.selectArr.count]; |
|
MusicModel *model = self.selectArr[self.coutn]; |
|
NSString *fileName = [model.fileURL lastPathComponent]; |
|
[JL_RunSDK.sharedInstance transportFile:model.fileURL fileName:fileName Result:^(JL_BigFileResult result, float progress) { |
|
if (result == JL_BigFileTransferStart) { |
|
NSLog(@"---> 开始传输。"); |
|
|
|
} |
|
if (result == JL_BigFileTransferEnd) { |
|
NSLog(@"---> 传输完成"); |
|
NSMutableDictionary *dic = [NSMutableDictionary new]; |
|
[dic setValue:model.name forKey:@"name"]; |
|
[dic setValue:model.fileURL forKey:@"fileURL"]; |
|
[dic setValue:model.singer forKey:@"singer"]; |
|
[dic setValue:model.time forKey:@"time"]; |
|
[dic setValue:model.musicSize forKey:@"musicSize"]; |
|
NSString *reconnectionUUIDSrting = [[NSUserDefaults standardUserDefaults] objectForKey:AutomaticReconnectionDevice]; |
|
NSArray *arr = [[NSUserDefaults standardUserDefaults] objectForKey:reconnectionUUIDSrting]; |
|
for (NSDictionary *ddic in arr) |
|
{ |
|
if (![ddic[@"name"] isEqualToString:model.name]) |
|
[self.updataArr addObject:ddic]; |
|
} |
|
[self.updataArr addObject:dic]; |
|
|
|
[[NSUserDefaults standardUserDefaults] setObject:self.updataArr forKey:reconnectionUUIDSrting]; |
|
NSLog(@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:reconnectionUUIDSrting]); |
|
self.coutn++; |
|
if (self.coutn == self.selectArr.count) |
|
{ |
|
[self.popview dismiss]; |
|
[SVProgressHUD showInfoWithStatus:NSLocalizedString(@"同步完成", nil)]; |
|
self.updataOK(); |
|
[self selectMusic]; |
|
} |
|
else |
|
{ |
|
|
|
[self chuanshu]; |
|
} |
|
} |
|
if (result == JL_BigFileTransferDownload) { |
|
NSLog(@"---> 传输进度: %.2f",progress); |
|
NSString *txt = [NSString stringWithFormat:@"传输进度:%.1f%%",progress*100.0f]; |
|
NSString *size = [NSString stringWithFormat:@"文件大小:%@",model.musicSize]; |
|
NSString *name = [NSString stringWithFormat:@"文件名称:%@.MP3",model.name]; |
|
self.popview.msgLabel.attributedText = [self labelFontSize:[NSString stringWithFormat:@"%@\n%@\n%@",txt,size,name]]; |
|
} |
|
if (result == JL_BigFileTransferOutOfRange) { |
|
NSLog(@"---> 传输数据超范围"); |
|
[self.popview dismiss]; |
|
[self selectMusic]; |
|
[SVProgressHUD showErrorWithStatus:NSLocalizedString(@"传输数据超范围", nil)]; |
|
} |
|
if (result == JL_BigFileTransferFail) { |
|
NSLog(@"---> 文件传输失败"); |
|
[self.popview dismiss]; |
|
[self selectMusic]; |
|
[SVProgressHUD showErrorWithStatus:NSLocalizedString(@"文件传输失败", nil)]; |
|
} |
|
if (result == JL_BigFileCrcError) { |
|
NSLog(@"---> 文件校验失败"); |
|
[self.popview dismiss]; |
|
[self selectMusic]; |
|
[SVProgressHUD showErrorWithStatus:NSLocalizedString(@"文件校验失败", nil)]; |
|
} |
|
if (result == JL_BigFileOutOfMemory) { |
|
NSLog(@"---> 空间不足"); |
|
[self.popview dismiss]; |
|
[self selectMusic]; |
|
[SVProgressHUD showErrorWithStatus:NSLocalizedString(@"空间不足", nil)]; |
|
} |
|
if (result == JL_BigFileTransferNoResponse) { |
|
NSLog(@"---> 设备没有响应"); |
|
[self.popview dismiss]; |
|
[self selectMusic]; |
|
[SVProgressHUD showErrorWithStatus:NSLocalizedString(@"设备没有响应", nil)]; |
|
} |
|
if (result == JL_BigFileTransferCancel) { |
|
NSLog(@"---> 传输取消"); |
|
[self.popview dismiss]; |
|
[self selectMusic]; |
|
[SVProgressHUD showErrorWithStatus:NSLocalizedString(@"同步取消", nil)]; |
|
} |
|
|
|
}]; |
|
} |
|
} |
|
|
|
|
|
- (UITableView *)listTable |
|
{ |
|
if (!_listTable) |
|
{ |
|
_listTable = [[UITableView alloc] init]; |
|
_listTable.backgroundColor = [UIColor clearColor]; |
|
_listTable.dataSource = self; |
|
_listTable.delegate = self; |
|
[_listTable setRowHeight:70]; |
|
// _listTable.separatorStyle = UITableViewCellSeparatorStyleNone; |
|
[_listTable registerClass:MusicListTableViewCell.class forCellReuseIdentifier:NSStringFromClass(MusicListTableViewCell.class)]; |
|
//__weak typeof(self) weakSelf = self; |
|
} |
|
return _listTable; |
|
} |
|
|
|
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath |
|
{ |
|
MusicListTableViewCell *cell = [MusicListTableViewCell cellWithTableView:tableView indexPath:indexPath]; |
|
cell.isSelect = self.isSelect; |
|
cell.msgModel = self.songArr[indexPath.row]; |
|
cell.coutn = indexPath.row+1; |
|
return cell; |
|
} |
|
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section |
|
{ |
|
return self.songArr.count; |
|
} |
|
|
|
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath |
|
{ |
|
MusicModel *model = self.songArr[indexPath.row]; |
|
if (self.isSelect) |
|
{ |
|
BOOL select = [model.isSelect boolValue]; |
|
select = !select; |
|
if (select) |
|
{ |
|
model.isSelect = @"1"; |
|
[self.selectArr addObject:model]; |
|
} |
|
else |
|
{ |
|
model.isSelect = @"0"; |
|
[self.selectArr removeObject:model]; |
|
} |
|
|
|
[self.addBtn setTitle:self.selectArr.count > 0 ? [NSString stringWithFormat:@"%@ %ld/%ld",NSLocalizedString(@"同步音乐至手表", nil),self.selectArr.count,self.songArr.count] : NSLocalizedString(@"添加音乐", nil) forState:UIControlStateNormal]; |
|
} |
|
[self.listTable reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; |
|
|
|
} |
|
|
|
|
|
// MARK:- 获取 iTunes 中的音乐 |
|
- (void)getItunesMusic |
|
{ |
|
|
|
// 创建媒体选择队列 |
|
MPMediaQuery *query = [[MPMediaQuery alloc] init]; |
|
// 创建读取条件 |
|
MPMediaPropertyPredicate *albumNamePredicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInt:MPMediaTypeMusic] forProperty:MPMediaItemPropertyMediaType]; |
|
// 给队列添加读取条件 |
|
[query addFilterPredicate:albumNamePredicate]; |
|
// 从队列中获取条件的数组集合 |
|
NSArray *itemsFromGenericQuery = [query items]; |
|
// 遍历解析数据 |
|
self.jisuan = itemsFromGenericQuery.count; |
|
for (MPMediaItem *music in itemsFromGenericQuery) { |
|
[self resolverMediaItem:music]; |
|
} |
|
} |
|
|
|
- (void)resolverMediaItem:(MPMediaItem *)song |
|
{ |
|
[SVProgressHUD showWithStatus:NSLocalizedString(@"加载中", nil)]; |
|
// 歌名 |
|
NSString *name = [song valueForProperty:MPMediaItemPropertyTitle]; |
|
|
|
// 歌手名字 |
|
NSString *singer = [song valueForProperty:MPMediaItemPropertyArtist]; |
|
if(singer == nil) |
|
{ |
|
singer = @"未知歌手"; |
|
} |
|
// 歌曲时长(单位:秒) |
|
NSTimeInterval duration = [[song valueForProperty:MPMediaItemPropertyPlaybackDuration] doubleValue]; |
|
NSString *time = @""; |
|
if((int)duration % 60 < 10) { |
|
time = [NSString stringWithFormat:@"%d:0%d",(int)duration / 60,(int)duration % 60]; |
|
}else { |
|
time = [NSString stringWithFormat:@"%d:%d",(int)duration / 60,(int)duration % 60]; |
|
} |
|
// 歌曲插图(没有就返回 nil) |
|
MPMediaItemArtwork *artwork = [song valueForProperty:MPMediaItemPropertyArtwork]; |
|
UIImage *image; |
|
if (artwork) { |
|
image = [artwork imageWithSize:CGSizeMake(72, 72)]; |
|
}else { |
|
image = [UIImage imageNamed:@"duanshipin"]; |
|
} |
|
|
|
NSURL *url = [song valueForProperty:MPMediaItemPropertyAssetURL]; |
|
|
|
NSArray *DocumentPath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); |
|
NSString *filepath = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%@/%@.MP3",DocumentPath[0],name]]; |
|
NSFileManager *fileManager = [NSFileManager defaultManager]; |
|
if ([fileManager fileExistsAtPath:filepath]) |
|
{ |
|
MusicModel *model = [MusicModel new]; |
|
model.name = name; |
|
model.fileURL = filepath; |
|
model.singer = singer; |
|
model.time = time; |
|
//model.image = image; |
|
model.isSelect = @"0"; |
|
model.musicSize = [self jisuan:[self fileSizeForPath:filepath]]; |
|
[self.songArr addObject:model]; |
|
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ |
|
dispatch_async(dispatch_get_main_queue(), ^{ |
|
[self.listTable reloadData]; |
|
[SVProgressHUD dismiss]; |
|
}); |
|
}); |
|
} |
|
else |
|
{ |
|
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:url options:nil]; |
|
NSFileManager *fileManager = [NSFileManager defaultManager]; |
|
NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); |
|
NSString *documentsDirectoryPath = [dirs objectAtIndex:0]; |
|
// NSLog (@"compatible presets for songAsset: %@",[AVAssetExportSession exportPresetsCompatibleWithAsset:songAsset]); |
|
//NSArray *ar = [AVAssetExportSession exportPresetsCompatibleWithAsset: songAsset]; |
|
// NSLog(@"%@", ar); |
|
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] |
|
initWithAsset: songAsset |
|
presetName:AVAssetExportPresetPassthrough]; |
|
//NSLog (@"created exporter. supportedFileTypes: %@", exporter.supportedFileTypes); |
|
exporter.shouldOptimizeForNetworkUse = YES; |
|
exporter.outputFileType = AVFileTypeQuickTimeMovie; |
|
|
|
NSString *exportFile = [documentsDirectoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.MP3",[song valueForProperty:MPMediaItemPropertyTitle]]]; |
|
NSError *error1; |
|
if([fileManager fileExistsAtPath:exportFile]) |
|
{ |
|
[fileManager removeItemAtPath:exportFile error:&error1]; |
|
} |
|
|
|
NSURL* exportURL = [NSURL fileURLWithPath:exportFile]; |
|
exporter.outputURL = exportURL; |
|
// do the export |
|
[exporter exportAsynchronouslyWithCompletionHandler:^ |
|
{ |
|
//NSData *data1 = [NSData dataWithContentsOfFile:exportFile]; |
|
//NSLog(@"==================data1:%@",data1); |
|
int exportStatus = exporter.status; |
|
switch (exportStatus) |
|
{ |
|
case AVAssetExportSessionStatusFailed: |
|
{ |
|
// log error to text view |
|
NSError *exportError = exporter.error; |
|
NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError); |
|
break; |
|
} |
|
case AVAssetExportSessionStatusCompleted: |
|
{ |
|
NSLog (@"AVAssetExportSessionStatusCompleted"); |
|
|
|
MusicModel *model = [MusicModel new]; |
|
model.name = name; |
|
model.fileURL = exportFile; |
|
model.singer = singer; |
|
model.time = time; |
|
//model.image = image; |
|
model.musicSize = [self jisuan:[self fileSizeForPath:exportFile]]; |
|
model.isSelect = @"0"; |
|
[self.songArr addObject:model]; |
|
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ |
|
dispatch_async(dispatch_get_main_queue(), ^{ |
|
[self.listTable reloadData]; |
|
if (self.jisuan == self.songArr.count) |
|
[SVProgressHUD dismiss]; |
|
}); |
|
}); |
|
break; |
|
} |
|
case AVAssetExportSessionStatusUnknown: |
|
{ |
|
NSLog (@"AVAssetExportSessionStatusUnknown"); |
|
break; |
|
} |
|
case AVAssetExportSessionStatusExporting: |
|
{ |
|
NSLog (@"AVAssetExportSessionStatusExporting"); |
|
break; |
|
} |
|
case AVAssetExportSessionStatusCancelled: |
|
{ |
|
NSLog (@"AVAssetExportSessionStatusCancelled"); |
|
break; |
|
} |
|
case AVAssetExportSessionStatusWaiting: |
|
{ |
|
NSLog (@"AVAssetExportSessionStatusWaiting"); |
|
break; |
|
} |
|
default: |
|
{ |
|
NSLog (@"didn't get export status"); |
|
break; |
|
} |
|
} |
|
|
|
}]; |
|
} |
|
} |
|
|
|
- (void)viewWillAppear:(BOOL)animated |
|
{ |
|
[super viewWillAppear:animated]; |
|
UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom]; |
|
button.frame = CGRectMake(0, 0, 80, 49); |
|
[button setTitle:NSLocalizedString(@"本地音乐", nil) forState:UIControlStateNormal]; |
|
button.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size: 20]; |
|
[button setTitleColor:[UIColor colorWithRed:45.0/255.0 green:45.0/255.0 blue:45.0/255.0 alpha:1] forState:0]; |
|
[button setImage:[UIImage imageNamed:@"nav_back"] forState:0]; |
|
[button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside]; |
|
UIBarButtonItem * backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; |
|
self.navigationItem.leftBarButtonItem = backButtonItem; |
|
|
|
UIButton *selectbtn = [UIButton buttonWithType:UIButtonTypeCustom]; |
|
selectbtn.frame = CGRectMake(0, 0, 50, 49); |
|
[selectbtn setImage:[UIImage imageNamed:@"nav_select_No"] forState:UIControlStateNormal]; |
|
[selectbtn setImage:[UIImage imageNamed:@"nav_select_Yes"] forState:UIControlStateSelected]; |
|
[selectbtn addTarget:self action:@selector(selectMusic) forControlEvents:UIControlEventTouchUpInside]; |
|
self.selectbtn.selected = NO; |
|
self.selectbtn = selectbtn; |
|
UIBarButtonItem *rightButtonItem = [[UIBarButtonItem alloc] initWithCustomView:selectbtn]; |
|
self.navigationItem.rightBarButtonItem = rightButtonItem; |
|
|
|
} |
|
|
|
- (void)selectMusic |
|
{ |
|
self.selectbtn.selected = !self.selectbtn.isSelected; |
|
[self.addBtn setTitle:NSLocalizedString(@"添加音乐", nil) forState:UIControlStateNormal]; |
|
self.isSelect = self.selectbtn.selected; |
|
[self.selectArr removeAllObjects]; |
|
for (MusicModel *model in self.songArr) |
|
{ |
|
model.isSelect = @"0"; |
|
} |
|
[self.listTable reloadData]; |
|
|
|
} |
|
|
|
- (void)buttonClick |
|
{ |
|
[self.navigationController popViewControllerAnimated:YES]; |
|
} |
|
|
|
- (NSMutableArray *)songArr |
|
{ |
|
if (!_songArr) _songArr = [NSMutableArray new]; |
|
return _songArr; |
|
} |
|
|
|
|
|
- (NSMutableArray *)selectArr |
|
{ |
|
if (!_selectArr) _selectArr = [NSMutableArray new]; |
|
return _selectArr; |
|
} |
|
|
|
- (NSMutableArray *)updataArr |
|
{ |
|
if (!_updataArr) _updataArr = [NSMutableArray new]; |
|
return _updataArr; |
|
} |
|
|
|
//获取某个路径下所有文件大小 |
|
- (CGFloat)fileSizeForPath:(NSString*)path |
|
{ |
|
CGFloat size = 0; |
|
|
|
if (!path.length) { |
|
return size; |
|
} |
|
|
|
NSFileManager *fileManager = [NSFileManager defaultManager]; |
|
NSArray<NSString *>* subPaths = [fileManager contentsOfDirectoryAtPath:path error:nil]; |
|
|
|
if (subPaths.count) { |
|
for (NSString *childPath in subPaths) { |
|
NSString *c_path = [path stringByAppendingPathComponent:childPath]; |
|
if ([fileManager fileExistsAtPath:c_path]) { |
|
size += [self fileSizeForPath:c_path]; |
|
} |
|
} |
|
} else { |
|
NSDictionary *fileAttributeDic = [fileManager attributesOfItemAtPath:path error:nil]; |
|
size = fileAttributeDic.fileSize; |
|
} |
|
return size; |
|
} |
|
|
|
- (NSString *)jisuan:(CGFloat)size |
|
{ |
|
NSString *sizeText; |
|
if (size >= pow(10, 9)) { // size >= 1GB |
|
sizeText = [NSString stringWithFormat:@"%.2fGB", size / pow(10, 9)]; |
|
} else if (size >= pow(10, 6)) { // 1GB > size >= 1MB |
|
sizeText = [NSString stringWithFormat:@"%.2fMB", size / pow(10, 6)]; |
|
} else if (size >= pow(10, 3)) { // 1MB > size >= 1KB |
|
sizeText = [NSString stringWithFormat:@"%.2fKB", size / pow(10, 3)]; |
|
} else { // 1KB > size |
|
sizeText = [NSString stringWithFormat:@"%.fB", size]; |
|
} |
|
return sizeText; |
|
} |
|
|
|
|
|
|
|
/// 指定字符大小 |
|
/// @param text 内容 |
|
- (NSAttributedString *)labelFontSize:(NSString *)text |
|
{ |
|
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:text]; |
|
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; |
|
paragraphStyle.lineSpacing = 6; |
|
paragraphStyle.alignment = NSTextAlignmentLeft; |
|
[string addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, string.length)]; |
|
return string; |
|
} |
|
|
|
/* |
|
#pragma mark - Navigation |
|
|
|
// In a storyboard-based application, you will often want to do a little preparation before navigation |
|
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { |
|
// Get the new view controller using [segue destinationViewController]. |
|
// Pass the selected object to the new view controller. |
|
} |
|
*/ |
|
|
|
@end
|
|
|