
Shared Compose-based UI and structured per-target source sets for reusable app code, plus a native app entry point and simple build/run instructions.
Uma biblioteca multiplataforma Kotlin para manipulação de áudio e vĂdeo, disponĂvel para Android e iOS.
Frigg Ă© uma figura da mitologia nĂłrdica, sendo a principal deusa, esposa de Odin e deusa do amor, casamento, maternidade e lar. Assim como Frigg cuida e protege o lar, esta biblioteca foi criada para fornecer ferramentas confiáveis e cuidadosas para a manipulação de mĂdia em suas aplicações multiplataforma.
Frigg Ă© uma biblioteca Kotlin Multiplatform que oferece utilitários para manipulação de áudio e vĂdeo. Desenvolvida com foco em performance, confiabilidade e facilidade de uso, Frigg permite que vocĂŞ trabalhe com mĂdia de forma consistente em diferentes plataformas.
Result<String> do Kotlin para tratamento de errosResult<String> do KotlinAdicione o repositĂłrio Maven Central no seu build.gradle.kts:
repositories {
mavenCentral()
}Adicione a dependĂŞncia:
dependencies {
implementation("io.github.cardosofgui:frigg:1.1.0")
}repositories {
mavenCentral()
}
dependencies {
implementation 'io.github.cardosofgui:frigg:1.1.0'
}No Android, vocĂŞ precisa inicializar a biblioteca no Application ou Activity:
import android.app.Application
import com.br.frigg.FriggConverter
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
FriggConverter.initialize(this)
}
}import com.br.frigg.FriggConverter
suspend fun convertAudio() {
val converter = FriggConverter()
val wavPath = "/path/to/audio.wav"
val result = converter.convertWavToMp3(wavPath, bitrate = 128)
result.onSuccess { mp3Path ->
println("ConversĂŁo bem-sucedida! MP3 salvo em: $mp3Path")
}.onFailure { exception ->
println("Erro na conversĂŁo: ${exception.message}")
exception.printStackTrace()
}
}import com.br.frigg.FriggConverter
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
fun convertAudioFile(wavPath: String) {
val converter = FriggConverter()
CoroutineScope(Dispatchers.IO).launch {
val result = converter.convertWavToMp3(
wavPath = wavPath,
bitrate = 192 // Qualidade maior
)
result.onSuccess { mp3Path ->
// Arquivo MP3 criado com sucesso
// Faça algo com o arquivo MP3
}.onFailure { exception ->
// Trate o erro
when (exception) {
is com.br.frigg.FileNotFoundException -> {
// Arquivo nĂŁo encontrado
}
is com.br.frigg.InvalidFileException -> {
// Arquivo inválido ou corrompido
}
is com.br.frigg.StorageException -> {
// Espaço insuficiente em disco
}
else -> {
// Outros erros
}
}
}
}
}import com.br.frigg.FriggConverter
suspend fun convertWithFallback(wavPath: String): String {
val converter = FriggConverter()
return converter.convertWavToMp3(wavPath)
.getOrElse { exception ->
// Tratamento de erro personalizado
throw exception
}
}import com.br.frigg.FriggConverter
suspend fun convertWithFold(wavPath: String): String {
val converter = FriggConverter()
return converter.convertWavToMp3(wavPath).fold(
onSuccess = { mp3Path -> mp3Path },
onFailure = { exception ->
throw exception
}
)
}Frigg utiliza um sistema completo de exceções tipadas que permite tratamento especĂfico de diferentes tipos de erros:
FriggException (classe base)
├── StorageException
├── WritePermissionException
├── InvalidFileException
├── FileNotFoundException
├── ReadPermissionException
├── DirectoryCreationException
├── NativeLibraryException
├── ConversionException
├── EmptyFileException
└── UnknownFriggExceptionimport com.br.frigg.*
import com.br.frigg.FriggConverter
suspend fun convertWithDetailedErrorHandling(wavPath: String) {
val converter = FriggConverter()
converter.convertWavToMp3(wavPath).onFailure { exception ->
when (exception) {
is FileNotFoundException -> {
println("Arquivo nĂŁo encontrado: ${exception.filePath}")
}
is ReadPermissionException -> {
println("Sem permissĂŁo para ler: ${exception.filePath}")
}
is InvalidFileException -> {
println("Arquivo inválido: ${exception.filePath}")
println("Motivo: ${exception.reason}")
}
is StorageException -> {
println("Espaço insuficiente")
println("DisponĂvel: ${exception.availableSpace} bytes")
println("Necessário: ${exception.requiredSpace} bytes")
}
is WritePermissionException -> {
println("Sem permissĂŁo para escrever em: ${exception.path}")
}
is DirectoryCreationException -> {
println("Erro ao criar diretĂłrio: ${exception.directoryPath}")
}
is NativeLibraryException -> {
println("Erro ao carregar biblioteca nativa: ${exception.libraryName}")
}
is ConversionException -> {
println("Erro na conversĂŁo")
println("WAV: ${exception.wavPath}")
println("MP3: ${exception.mp3Path}")
}
is EmptyFileException -> {
println("Arquivo MP3 vazio: ${exception.filePath}")
}
is UnknownFriggException -> {
println("Erro desconhecido: ${exception.message}")
exception.cause?.printStackTrace()
}
else -> {
println("Erro inesperado: ${exception.message}")
}
}
}
}Classe principal para conversão de áudio.
Converte um arquivo WAV para MP3.
Parâmetros:
wavPath: Caminho completo para o arquivo WAV de entradabitrate: Taxa de bits do MP3 de saĂda (padrĂŁo: 128 kbps)Retorno:
Result.success(mp3Path: String): Conversão bem-sucedida, retorna o caminho do arquivo MP3 criadoResult.failure(exception: FriggException): Erro na conversão, contém uma exceção tipadaRequisitos do arquivo WAV:
.wav
Android:
initialize(context: Context) deve ser chamado antes do usoClasse base para todas as exceções do módulo Frigg.
open class FriggException(
message: String,
cause: Throwable? = null
) : Exception(message, cause)Lançada quando não há espaço suficiente em disco.
open class StorageException(
message: String,
val availableSpace: Long,
val requiredSpace: Long,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando não há permissão para escrever no diretório de destino.
open class WritePermissionException(
message: String,
val path: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando o arquivo WAV é inválido, corrompido ou em formato não suportado.
open class InvalidFileException(
message: String,
val filePath: String,
val reason: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando o arquivo WAV não foi encontrado.
open class FileNotFoundException(
message: String,
val filePath: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando não há permissão para ler o arquivo WAV.
open class ReadPermissionException(
message: String,
val filePath: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando nĂŁo Ă© possĂvel criar o diretĂłrio de saĂda.
open class DirectoryCreationException(
message: String,
val directoryPath: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando há erro ao carregar a biblioteca nativa.
open class NativeLibraryException(
message: String,
val libraryName: String? = null,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando a conversão nativa falha.
open class ConversionException(
message: String,
val wavPath: String,
val mp3Path: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando o arquivo MP3 foi criado mas está vazio ou não foi criado.
open class EmptyFileException(
message: String,
val filePath: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada para erros não mapeados.
open class UnknownFriggException(
message: String,
override val cause: Throwable
) : FriggException(message, cause)Frigg utiliza a arquitetura expect/actual do Kotlin Multiplatform:
frigg/
├── src/
│ ├── commonMain/ # Código compartilhado
│ │ └── kotlin/
│ │ └── com/br/frigg/
│ │ ├── FriggConverter.kt # expect class
│ │ └── FriggException.kt # Sistema de exceções
│ ├── androidMain/ # Implementação Android
│ │ └── kotlin/
│ │ └── com/br/frigg/
│ │ └── FriggConverter.android.kt # actual class
│ └── iosMain/ # Implementação iOS
│ └── kotlin/
│ └── com/br/frigg/
│ └── FriggConverter.ios.kt # actual class
Este projeto está licenciado sob a Licença GPL-2.0 - veja o arquivo LICENSE para detalhes.
Contribuições são bem-vindas! Sinta-se à vontade para:
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Guilherme Cardoso
Feito com ❤️ usando Kotlin Multiplatform
Uma biblioteca multiplataforma Kotlin para manipulação de áudio e vĂdeo, disponĂvel para Android e iOS.
Frigg Ă© uma figura da mitologia nĂłrdica, sendo a principal deusa, esposa de Odin e deusa do amor, casamento, maternidade e lar. Assim como Frigg cuida e protege o lar, esta biblioteca foi criada para fornecer ferramentas confiáveis e cuidadosas para a manipulação de mĂdia em suas aplicações multiplataforma.
Frigg Ă© uma biblioteca Kotlin Multiplatform que oferece utilitários para manipulação de áudio e vĂdeo. Desenvolvida com foco em performance, confiabilidade e facilidade de uso, Frigg permite que vocĂŞ trabalhe com mĂdia de forma consistente em diferentes plataformas.
Result<String> do Kotlin para tratamento de errosResult<String> do KotlinAdicione o repositĂłrio Maven Central no seu build.gradle.kts:
repositories {
mavenCentral()
}Adicione a dependĂŞncia:
dependencies {
implementation("io.github.cardosofgui:frigg:1.1.0")
}repositories {
mavenCentral()
}
dependencies {
implementation 'io.github.cardosofgui:frigg:1.1.0'
}No Android, vocĂŞ precisa inicializar a biblioteca no Application ou Activity:
import android.app.Application
import com.br.frigg.FriggConverter
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
FriggConverter.initialize(this)
}
}import com.br.frigg.FriggConverter
suspend fun convertAudio() {
val converter = FriggConverter()
val wavPath = "/path/to/audio.wav"
val result = converter.convertWavToMp3(wavPath, bitrate = 128)
result.onSuccess { mp3Path ->
println("ConversĂŁo bem-sucedida! MP3 salvo em: $mp3Path")
}.onFailure { exception ->
println("Erro na conversĂŁo: ${exception.message}")
exception.printStackTrace()
}
}import com.br.frigg.FriggConverter
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
fun convertAudioFile(wavPath: String) {
val converter = FriggConverter()
CoroutineScope(Dispatchers.IO).launch {
val result = converter.convertWavToMp3(
wavPath = wavPath,
bitrate = 192 // Qualidade maior
)
result.onSuccess { mp3Path ->
// Arquivo MP3 criado com sucesso
// Faça algo com o arquivo MP3
}.onFailure { exception ->
// Trate o erro
when (exception) {
is com.br.frigg.FileNotFoundException -> {
// Arquivo nĂŁo encontrado
}
is com.br.frigg.InvalidFileException -> {
// Arquivo inválido ou corrompido
}
is com.br.frigg.StorageException -> {
// Espaço insuficiente em disco
}
else -> {
// Outros erros
}
}
}
}
}import com.br.frigg.FriggConverter
suspend fun convertWithFallback(wavPath: String): String {
val converter = FriggConverter()
return converter.convertWavToMp3(wavPath)
.getOrElse { exception ->
// Tratamento de erro personalizado
throw exception
}
}import com.br.frigg.FriggConverter
suspend fun convertWithFold(wavPath: String): String {
val converter = FriggConverter()
return converter.convertWavToMp3(wavPath).fold(
onSuccess = { mp3Path -> mp3Path },
onFailure = { exception ->
throw exception
}
)
}Frigg utiliza um sistema completo de exceções tipadas que permite tratamento especĂfico de diferentes tipos de erros:
FriggException (classe base)
├── StorageException
├── WritePermissionException
├── InvalidFileException
├── FileNotFoundException
├── ReadPermissionException
├── DirectoryCreationException
├── NativeLibraryException
├── ConversionException
├── EmptyFileException
└── UnknownFriggExceptionimport com.br.frigg.*
import com.br.frigg.FriggConverter
suspend fun convertWithDetailedErrorHandling(wavPath: String) {
val converter = FriggConverter()
converter.convertWavToMp3(wavPath).onFailure { exception ->
when (exception) {
is FileNotFoundException -> {
println("Arquivo nĂŁo encontrado: ${exception.filePath}")
}
is ReadPermissionException -> {
println("Sem permissĂŁo para ler: ${exception.filePath}")
}
is InvalidFileException -> {
println("Arquivo inválido: ${exception.filePath}")
println("Motivo: ${exception.reason}")
}
is StorageException -> {
println("Espaço insuficiente")
println("DisponĂvel: ${exception.availableSpace} bytes")
println("Necessário: ${exception.requiredSpace} bytes")
}
is WritePermissionException -> {
println("Sem permissĂŁo para escrever em: ${exception.path}")
}
is DirectoryCreationException -> {
println("Erro ao criar diretĂłrio: ${exception.directoryPath}")
}
is NativeLibraryException -> {
println("Erro ao carregar biblioteca nativa: ${exception.libraryName}")
}
is ConversionException -> {
println("Erro na conversĂŁo")
println("WAV: ${exception.wavPath}")
println("MP3: ${exception.mp3Path}")
}
is EmptyFileException -> {
println("Arquivo MP3 vazio: ${exception.filePath}")
}
is UnknownFriggException -> {
println("Erro desconhecido: ${exception.message}")
exception.cause?.printStackTrace()
}
else -> {
println("Erro inesperado: ${exception.message}")
}
}
}
}Classe principal para conversão de áudio.
Converte um arquivo WAV para MP3.
Parâmetros:
wavPath: Caminho completo para o arquivo WAV de entradabitrate: Taxa de bits do MP3 de saĂda (padrĂŁo: 128 kbps)Retorno:
Result.success(mp3Path: String): Conversão bem-sucedida, retorna o caminho do arquivo MP3 criadoResult.failure(exception: FriggException): Erro na conversão, contém uma exceção tipadaRequisitos do arquivo WAV:
.wav
Android:
initialize(context: Context) deve ser chamado antes do usoClasse base para todas as exceções do módulo Frigg.
open class FriggException(
message: String,
cause: Throwable? = null
) : Exception(message, cause)Lançada quando não há espaço suficiente em disco.
open class StorageException(
message: String,
val availableSpace: Long,
val requiredSpace: Long,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando não há permissão para escrever no diretório de destino.
open class WritePermissionException(
message: String,
val path: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando o arquivo WAV é inválido, corrompido ou em formato não suportado.
open class InvalidFileException(
message: String,
val filePath: String,
val reason: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando o arquivo WAV não foi encontrado.
open class FileNotFoundException(
message: String,
val filePath: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando não há permissão para ler o arquivo WAV.
open class ReadPermissionException(
message: String,
val filePath: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando nĂŁo Ă© possĂvel criar o diretĂłrio de saĂda.
open class DirectoryCreationException(
message: String,
val directoryPath: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando há erro ao carregar a biblioteca nativa.
open class NativeLibraryException(
message: String,
val libraryName: String? = null,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando a conversão nativa falha.
open class ConversionException(
message: String,
val wavPath: String,
val mp3Path: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada quando o arquivo MP3 foi criado mas está vazio ou não foi criado.
open class EmptyFileException(
message: String,
val filePath: String,
cause: Throwable? = null
) : FriggException(message, cause)Lançada para erros não mapeados.
open class UnknownFriggException(
message: String,
override val cause: Throwable
) : FriggException(message, cause)Frigg utiliza a arquitetura expect/actual do Kotlin Multiplatform:
frigg/
├── src/
│ ├── commonMain/ # Código compartilhado
│ │ └── kotlin/
│ │ └── com/br/frigg/
│ │ ├── FriggConverter.kt # expect class
│ │ └── FriggException.kt # Sistema de exceções
│ ├── androidMain/ # Implementação Android
│ │ └── kotlin/
│ │ └── com/br/frigg/
│ │ └── FriggConverter.android.kt # actual class
│ └── iosMain/ # Implementação iOS
│ └── kotlin/
│ └── com/br/frigg/
│ └── FriggConverter.ios.kt # actual class
Este projeto está licenciado sob a Licença GPL-2.0 - veja o arquivo LICENSE para detalhes.
Contribuições são bem-vindas! Sinta-se à vontade para:
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Guilherme Cardoso
Feito com ❤️ usando Kotlin Multiplatform