74 lines
2.3 KiB
Swift
74 lines
2.3 KiB
Swift
//
|
|
// VideoThumbnail.swift
|
|
// MattermostShare
|
|
//
|
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
//
|
|
|
|
import SwiftUI
|
|
import AVKit
|
|
import AVFoundation
|
|
|
|
func getThumbnailFrom(path: URL) -> UIImage? {
|
|
do {
|
|
let asset = AVURLAsset(url: path, options: nil)
|
|
let imgGenerator = AVAssetImageGenerator(asset: asset)
|
|
imgGenerator.appliesPreferredTrackTransform = true
|
|
imgGenerator.maximumSize = CGSize(width: 180, height: 180)
|
|
let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(value: 0, timescale: 1), actualTime: nil)
|
|
let thumbnail = UIImage(cgImage: cgImage)
|
|
return thumbnail
|
|
} catch let error {
|
|
print("*** Error generating thumbnail: \(error.localizedDescription)")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
struct VideoThumbnail: View {
|
|
var small = false
|
|
var attachment: AttachmentModel
|
|
var hasError: Bool
|
|
|
|
var body: some View {
|
|
let thumb = getThumbnailFrom(path: attachment.fileUrl)
|
|
if (thumb != nil) {
|
|
let borderColor = Color.theme.centerChannelColor.opacity(0.16)
|
|
ZStack {
|
|
Image(uiImage: thumb!)
|
|
.resizable()
|
|
.aspectRatio(contentMode: small ? .fill : .fit)
|
|
.frame(width: small ? 64 : nil, height: small ? 64 : 180)
|
|
.clipped()
|
|
.cornerRadius(4)
|
|
.overlay(
|
|
RoundedRectangle(cornerRadius: 4)
|
|
.fill(LinearGradient(
|
|
gradient: Gradient(
|
|
stops: [
|
|
Gradient.Stop(color: Color(red: 0, green: 0, blue: 0, opacity: 0.24), location: 0.125),
|
|
Gradient.Stop(color: Color(red: 0, green: 0, blue: 0, opacity: 0.0), location: 0.4755)
|
|
]),
|
|
startPoint: .topTrailing, endPoint: .bottomLeading))
|
|
)
|
|
}
|
|
.background(Color.theme.centerChannelBg)
|
|
.overlay(
|
|
ZStack {
|
|
RoundedRectangle(cornerRadius: 4)
|
|
.stroke(hasError ? Color.theme.errorTextColor : borderColor, lineWidth: 1)
|
|
FontIcon.text(
|
|
FontCode.compassIcons(code: .play),
|
|
fontsize: 24,
|
|
color: .white
|
|
)
|
|
.padding(.trailing, 6)
|
|
.padding(.bottom, 6)
|
|
.frame(
|
|
height: small ? 64 : 180,
|
|
alignment: .bottomTrailing)
|
|
}
|
|
)
|
|
}
|
|
}
|
|
}
|