mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 14:45:21 +00:00
[WIP] Multiple story upload
This commit is contained in:
@@ -391,6 +391,8 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
return .asset(asset)
|
||||
case let .draft(draft):
|
||||
return .draft(draft, nil)
|
||||
case let .assets(assets):
|
||||
return .assets(assets)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -451,7 +453,7 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
|
||||
if let customTarget, case .botPreview = customTarget {
|
||||
externalState.storyTarget = customTarget
|
||||
self.proceedWithStoryUpload(target: customTarget, result: result, existingMedia: nil, forwardInfo: nil, externalState: externalState, commit: commit)
|
||||
self.proceedWithStoryUpload(target: customTarget, results: [result], existingMedia: nil, forwardInfo: nil, externalState: externalState, commit: commit)
|
||||
|
||||
dismissCameraImpl?()
|
||||
return
|
||||
@@ -484,7 +486,7 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
externalState.isPeerArchived = channel.storiesHidden ?? false
|
||||
}
|
||||
|
||||
self.proceedWithStoryUpload(target: target, result: result, existingMedia: nil, forwardInfo: nil, externalState: externalState, commit: commit)
|
||||
self.proceedWithStoryUpload(target: target, results: [result], existingMedia: nil, forwardInfo: nil, externalState: externalState, commit: commit)
|
||||
|
||||
dismissCameraImpl?()
|
||||
})
|
||||
@@ -548,8 +550,8 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
})
|
||||
}
|
||||
|
||||
public func proceedWithStoryUpload(target: Stories.PendingTarget, result: MediaEditorScreenResult, existingMedia: EngineMedia?, forwardInfo: Stories.PendingForwardInfo?, externalState: MediaEditorTransitionOutExternalState, commit: @escaping (@escaping () -> Void) -> Void) {
|
||||
guard let result = result as? MediaEditorScreenImpl.Result else {
|
||||
public func proceedWithStoryUpload(target: Stories.PendingTarget, results: [MediaEditorScreenResult], existingMedia: EngineMedia?, forwardInfo: Stories.PendingForwardInfo?, externalState: MediaEditorTransitionOutExternalState, commit: @escaping (@escaping () -> Void) -> Void) {
|
||||
guard let results = results as? [MediaEditorScreenImpl.Result] else {
|
||||
return
|
||||
}
|
||||
let context = self.context
|
||||
@@ -657,83 +659,85 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
|
||||
}
|
||||
|
||||
if let _ = self.chatListController as? ChatListControllerImpl {
|
||||
var media: EngineStoryInputMedia?
|
||||
|
||||
if let mediaResult = result.media {
|
||||
switch mediaResult {
|
||||
case let .image(image, dimensions):
|
||||
let tempFile = TempBox.shared.tempFile(fileName: "file")
|
||||
defer {
|
||||
TempBox.shared.dispose(tempFile)
|
||||
}
|
||||
if let imageData = compressImageToJPEG(image, quality: 0.7, tempFilePath: tempFile.path) {
|
||||
media = .image(dimensions: dimensions, data: imageData, stickers: result.stickers)
|
||||
}
|
||||
case let .video(content, firstFrameImage, values, duration, dimensions):
|
||||
let adjustments: VideoMediaResourceAdjustments
|
||||
if let valuesData = try? JSONEncoder().encode(values) {
|
||||
let data = MemoryBuffer(data: valuesData)
|
||||
let digest = MemoryBuffer(data: data.md5Digest())
|
||||
adjustments = VideoMediaResourceAdjustments(data: data, digest: digest, isStory: true)
|
||||
|
||||
let resource: TelegramMediaResource
|
||||
switch content {
|
||||
case let .imageFile(path):
|
||||
resource = LocalFileVideoMediaResource(randomId: Int64.random(in: .min ... .max), path: path, adjustments: adjustments)
|
||||
case let .videoFile(path):
|
||||
resource = LocalFileVideoMediaResource(randomId: Int64.random(in: .min ... .max), path: path, adjustments: adjustments)
|
||||
case let .asset(localIdentifier):
|
||||
resource = VideoLibraryMediaResource(localIdentifier: localIdentifier, conversion: .compress(adjustments))
|
||||
}
|
||||
for result in results {
|
||||
var media: EngineStoryInputMedia?
|
||||
|
||||
if let mediaResult = result.media {
|
||||
switch mediaResult {
|
||||
case let .image(image, dimensions):
|
||||
let tempFile = TempBox.shared.tempFile(fileName: "file")
|
||||
defer {
|
||||
TempBox.shared.dispose(tempFile)
|
||||
}
|
||||
let imageData = firstFrameImage.flatMap { compressImageToJPEG($0, quality: 0.6, tempFilePath: tempFile.path) }
|
||||
let firstFrameFile = imageData.flatMap { data -> TempBoxFile? in
|
||||
let file = TempBox.shared.tempFile(fileName: "image.jpg")
|
||||
if let _ = try? data.write(to: URL(fileURLWithPath: file.path)) {
|
||||
return file
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
if let imageData = compressImageToJPEG(image, quality: 0.7, tempFilePath: tempFile.path) {
|
||||
media = .image(dimensions: dimensions, data: imageData, stickers: result.stickers)
|
||||
}
|
||||
|
||||
var coverTime: Double?
|
||||
if let coverImageTimestamp = values.coverImageTimestamp {
|
||||
if let trimRange = values.videoTrimRange {
|
||||
coverTime = min(duration, coverImageTimestamp - trimRange.lowerBound)
|
||||
} else {
|
||||
coverTime = min(duration, coverImageTimestamp)
|
||||
case let .video(content, firstFrameImage, values, duration, dimensions):
|
||||
let adjustments: VideoMediaResourceAdjustments
|
||||
if let valuesData = try? JSONEncoder().encode(values) {
|
||||
let data = MemoryBuffer(data: valuesData)
|
||||
let digest = MemoryBuffer(data: data.md5Digest())
|
||||
adjustments = VideoMediaResourceAdjustments(data: data, digest: digest, isStory: true)
|
||||
|
||||
let resource: TelegramMediaResource
|
||||
switch content {
|
||||
case let .imageFile(path):
|
||||
resource = LocalFileVideoMediaResource(randomId: Int64.random(in: .min ... .max), path: path, adjustments: adjustments)
|
||||
case let .videoFile(path):
|
||||
resource = LocalFileVideoMediaResource(randomId: Int64.random(in: .min ... .max), path: path, adjustments: adjustments)
|
||||
case let .asset(localIdentifier):
|
||||
resource = VideoLibraryMediaResource(localIdentifier: localIdentifier, conversion: .compress(adjustments))
|
||||
}
|
||||
let tempFile = TempBox.shared.tempFile(fileName: "file")
|
||||
defer {
|
||||
TempBox.shared.dispose(tempFile)
|
||||
}
|
||||
let imageData = firstFrameImage.flatMap { compressImageToJPEG($0, quality: 0.6, tempFilePath: tempFile.path) }
|
||||
let firstFrameFile = imageData.flatMap { data -> TempBoxFile? in
|
||||
let file = TempBox.shared.tempFile(fileName: "image.jpg")
|
||||
if let _ = try? data.write(to: URL(fileURLWithPath: file.path)) {
|
||||
return file
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
var coverTime: Double?
|
||||
if let coverImageTimestamp = values.coverImageTimestamp {
|
||||
if let trimRange = values.videoTrimRange {
|
||||
coverTime = min(duration, coverImageTimestamp - trimRange.lowerBound)
|
||||
} else {
|
||||
coverTime = min(duration, coverImageTimestamp)
|
||||
}
|
||||
}
|
||||
|
||||
media = .video(dimensions: dimensions, duration: duration, resource: resource, firstFrameFile: firstFrameFile, stickers: result.stickers, coverTime: coverTime)
|
||||
}
|
||||
|
||||
media = .video(dimensions: dimensions, duration: duration, resource: resource, firstFrameFile: firstFrameFile, stickers: result.stickers, coverTime: coverTime)
|
||||
default:
|
||||
break
|
||||
}
|
||||
default:
|
||||
break
|
||||
} else if let existingMedia {
|
||||
media = .existing(media: existingMedia._asMedia())
|
||||
}
|
||||
|
||||
if let media {
|
||||
let _ = (context.engine.messages.uploadStory(
|
||||
target: target,
|
||||
media: media,
|
||||
mediaAreas: result.mediaAreas,
|
||||
text: result.caption.string,
|
||||
entities: generateChatInputTextEntities(result.caption),
|
||||
pin: result.options.pin,
|
||||
privacy: result.options.privacy,
|
||||
isForwardingDisabled: result.options.isForwardingDisabled,
|
||||
period: result.options.timeout,
|
||||
randomId: result.randomId,
|
||||
forwardInfo: forwardInfo
|
||||
)
|
||||
|> deliverOnMainQueue).startStandalone(next: { stableId in
|
||||
moveStorySource(engine: context.engine, peerId: context.account.peerId, from: result.randomId, to: Int64(stableId))
|
||||
})
|
||||
}
|
||||
} else if let existingMedia {
|
||||
media = .existing(media: existingMedia._asMedia())
|
||||
}
|
||||
|
||||
if let media {
|
||||
let _ = (context.engine.messages.uploadStory(
|
||||
target: target,
|
||||
media: media,
|
||||
mediaAreas: result.mediaAreas,
|
||||
text: result.caption.string,
|
||||
entities: generateChatInputTextEntities(result.caption),
|
||||
pin: result.options.pin,
|
||||
privacy: result.options.privacy,
|
||||
isForwardingDisabled: result.options.isForwardingDisabled,
|
||||
period: result.options.timeout,
|
||||
randomId: result.randomId,
|
||||
forwardInfo: forwardInfo
|
||||
)
|
||||
|> deliverOnMainQueue).startStandalone(next: { stableId in
|
||||
moveStorySource(engine: context.engine, peerId: context.account.peerId, from: result.randomId, to: Int64(stableId))
|
||||
})
|
||||
}
|
||||
completionImpl()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user