mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-03 19:17:11 -05:00 
			
		
		
		
	* download only backup selected assets * android impl * fix tests * limit concurrent hashing to 16 * extension cleanup * optimized hashing * hash only selected albums * remove concurrency limit * address review comments * log more info on failure * add native cancellation * small batch size on ios, large on android * fix: get correct resources * cleanup getResource * ios better hash cancellation * handle graceful cancellation android * do not trigger multiple hashing ops * ios: fix circular reference, improve cancellation * kotlin: more cancellation checks * no need to create result * cancel previous task * avoid race condition * ensure cancellation gets called * fix cancellation not happening --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com> Co-authored-by: Alex <alex.tran1502@gmail.com>
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
import Photos
 | 
						|
 | 
						|
extension PHAsset {
 | 
						|
  func toPlatformAsset() -> PlatformAsset {
 | 
						|
    return PlatformAsset(
 | 
						|
      id: localIdentifier,
 | 
						|
      name: title,
 | 
						|
      type: Int64(mediaType.rawValue),
 | 
						|
      createdAt: creationDate.map { Int64($0.timeIntervalSince1970) },
 | 
						|
      updatedAt: modificationDate.map { Int64($0.timeIntervalSince1970) },
 | 
						|
      width: Int64(pixelWidth),
 | 
						|
      height: Int64(pixelHeight),
 | 
						|
      durationInSeconds: Int64(duration),
 | 
						|
      orientation: 0,
 | 
						|
      isFavorite: isFavorite
 | 
						|
    )
 | 
						|
  }
 | 
						|
 | 
						|
  var title: String {
 | 
						|
    return filename ?? originalFilename ?? "<unknown>"
 | 
						|
  }
 | 
						|
 | 
						|
  var filename: String? {
 | 
						|
    return value(forKey: "filename") as? String
 | 
						|
  }
 | 
						|
 | 
						|
  // This method is expected to be slow as it goes through the asset resources to fetch the originalFilename
 | 
						|
  var originalFilename: String? {
 | 
						|
    return getResource()?.originalFilename
 | 
						|
  }
 | 
						|
 | 
						|
  func getResource() -> PHAssetResource? {
 | 
						|
    let resources = PHAssetResource.assetResources(for: self)
 | 
						|
 | 
						|
    let filteredResources = resources.filter { $0.isMediaResource && isValidResourceType($0.type) }
 | 
						|
 | 
						|
    guard !filteredResources.isEmpty else {
 | 
						|
      return nil
 | 
						|
    }
 | 
						|
 | 
						|
    if filteredResources.count == 1 {
 | 
						|
      return filteredResources.first
 | 
						|
    }
 | 
						|
 | 
						|
    if let currentResource = filteredResources.first(where: { $0.isCurrent }) {
 | 
						|
      return currentResource
 | 
						|
    }
 | 
						|
 | 
						|
    if let fullSizeResource = filteredResources.first(where: { isFullSizeResourceType($0.type) }) {
 | 
						|
      return fullSizeResource
 | 
						|
    }
 | 
						|
 | 
						|
    return nil
 | 
						|
  }
 | 
						|
 | 
						|
  private func isValidResourceType(_ type: PHAssetResourceType) -> Bool {
 | 
						|
    switch mediaType {
 | 
						|
    case .image:
 | 
						|
      return [.photo, .alternatePhoto, .fullSizePhoto].contains(type)
 | 
						|
    case .video:
 | 
						|
      return [.video, .fullSizeVideo, .fullSizePairedVideo].contains(type)
 | 
						|
    default:
 | 
						|
      return false
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  private func isFullSizeResourceType(_ type: PHAssetResourceType) -> Bool {
 | 
						|
    switch mediaType {
 | 
						|
    case .image:
 | 
						|
      return type == .fullSizePhoto
 | 
						|
    case .video:
 | 
						|
      return type == .fullSizeVideo
 | 
						|
    default:
 | 
						|
      return false
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |