Skip to content

Commit

Permalink
Import Audio Scripture Burrito (#1156)
Browse files Browse the repository at this point in the history
* wip

* Update ScriptureBurritoUtils.kt

* Fix Burrito Export

* Import Burrito via conversion to RC

* Update OratureFileFormat.kt

* Update OratureFileFormat.kt

* cleanup

* wrap input streams in use blocks to close after transfer

* More fixes

* Update TestPersistenceComponent.kt

* Update TestPersistenceComponent.kt
  • Loading branch information
jsarabia authored Jul 1, 2024
1 parent 3eb36c4 commit 5e82a9b
Show file tree
Hide file tree
Showing 11 changed files with 584 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.wycliffeassociates.otter.common.data

enum class ScriptureBurritoFileFormat(val extension: String) {
BURRITO("burrito"),
ZIP("zip");

companion object {
val extensionList: List<String> = entries.map { it.extension }

fun isSupported(extension: String) = extension.lowercase() in extensionList
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import io.reactivex.schedulers.Schedulers
import org.slf4j.LoggerFactory
import org.wycliffeassociates.otter.common.data.primitives.Language
import org.wycliffeassociates.otter.common.data.primitives.ResourceMetadata
import org.wycliffeassociates.otter.common.domain.project.importer.BurritoImporterFactory
import org.wycliffeassociates.otter.common.domain.project.importer.IProjectImporter
import org.wycliffeassociates.otter.common.domain.project.importer.IProjectImporterFactory
import org.wycliffeassociates.otter.common.domain.project.importer.ImportOptions
Expand All @@ -49,6 +50,9 @@ const val SOURCE_PATH_TEMPLATE = "content/%s.zip"

class ImportProjectUseCase @Inject constructor() {

@Inject
lateinit var burritoFactoryProvider: BurritoImporterFactory

@Inject
lateinit var rcFactoryProvider: RCImporterFactory

Expand Down Expand Up @@ -141,6 +145,7 @@ class ImportProjectUseCase @Inject constructor() {
*/
private fun getImporter(format: ProjectFormat): IProjectImporter {
val factory: IProjectImporterFactory = when(format) {
ProjectFormat.SCRIPTURE_BURRITO -> burritoFactoryProvider
ProjectFormat.RESOURCE_CONTAINER -> rcFactoryProvider
ProjectFormat.TSTUDIO -> tsFactoryProvider
else -> throw Exception("Unsupported project format.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package org.wycliffeassociates.otter.common.domain.project

enum class ProjectFormat {
SCRIPTURE_BURRITO,
RESOURCE_CONTAINER,
TSTUDIO,
EPUB
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
*/
package org.wycliffeassociates.otter.common.domain.project

import org.bibletranslationtools.scriptureburrito.container.BurritoContainer
import org.wycliffeassociates.otter.common.domain.resourcecontainer.burrito.BurritoToResourceContainerConverter
import org.wycliffeassociates.resourcecontainer.ResourceContainer
import org.wycliffeassociates.tstudio2rc.Tstudio2RcConverter
import java.io.File
Expand All @@ -32,7 +34,10 @@ object ProjectFormatIdentifier {
// set up the chains for identifying the project format
val orature = OratureFileIdentifier()
val tstudio = TstudioFileIdentifier()
val burrito = ScriptureBurritoFileIdentifier()

orature.next = tstudio
tstudio.next = burrito

return orature
}
Expand Down Expand Up @@ -82,4 +87,17 @@ object ProjectFormatIdentifier {
}
}
}

private class ScriptureBurritoFileIdentifier : IFormatIdentifier {
override var next: IFormatIdentifier? = null

override fun getFormat(file: File): ProjectFormat? {
return try {
BurritoContainer.load(file).close()
ProjectFormat.SCRIPTURE_BURRITO
} catch (e: Exception) {
next?.getFormat(file)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.wycliffeassociates.otter.common.domain.project.importer

import io.reactivex.Single
import io.reactivex.schedulers.Schedulers
import org.wycliffeassociates.otter.common.domain.resourcecontainer.ImportResult
import org.wycliffeassociates.otter.common.domain.resourcecontainer.burrito.BurritoToResourceContainerConverter
import org.wycliffeassociates.otter.common.persistence.IDirectoryProvider
import java.io.File
import javax.inject.Inject

class BurritoImporter @Inject constructor(
private val directoryProvider: IDirectoryProvider,
private val converter: BurritoToResourceContainerConverter,
): IProjectImporter {

private var next: RCImporter? = null

override fun import(
burrito: File,
callback: ProjectImporterCallback?,
options: ImportOptions?
): Single<ImportResult> {
return Single
.fromCallable {
callback?.onNotifyProgress(
localizeKey = "converting_file",
percent = 10.0
)
val tempRc = directoryProvider.createTempFile("burrito_converted_rc", ".zip")
converter.convert(burrito, tempRc)
tempRc
}
.flatMap { fileToImport ->
next?.import(fileToImport, callback, options)
?: Single.just(ImportResult.FAILED)
}
.subscribeOn(Schedulers.io())
}

fun setNext(next: RCImporter) {
this.next = next
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.wycliffeassociates.otter.common.domain.project.importer

import javax.inject.Inject
import javax.inject.Provider

class BurritoImporterFactory @Inject constructor() : IProjectImporterFactory {

@Inject lateinit var burritoImporter: Provider<BurritoImporter>
@Inject lateinit var existingProjectImporter: Provider<ExistingSourceImporter>
@Inject lateinit var newSourceImporter: Provider<NewSourceImporter>

private val importer: BurritoImporter by lazy {
val importer1 = burritoImporter.get()
val importer2 = existingProjectImporter.get()
val importer3 = newSourceImporter.get()

importer1.setNext(importer2)
importer2.setNext(importer3)

importer1
}

override fun makeImporter(): IProjectImporter = importer
}
Loading

0 comments on commit 5e82a9b

Please sign in to comment.