Rename to SleepyOwl, add logo

This commit is contained in:
2026-10-25 00:53:19 +03:00
parent 33643707f1
commit f63b09a9d3
130 changed files with 8010 additions and 7797 deletions

View File

@@ -3,7 +3,7 @@ plugins {
}
android {
namespace = "ru.stenfredd.movies.playback.api"
namespace = "ru.stenfredd.sleepyowl.playback.api"
compileSdk = 37
defaultConfig { minSdk = 26 }
compileOptions {

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.api
package ru.stenfredd.sleepyowl.playback.api
import android.media.AudioFormat

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.api
package ru.stenfredd.sleepyowl.playback.api
/** Snapshot of what the device can decode and output. Probed once by `:playback:core`. */
data class DeviceCapabilities(

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.api
package ru.stenfredd.sleepyowl.playback.api
import org.jellyfin.sdk.model.api.DeviceProfile
import org.jellyfin.sdk.model.api.MediaSourceInfo

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.api
package ru.stenfredd.sleepyowl.playback.api
import org.jellyfin.sdk.model.api.MediaSourceInfo
import org.jellyfin.sdk.model.api.MediaStream

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.api
package ru.stenfredd.sleepyowl.playback.api
import org.jellyfin.sdk.model.api.MediaSourceInfo
import org.jellyfin.sdk.model.api.PlayMethod

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.api
package ru.stenfredd.sleepyowl.playback.api
import android.widget.FrameLayout
import kotlinx.coroutines.flow.Flow

View File

@@ -5,7 +5,7 @@ plugins {
}
android {
namespace = "ru.stenfredd.movies.playback.core"
namespace = "ru.stenfredd.sleepyowl.playback.core"
compileSdk = 37
defaultConfig { minSdk = 26 }
compileOptions {

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.core
package ru.stenfredd.sleepyowl.playback.core
import android.content.Context
import android.hardware.display.DisplayManager
@@ -10,8 +10,8 @@ import android.media.MediaCodecList
import android.os.Build
import android.view.Display
import dagger.hilt.android.qualifiers.ApplicationContext
import ru.stenfredd.movies.playback.api.DecoderInfo
import ru.stenfredd.movies.playback.api.DeviceCapabilities
import ru.stenfredd.sleepyowl.playback.api.DecoderInfo
import ru.stenfredd.sleepyowl.playback.api.DeviceCapabilities
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton

View File

@@ -1,12 +1,12 @@
package ru.stenfredd.movies.playback.core
package ru.stenfredd.sleepyowl.playback.core
import org.jellyfin.sdk.model.api.MediaSourceInfo
import ru.stenfredd.movies.playback.api.DeviceCapabilities
import ru.stenfredd.movies.playback.api.EngineId
import ru.stenfredd.movies.playback.api.EngineProvider
import ru.stenfredd.movies.playback.api.Loss
import ru.stenfredd.movies.playback.api.StreamSelection
import ru.stenfredd.movies.playback.api.Verdict
import ru.stenfredd.sleepyowl.playback.api.DeviceCapabilities
import ru.stenfredd.sleepyowl.playback.api.EngineId
import ru.stenfredd.sleepyowl.playback.api.EngineProvider
import ru.stenfredd.sleepyowl.playback.api.Loss
import ru.stenfredd.sleepyowl.playback.api.StreamSelection
import ru.stenfredd.sleepyowl.playback.api.Verdict
import javax.inject.Inject
data class RankedEngine(val provider: EngineProvider, val verdict: Verdict)

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.core
package ru.stenfredd.sleepyowl.playback.core
import android.content.Context
import androidx.datastore.preferences.core.Preferences
@@ -12,9 +12,9 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import org.json.JSONObject
import ru.stenfredd.movies.core.jellyfin.JellyfinSession
import ru.stenfredd.movies.playback.api.SubtitleStyle
import ru.stenfredd.movies.playback.api.VideoPathSwitchable
import ru.stenfredd.sleepyowl.core.jellyfin.JellyfinSession
import ru.stenfredd.sleepyowl.playback.api.SubtitleStyle
import ru.stenfredd.sleepyowl.playback.api.VideoPathSwitchable
import timber.log.Timber
import java.util.UUID
import javax.inject.Inject

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.core
package ru.stenfredd.sleepyowl.playback.core
import android.net.Uri
import android.os.SystemClock
@@ -32,25 +32,25 @@ import org.jellyfin.sdk.model.api.PlaybackStartInfo
import org.jellyfin.sdk.model.api.PlaybackStopInfo
import org.jellyfin.sdk.model.api.RepeatMode
import org.jellyfin.sdk.model.api.SubtitleDeliveryMethod
import ru.stenfredd.movies.core.jellyfin.JellyfinSession
import ru.stenfredd.movies.playback.api.DolbyVisionSwitchable
import ru.stenfredd.movies.playback.api.EngineError
import ru.stenfredd.movies.playback.api.EngineEvent
import ru.stenfredd.movies.playback.api.EngineId
import ru.stenfredd.movies.playback.api.EngineProvider
import ru.stenfredd.movies.playback.api.EngineState
import ru.stenfredd.movies.playback.api.EngineStats
import ru.stenfredd.movies.playback.api.ExternalSubtitle
import ru.stenfredd.movies.playback.api.LoadRequest
import ru.stenfredd.movies.playback.api.PlaybackEngine
import ru.stenfredd.movies.playback.api.StreamSelection
import ru.stenfredd.movies.playback.api.SubtitleStyle
import ru.stenfredd.movies.playback.api.SubtitleStyleable
import ru.stenfredd.movies.playback.api.stream
import ru.stenfredd.movies.playback.api.streams
import ru.stenfredd.movies.playback.api.Verdict
import ru.stenfredd.movies.playback.api.VideoPathSwitchable
import ru.stenfredd.movies.playback.api.videoStream
import ru.stenfredd.sleepyowl.core.jellyfin.JellyfinSession
import ru.stenfredd.sleepyowl.playback.api.DolbyVisionSwitchable
import ru.stenfredd.sleepyowl.playback.api.EngineError
import ru.stenfredd.sleepyowl.playback.api.EngineEvent
import ru.stenfredd.sleepyowl.playback.api.EngineId
import ru.stenfredd.sleepyowl.playback.api.EngineProvider
import ru.stenfredd.sleepyowl.playback.api.EngineState
import ru.stenfredd.sleepyowl.playback.api.EngineStats
import ru.stenfredd.sleepyowl.playback.api.ExternalSubtitle
import ru.stenfredd.sleepyowl.playback.api.LoadRequest
import ru.stenfredd.sleepyowl.playback.api.PlaybackEngine
import ru.stenfredd.sleepyowl.playback.api.StreamSelection
import ru.stenfredd.sleepyowl.playback.api.SubtitleStyle
import ru.stenfredd.sleepyowl.playback.api.SubtitleStyleable
import ru.stenfredd.sleepyowl.playback.api.stream
import ru.stenfredd.sleepyowl.playback.api.streams
import ru.stenfredd.sleepyowl.playback.api.Verdict
import ru.stenfredd.sleepyowl.playback.api.VideoPathSwitchable
import ru.stenfredd.sleepyowl.playback.api.videoStream
import timber.log.Timber
import java.util.UUID
import javax.inject.Inject

View File

@@ -5,7 +5,7 @@ plugins {
}
android {
namespace = "ru.stenfredd.movies.playback.exo"
namespace = "ru.stenfredd.sleepyowl.playback.exo"
compileSdk = 37
defaultConfig { minSdk = 26 }
compileOptions {

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.exo.ps;
package ru.stenfredd.sleepyowl.playback.exo.ps;
import android.util.SparseArray;
import androidx.annotation.Nullable;

View File

@@ -16,7 +16,7 @@
* Modified for the Movies app (2026-10-13), copied from media3 1.11.1 androidx.media3.extractor.ts:
* see DvdPsExtractor for what changed.
*/
package ru.stenfredd.movies.playback.exo.ps;
package ru.stenfredd.sleepyowl.playback.exo.ps;
import static com.google.common.base.Preconditions.checkNotNull;

View File

@@ -16,7 +16,7 @@
* Modified for the Movies app (2026-10-13), copied from media3 1.11.1 androidx.media3.extractor.ts:
* see DvdPsExtractor for what changed.
*/
package ru.stenfredd.movies.playback.exo.ps;
package ru.stenfredd.sleepyowl.playback.exo.ps;
import static java.lang.Math.min;

View File

@@ -16,7 +16,7 @@
* Modified for the Movies app (2026-10-13), copied from media3 1.11.1 androidx.media3.extractor.ts:
* see DvdPsExtractor for what changed.
*/
package ru.stenfredd.movies.playback.exo.ps;
package ru.stenfredd.sleepyowl.playback.exo.ps;
import static java.lang.Math.min;

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.exo
package ru.stenfredd.sleepyowl.playback.exo
import androidx.media3.common.C
import androidx.media3.common.DataReader

View File

@@ -1,6 +1,6 @@
@file:OptIn(UnstableApi::class)
package ru.stenfredd.movies.playback.exo
package ru.stenfredd.sleepyowl.playback.exo
import android.content.Context
import android.content.res.Configuration
@@ -59,19 +59,19 @@ import org.jellyfin.sdk.model.api.MediaStreamType
import org.jellyfin.sdk.model.api.PlayMethod
import org.jellyfin.sdk.model.api.VideoRange
import org.jellyfin.sdk.model.api.VideoRangeType
import ru.stenfredd.movies.playback.api.Codecs
import ru.stenfredd.movies.playback.api.DolbyVisionSwitchable
import ru.stenfredd.movies.playback.api.EngineError
import ru.stenfredd.movies.playback.api.EngineEvent
import ru.stenfredd.movies.playback.api.EngineState
import ru.stenfredd.movies.playback.api.EngineStats
import ru.stenfredd.movies.playback.api.LoadRequest
import ru.stenfredd.movies.playback.api.PlaybackEngine
import ru.stenfredd.movies.playback.api.SubtitleStyle
import ru.stenfredd.movies.playback.api.SubtitleStyleable
import ru.stenfredd.movies.playback.api.VideoPathSwitchable
import ru.stenfredd.movies.playback.api.embeddedOrdinal
import ru.stenfredd.movies.playback.api.videoStream
import ru.stenfredd.sleepyowl.playback.api.Codecs
import ru.stenfredd.sleepyowl.playback.api.DolbyVisionSwitchable
import ru.stenfredd.sleepyowl.playback.api.EngineError
import ru.stenfredd.sleepyowl.playback.api.EngineEvent
import ru.stenfredd.sleepyowl.playback.api.EngineState
import ru.stenfredd.sleepyowl.playback.api.EngineStats
import ru.stenfredd.sleepyowl.playback.api.LoadRequest
import ru.stenfredd.sleepyowl.playback.api.PlaybackEngine
import ru.stenfredd.sleepyowl.playback.api.SubtitleStyle
import ru.stenfredd.sleepyowl.playback.api.SubtitleStyleable
import ru.stenfredd.sleepyowl.playback.api.VideoPathSwitchable
import ru.stenfredd.sleepyowl.playback.api.embeddedOrdinal
import ru.stenfredd.sleepyowl.playback.api.videoStream
import timber.log.Timber
class ExoEngine(context: Context) : PlaybackEngine, VideoPathSwitchable, DolbyVisionSwitchable, SubtitleStyleable {

View File

@@ -1,11 +1,11 @@
package ru.stenfredd.movies.playback.exo
package ru.stenfredd.sleepyowl.playback.exo
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet
import ru.stenfredd.movies.playback.api.EngineProvider
import ru.stenfredd.sleepyowl.playback.api.EngineProvider
@Module
@InstallIn(SingletonComponent::class)

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.exo
package ru.stenfredd.sleepyowl.playback.exo
import android.content.Context
import android.media.MediaCodecInfo.CodecProfileLevel
@@ -15,16 +15,16 @@ import org.jellyfin.sdk.model.api.ProfileConditionValue
import org.jellyfin.sdk.model.api.SubtitleDeliveryMethod
import org.jellyfin.sdk.model.api.VideoRangeType
import org.jellyfin.sdk.model.deviceprofile.buildDeviceProfile
import ru.stenfredd.movies.playback.api.Codecs
import ru.stenfredd.movies.playback.api.DeviceCapabilities
import ru.stenfredd.movies.playback.api.EngineId
import ru.stenfredd.movies.playback.api.EngineProvider
import ru.stenfredd.movies.playback.api.Loss
import ru.stenfredd.movies.playback.api.PlaybackEngine
import ru.stenfredd.movies.playback.api.StreamSelection
import ru.stenfredd.movies.playback.api.Verdict
import ru.stenfredd.movies.playback.api.stream
import ru.stenfredd.movies.playback.api.videoStream
import ru.stenfredd.sleepyowl.playback.api.Codecs
import ru.stenfredd.sleepyowl.playback.api.DeviceCapabilities
import ru.stenfredd.sleepyowl.playback.api.EngineId
import ru.stenfredd.sleepyowl.playback.api.EngineProvider
import ru.stenfredd.sleepyowl.playback.api.Loss
import ru.stenfredd.sleepyowl.playback.api.PlaybackEngine
import ru.stenfredd.sleepyowl.playback.api.StreamSelection
import ru.stenfredd.sleepyowl.playback.api.Verdict
import ru.stenfredd.sleepyowl.playback.api.stream
import ru.stenfredd.sleepyowl.playback.api.videoStream
import javax.inject.Inject
class ExoEngineProvider @Inject constructor(
@@ -145,7 +145,7 @@ class ExoEngineProvider @Inject constructor(
val avcHigh10 = device.hasHardwareProfile("video/avc", CodecProfileLevel.AVCProfileHigh10)
return buildDeviceProfile {
name = "Movies / ExoPlayer"
name = "SleepyOwl / ExoPlayer"
maxStreamingBitrate = MAX_BITRATE
maxStaticBitrate = MAX_BITRATE
directPlayProfile {

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.exo
package ru.stenfredd.sleepyowl.playback.exo
import androidx.media3.common.C
import androidx.media3.common.DataReader

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.exo
package ru.stenfredd.sleepyowl.playback.exo
import android.net.Uri
import androidx.media3.common.util.UnstableApi
@@ -13,7 +13,7 @@ import androidx.media3.extractor.avi.AviExtractor
import androidx.media3.extractor.mkv.MatroskaExtractor
import androidx.media3.extractor.text.SubtitleParser
import androidx.media3.extractor.ts.PsExtractor
import ru.stenfredd.movies.playback.exo.ps.DvdPsExtractor
import ru.stenfredd.sleepyowl.playback.exo.ps.DvdPsExtractor
import timber.log.Timber
/**

View File

@@ -5,7 +5,7 @@ plugins {
}
android {
namespace = "ru.stenfredd.movies.playback.vlc"
namespace = "ru.stenfredd.sleepyowl.playback.vlc"
compileSdk = 37
defaultConfig { minSdk = 26 }
compileOptions {

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.vlc
package ru.stenfredd.sleepyowl.playback.vlc
import android.os.SystemClock
import okhttp3.Call

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.vlc
package ru.stenfredd.sleepyowl.playback.vlc
import java.io.OutputStream
import java.util.TreeMap

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.vlc
package ru.stenfredd.sleepyowl.playback.vlc
import android.content.Context
import android.os.SystemClock
@@ -21,22 +21,22 @@ import org.videolan.libvlc.Media
import org.videolan.libvlc.MediaPlayer
import org.videolan.libvlc.interfaces.IMedia
import org.videolan.libvlc.util.VLCVideoLayout
import ru.stenfredd.movies.playback.api.AudioDelayCapable
import ru.stenfredd.movies.playback.api.Codecs
import ru.stenfredd.movies.playback.api.DeviceCapabilities
import ru.stenfredd.movies.playback.api.EngineError
import ru.stenfredd.movies.playback.api.EngineEvent
import ru.stenfredd.movies.playback.api.EngineState
import ru.stenfredd.movies.playback.api.EngineStats
import ru.stenfredd.movies.playback.api.LoadRequest
import ru.stenfredd.movies.playback.api.PlaybackEngine
import ru.stenfredd.movies.playback.api.SubtitleDelayCapable
import ru.stenfredd.movies.playback.api.SubtitleStyle
import ru.stenfredd.movies.playback.api.SubtitleStyleable
import ru.stenfredd.movies.playback.api.embeddedOrdinal
import ru.stenfredd.movies.playback.api.stream
import ru.stenfredd.movies.playback.api.streams
import ru.stenfredd.movies.playback.api.videoStream
import ru.stenfredd.sleepyowl.playback.api.AudioDelayCapable
import ru.stenfredd.sleepyowl.playback.api.Codecs
import ru.stenfredd.sleepyowl.playback.api.DeviceCapabilities
import ru.stenfredd.sleepyowl.playback.api.EngineError
import ru.stenfredd.sleepyowl.playback.api.EngineEvent
import ru.stenfredd.sleepyowl.playback.api.EngineState
import ru.stenfredd.sleepyowl.playback.api.EngineStats
import ru.stenfredd.sleepyowl.playback.api.LoadRequest
import ru.stenfredd.sleepyowl.playback.api.PlaybackEngine
import ru.stenfredd.sleepyowl.playback.api.SubtitleDelayCapable
import ru.stenfredd.sleepyowl.playback.api.SubtitleStyle
import ru.stenfredd.sleepyowl.playback.api.SubtitleStyleable
import ru.stenfredd.sleepyowl.playback.api.embeddedOrdinal
import ru.stenfredd.sleepyowl.playback.api.stream
import ru.stenfredd.sleepyowl.playback.api.streams
import ru.stenfredd.sleepyowl.playback.api.videoStream
import timber.log.Timber
/**

View File

@@ -1,11 +1,11 @@
package ru.stenfredd.movies.playback.vlc
package ru.stenfredd.sleepyowl.playback.vlc
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet
import ru.stenfredd.movies.playback.api.EngineProvider
import ru.stenfredd.sleepyowl.playback.api.EngineProvider
@Module
@InstallIn(SingletonComponent::class)

View File

@@ -1,4 +1,4 @@
package ru.stenfredd.movies.playback.vlc
package ru.stenfredd.sleepyowl.playback.vlc
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
@@ -11,15 +11,15 @@ import org.jellyfin.sdk.model.api.SubtitleDeliveryMethod
import org.jellyfin.sdk.model.api.VideoRange
import org.jellyfin.sdk.model.api.VideoRangeType
import org.jellyfin.sdk.model.deviceprofile.buildDeviceProfile
import ru.stenfredd.movies.playback.api.Codecs
import ru.stenfredd.movies.playback.api.DeviceCapabilities
import ru.stenfredd.movies.playback.api.EngineId
import ru.stenfredd.movies.playback.api.EngineProvider
import ru.stenfredd.movies.playback.api.Loss
import ru.stenfredd.movies.playback.api.PlaybackEngine
import ru.stenfredd.movies.playback.api.StreamSelection
import ru.stenfredd.movies.playback.api.Verdict
import ru.stenfredd.movies.playback.api.videoStream
import ru.stenfredd.sleepyowl.playback.api.Codecs
import ru.stenfredd.sleepyowl.playback.api.DeviceCapabilities
import ru.stenfredd.sleepyowl.playback.api.EngineId
import ru.stenfredd.sleepyowl.playback.api.EngineProvider
import ru.stenfredd.sleepyowl.playback.api.Loss
import ru.stenfredd.sleepyowl.playback.api.PlaybackEngine
import ru.stenfredd.sleepyowl.playback.api.StreamSelection
import ru.stenfredd.sleepyowl.playback.api.Verdict
import ru.stenfredd.sleepyowl.playback.api.videoStream
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
import javax.inject.Inject
@@ -68,7 +68,7 @@ class VlcEngineProvider @Inject constructor(
}
override fun deviceProfile(device: DeviceCapabilities): DeviceProfile = buildDeviceProfile {
name = "Movies / VLC"
name = "SleepyOwl / VLC"
maxStreamingBitrate = MAX_BITRATE
maxStaticBitrate = MAX_BITRATE
// libVLC demuxes and decodes practically anything: no container/codec restrictions.