29 |
30 | suspend fun getById(id: Int): Programme?
31 | suspend fun getProgrammeCurrently(channelId: Int): Programme?
32 | }
--------------------------------------------------------------------------------
/data/src/main/java/com/m3u/data/service/internal/Codecs.kt:
--------------------------------------------------------------------------------
1 | package com.m3u.data.service.internal
2 |
3 | import android.content.Context
4 | import android.graphics.Bitmap
5 | import android.net.Uri
6 | import androidx.media3.exoplayer.DefaultRenderersFactory
7 | import androidx.media3.exoplayer.RenderersFactory
8 | import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.NextRenderersFactory
9 | import io.github.anilbeesetti.nextlib.mediainfo.MediaInfoBuilder
10 |
11 | object Codecs {
12 | fun createRenderersFactory(context: Context): RenderersFactory {
13 | return NextRenderersFactory(context).apply {
14 | setEnableDecoderFallback(true)
15 | setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
16 | }
17 | }
18 |
19 | fun getThumbnail(context: Context, uri: Uri): Bitmap? {
20 | val mediaInfo = MediaInfoBuilder()
21 | .from(context, uri)
22 | .build()
23 | val frame = mediaInfo?.getFrame()
24 | mediaInfo?.release()
25 | return frame
26 | }
27 | }
--------------------------------------------------------------------------------
/data/src/main/java/com/m3u/data/service/internal/KodiAdaptions.kt:
--------------------------------------------------------------------------------
1 | package com.m3u.data.service.internal
2 |
3 | internal object KodiAdaptions {
4 | const val HTTP_OPTION_UA = "user-agent"
5 | }
--------------------------------------------------------------------------------
/data/src/main/res/drawable/baseline_notifications_none_24.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/data/src/main/res/drawable/round_cancel_24.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/data/src/main/res/drawable/round_file_download_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/data/src/main/res/drawable/round_refresh_24.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/full_description.txt:
--------------------------------------------------------------------------------
1 | M3U is a stream media player on Android devices. Android 8.0 and above supported.
2 |
Features:
3 |
4 | - M3U and M3U8 files.
5 | - HTTPS and RTMP stream.
6 | - Android TV.
7 |
8 | More to come.
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/featureGraphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/fastlane/metadata/android/en-US/images/featureGraphic.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/fastlane/metadata/android/en-US/images/icon.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/tvScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/fastlane/metadata/android/en-US/images/tvScreenshots/1.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/tvScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/fastlane/metadata/android/en-US/images/tvScreenshots/2.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/tvScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/fastlane/metadata/android/en-US/images/tvScreenshots/3.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | FREE stream media player for android.
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/title.txt:
--------------------------------------------------------------------------------
1 | M3U
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/full_description.txt:
--------------------------------------------------------------------------------
1 | M3U es un reproductor de streaming LIBRE para Android. Para Android 8.0 y posteriores.
2 |
Características:
3 |
4 | - Archivos M3U y M3U8.
5 | - Transmisión HTTPS y RTMP.
6 | - Android TV.
7 |
8 | Más en camino.
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/short_description.txt:
--------------------------------------------------------------------------------
1 | Reproductor de streaming LIBRE para Android.
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu Apr 03 22:02:28 CST 2025
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
5 | networkTimeout=10000
6 | validateDistributionUrl=true
7 | zipStoreBase=GRADLE_USER_HOME
8 | zipStorePath=wrapper/dists
9 |
--------------------------------------------------------------------------------
/i18n/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/i18n/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.com.android.library)
3 | alias(libs.plugins.org.jetbrains.kotlin.android)
4 | }
5 |
6 | android {
7 | namespace = "com.m3u.i18n"
8 | kotlinOptions {
9 | jvmTarget = "17"
10 | }
11 | }
12 |
13 | dependencies {
14 | implementation(libs.androidx.core.ktx)
15 | implementation(libs.androidx.appcompat)
16 | }
--------------------------------------------------------------------------------
/i18n/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/i18n/consumer-rules.pro
--------------------------------------------------------------------------------
/i18n/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/i18n/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-de-rDE/app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | App-Abstürze
4 | Kürzlich
5 | Spiele kürzlichen Stream
6 | unerreichbar
7 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-de-rDE/data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Datei nicht gefunden
4 | Playlist-Name ist leer
5 | Stream Download Service
6 | Stream Download Beschreibung
7 |
8 | Abbrechen
9 | Wiederholen
10 | Komplett (+%d)
11 | %d Kanäle wurden heruntergeladen
12 | %d Programme wurden heruntergeladen
13 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-de-rDE/feat_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Über das Projekt
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-de-rDE/feat_console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Konsolen Editor
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-de-rDE/feat_favourite.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | unbekannt
4 | Zufällige Wiedergabe
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-de-rDE/feat_foryou.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | versteckte Streams
4 | löschen
5 | URL kopieren
6 | umbenennen
7 | importiert
8 | Playlist hinzufügen
9 | Favorit, den Du erneut sehen möchtest
10 | mehr als %d Tage
11 | %d Tage
12 | %d Stunden
13 | Code vom Fernseher eingeben
14 | Stelle sicher, dass Du mit dem selben WLAN verbunden bist
15 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-de-rDE/feat_playlist.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | unbekannt
4 | like
5 | like entfernen
6 | verstecken
7 | speichern in der Galerie
8 | Verknüpfung erstellen
9 | Playlist existiert nicht (%s)
10 | Schlüsselwort eingeben
11 | Playlist URL existiert nicht
12 | Cover existiert nicht
13 | Stream existiert nicht
14 | speichere in (%s)
15 | hochscrollen
16 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-de-rDE/feat_playlist_configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Titel
4 | User-Agent
5 | aktiviere EPGs
6 | Synchronisiere EPG...
7 | Ablaufdatum: %s
8 | EPG ist veraltet, bitte erneut synchronisieren
9 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-de-rDE/ui.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | M3U
4 | Favoriten
5 | Einstellungen
6 |
7 | Home
8 | Favoriten
9 | Einstellungen
10 |
11 | unbekannter Fehler
12 | zurück
13 |
14 | ho
15 | la
16 |
17 | Sortieren
18 | A-Z
19 | Z-A
20 | Kürzlich
21 | nie gespielt
22 | Nicht spezifiziert
23 |
24 | Verbinden
25 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rES/app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | fallos de la app
4 | Reciente
5 | Reproduce la transmisión reciente
6 | no está disponible
7 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rES/data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | el archivo no fue encontrado
4 | la lista de reproducción no tiene nombre
5 | Servicio de descarga de transmisión
6 | Descripción de descarga de transmisión
7 |
8 | Cancelar
9 | Reintentar
10 | Completado (+%d)
11 | %d canales fueron descargados
12 | %d programas fueron descargados
13 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rES/feat_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | acerca del proyecto
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rES/feat_console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Console Editor
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rES/feat_favourite.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | desconocido
4 | reproducir aleatoriamente
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rES/feat_playlist_configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | título
4 | agente de usuario
5 | EPGs habilitadas
6 | sinc. programación
7 | cancelar sinc. programación
8 | Expira: %s
9 | la programación está desactualizada
10 | Autorefrescar programación
11 | Cuando se inicializa la app
12 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rMX/app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | errores de la app
4 | Reciente
5 | Reproduce la emisión reciente
6 | no disponible
7 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rMX/data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | no se encuentra el archivo
4 | playlist sin nombre
5 | Servicio de descarga de emisión
6 | Descripción de descarga de emisión
7 |
8 | Cancelar
9 | Reintentar
10 | Completado (+%d)
11 | %d canales se descargaron
12 | %d programas se descargaron
13 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rMX/feat_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | sobre el proyecto
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rMX/feat_console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Console Editor
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rMX/feat_favourite.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | desconocido
4 | reproducir al azar
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rMX/feat_playlist.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | desconocido
4 | añadir a favoritos
5 | quitar de favoritos
6 | ocultar
7 | guardar a álbum
8 | crear atajo
9 | la playlist no existe (%s)
10 | ingresa la palabra clave
11 | la url de la playlist no existe
12 | la carátula no existe
13 | la emisión no existe
14 | guardada a (%s)
15 | subir
16 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-es-rMX/feat_playlist_configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | título
4 | agente de usuario
5 | EPGs activadas
6 | sinc. programas
7 | cancelar sinc. programación
8 | Expiran: %s
9 | los programas está desactualizados
10 | Autorefrescar programas
11 | Cuando se inicia la app
12 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-id-rID/app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Aplikasi Tidak Berfungsi
4 | Baru saja
5 | Putar yang Baru Saja Diputar
6 | Tidak Tersedia
7 |
8 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-id-rID/data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | file tidak ditemukan
4 | Nama Playlist kosong
5 | Layanan Unduhan Streaming
6 | Deskripsi Layanan Unduhan Streaming
7 |
8 | Batal
9 | Coba Ulang
10 | Selesai (+%d)
11 | %d saluran telah diunduh
12 | %d program telah diunduh
13 |
14 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-id-rID/feat_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Tentang Projek
4 |
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-id-rID/feat_console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Editor Konsol
4 |
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-id-rID/feat_favourite.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Tidak diketahui
4 | Putar acak
5 |
6 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-id-rID/feat_playlist_configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Judul
4 | user agent
5 | EPG aktif
6 | sinkronkan program
7 | batalkan sinkronisasi program
8 | Kedaluwarsa: %s
9 | Cache program telah kedaluwarsa
10 | Muat ulang program otomatis
11 | Saat aplikasi dimulai
12 |
13 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-pt-rBR/app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Falhas do App
4 | Recentes
5 | Veja as streams recentes
6 | Indisponível
7 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-pt-rBR/data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Arquivo não encontrado
4 | O nome da playlist está vazio
5 | Serviço de download de streaming
6 | Descrição do download da stream
7 |
8 | Cancelar
9 | Tentar novamente
10 | %d Canais foram baixados
11 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-pt-rBR/feat_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Sobre o projeto
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-pt-rBR/feat_console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Editor de console
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-pt-rBR/feat_favourite.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Desconhecido
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-pt-rBR/feat_foryou.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Streams ocultas
4 | Cancelar inscrição
5 | Copiar url
6 | Renomear
7 | Importada
8 | Adicione uma playlist
9 | Favoritos que você veria novamente
10 | mais de %d dias
11 | %d dias
12 | %d horas
13 | Digite o código da TV
14 | Certifique-se de está conectado ao mesmo Wi-Fi
15 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-pt-rBR/feat_playlist.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Desconhecido
4 | Favoritar
5 | Desfavoritar
6 | Ocultar
7 | Salvar na galeria
8 | Criar um atalho
9 | A playlist não existe (%s)
10 | Insira a palavra-chave
11 | A URL da playlist não existe
12 | A capa não existe
13 | A stream não existe
14 | Salvo em (%s)
15 | Role para cima
16 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-pt-rBR/feat_playlist_configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Nome
4 | Agente de usuário
5 | EPGs habilitados
6 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-pt-rBR/ui.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | M3U
4 | Favoritos
5 | Configurações
6 |
7 | Para Você
8 | Favoritos
9 | Configurações
10 |
11 | Erro Desconhecido
12 | Voltar
13 |
14 | ho
15 | la
16 |
17 | Reordenar
18 | A-Z
19 | Z-A
20 | Recentes
21 | Não assistiu ainda
22 | Não especificado
23 |
24 | Conectar
25 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-ro-rRO/app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | erori aplicatie
4 | Recent
5 | Ruleaaz canale recente
6 | indisponibil
7 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-ro-rRO/data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | fisier inexistent
4 | nume lista necompletat
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-ro-rRO/feat_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | despre proiect
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-ro-rRO/feat_console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Editor Consola
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-ro-rRO/feat_favourite.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | necunoscut
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-ro-rRO/feat_foryou.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | streamuri ascunse
4 | dezabonare
5 | copie adresa lista
6 | redenumire
7 | importat
8 | adauga o lista
9 | favorite pe care le vei mai vedea
10 | mai mult de %d zile
11 | %d zile
12 | %d ore
13 | codul de pe TV
14 | Verificati sa fiti conectat la aceasi retea Wi-Fi
15 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-ro-rRO/feat_playlist.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | necunoscut
4 | favorit
5 | anulare favorit
6 | ascunde
7 | salvare in galerie
8 | creare scurtatura
9 | lista nu exista (%s)
10 | introdu cuvantul cautat
11 | adresa lista nu exista
12 | coperta nu exista
13 | canalul nu exista
14 | salvat in (%s)
15 | deruleazA sus
16 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-ro-rRO/ui.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | M3U
4 | Favorite
5 | Setari
6 |
7 | Pentru Tine
8 | Favorite
9 | Setari
10 |
11 | eroare necunoscuta
12 | inapoi
13 |
14 | stanga
15 | dreapta
16 |
17 | Aranjare
18 | A-Z
19 | Z-A
20 | recent
21 | niciodata rulat
22 | Nespecificat
23 |
24 | Conectare
25 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-tr-rTR/app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | uygulama çöktü
4 | Son İzlenen
5 | Son izlenen kanalı oynat
6 | kullanılamıyor
7 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-tr-rTR/data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Dosya bulunamadı
4 | Oynatma listesi adı boş
5 | Akış İndirme Servisi
6 | Akış indirme servisi açıklaması
7 |
8 | İptal Et
9 | Yeniden Dene
10 | Tamamlandı (+%d)
11 | %d kanal indirildi
12 | %d program indirildi
13 |
14 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-tr-rTR/feat_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Proje Hakkında
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-tr-rTR/feat_console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Konsol Editörü
4 |
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-tr-rTR/feat_favourite.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Bilinmiyor
4 | Rastgele oynat
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-tr-rTR/feat_playlist_configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Başlık
4 | Kullanıcı aracısı
5 | Etkin EPGler
6 | Programları eşitle
7 | Eşitlemeyi iptal et
8 | Süresi doldu: %s
9 | Önbellekteki programların süresi dolmuş
10 | Programları Otomatik Yenile
11 | Uygulama başlatıldığında
12 |
13 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-zh-rCN/app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 应用发生崩溃
4 | 最近
5 | 播放最近的播放过的频道
6 | 不可用
7 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-zh-rCN/data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 文件不存在
4 | 订阅名称为空
5 |
6 | 取消
7 | 重试
8 | 完成(+%d)
9 | 已下载 %d 个频道
10 | 已下载 %d 个节目
11 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-zh-rCN/feat_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 关于项目
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-zh-rCN/feat_console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Console Editor
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-zh-rCN/feat_favourite.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 未知
4 | 随机播放
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-zh-rCN/feat_foryou.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 屏蔽的频道
4 | 取消订阅
5 | 复制链接
6 | 重命名
7 | 导入频道
8 | 添加一个播放列表
9 | 好久不见
10 | 超过 %d 天
11 | %d 天
12 | %d 小时
13 | 继续播放
14 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-zh-rCN/feat_playlist.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 未知
4 | 喜欢
5 | 取消喜欢
6 | 屏蔽
7 | 保存封面
8 | 创建快捷方式
9 |
10 | 输入关键字
11 |
12 | 订阅不存在(%s)
13 | 订阅不存在
14 | 封面不存在
15 | 频道不存在
16 | 保存到了(%s)
17 | 回到顶部
18 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-zh-rCN/feat_playlist_configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 标题
4 | 用户代理(UA)
5 | 启用的 EPG
6 | 同步节目
7 | 过期时间: %s
8 | 缓存的节目已经过时
9 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values-zh-rCN/ui.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | M3U
4 |
5 | 主页
6 | 喜欢
7 | 设置
8 |
9 | 设置
10 | 喜欢
11 |
12 | 未知错误
13 | 返回
14 |
15 | 你知道吗?
16 | 我们会记录您的**观看进度**,并在下次播放时恢复进度
17 |
18 | 排序
19 | A-Z
20 | Z-A
21 | 最近
22 | 混合
23 | 从未播放过
24 | 默认
25 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values/app.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | app crashes
4 | Recently
5 | Play recently channel
6 | unavailable
7 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values/data.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | file not found
4 | playlist name is empty
5 | Stream Download Service
6 | Stream Download Description
7 |
8 | Cancel
9 | Retry
10 | Completed (+%d)
11 | %d channels have been downloaded
12 | %d programmes have been downloaded
13 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values/feat_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | about project
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values/feat_console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Console Editor
4 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values/feat_favourite.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | unknown
4 | play randomly
5 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values/feat_foryou.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | hidden channels
4 | unsubscribe
5 | copy url
6 | rename
7 | imported
8 | add a playlist
9 | favourite that you would see again
10 | more than %d days
11 | %d days
12 | %d hours
13 | continue watching
14 | new release
15 | enter code from TV
16 | Make sure to connect to the same Wi-Fi
17 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values/feat_playlist.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | unknown
4 | like
5 | cancel like
6 | hide
7 | save to gallery
8 | create shortcut
9 | playlist is not existed (%s)
10 | enter key word
11 | playlist url is not existed
12 | cover is not existed
13 | channel is not existed
14 | saved to (%s)
15 | scroll up
16 |
--------------------------------------------------------------------------------
/i18n/src/main/res/values/feat_playlist_configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | title
4 | user agent
5 | enabled EPGs
6 | sync programmes
7 | cancel sync programmes
8 | Expire: %s
9 | Cached programmes are out of date
10 | Auto Refresh Programmes
11 | When App Startup
12 |
--------------------------------------------------------------------------------
/jitpack.yml:
--------------------------------------------------------------------------------
1 | jdk:
2 | - openjdk17
3 | before_install:
4 | - ./scripts/prepareJitpackEnvironment.sh
--------------------------------------------------------------------------------
/lint.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/lint/annotation/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/lint/annotation/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | kotlin("jvm")
3 | }
4 |
5 | dependencies {
6 | implementation(kotlin("stdlib"))
7 | }
--------------------------------------------------------------------------------
/lint/annotation/src/main/java/com/m3u/annotation/Exclude.kt:
--------------------------------------------------------------------------------
1 | package com.m3u.annotation
2 |
3 | @Target(AnnotationTarget.FIELD)
4 | @Retention(AnnotationRetention.SOURCE)
5 | annotation class Exclude
6 |
--------------------------------------------------------------------------------
/lint/annotation/src/main/java/com/m3u/annotation/Likable.kt:
--------------------------------------------------------------------------------
1 | package com.m3u.annotation
2 |
3 | @Target(AnnotationTarget.CLASS)
4 | @Retention(AnnotationRetention.SOURCE)
5 | annotation class Likable
6 |
--------------------------------------------------------------------------------
/lint/annotation/src/main/java/com/m3u/annotation/Logger.kt:
--------------------------------------------------------------------------------
1 | package com.m3u.annotation
2 |
3 |
4 | fun interface Logger {
5 | fun log(obj: Any?)
6 |
7 | @Target(AnnotationTarget.CLASS)
8 | @Retention(AnnotationRetention.SOURCE)
9 | annotation class Generator(
10 | val name: String = "logger"
11 | )
12 | }
--------------------------------------------------------------------------------
/lint/annotation/src/main/java/com/m3u/annotation/MyDataClass.kt:
--------------------------------------------------------------------------------
1 | package com.m3u.annotation
2 |
3 | @Target(AnnotationTarget.CLASS)
4 | @Retention(AnnotationRetention.SOURCE)
5 | annotation class MyDataClass(
6 | val name: String = "myCopy",
7 | val jvmOverload: Boolean = false
8 | ) {
9 | @Target(AnnotationTarget.FIELD)
10 | @Retention(AnnotationRetention.SOURCE)
11 | annotation class Exclude
12 |
13 | @Target(AnnotationTarget.FIELD)
14 | @Retention(AnnotationRetention.SOURCE)
15 | annotation class Include
16 | }
17 |
--------------------------------------------------------------------------------
/lint/processor/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/lint/processor/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | kotlin("jvm")
3 | alias(libs.plugins.com.google.devtools.ksp)
4 | }
5 |
6 | ksp {
7 | arg("autoserviceKsp.verify", "true")
8 | arg("autoserviceKsp.verbose", "true")
9 | }
10 |
11 | dependencies {
12 | implementation(project(":lint:annotation"))
13 |
14 | implementation(libs.symbol.processing.api)
15 | implementation(libs.kotlinpoet)
16 | implementation(libs.kotlinpoet.ksp)
17 | implementation(libs.auto.service.annotations)
18 |
19 | ksp(libs.auto.service.ksp)
20 | }
--------------------------------------------------------------------------------
/lint/processor/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/lint/processor/consumer-rules.pro
--------------------------------------------------------------------------------
/lint/processor/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/lint/processor/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/lint/processor/src/main/java/com/m3u/processor/likable/LikableSymbolProcessorProvider.kt:
--------------------------------------------------------------------------------
1 | package com.m3u.processor.likable
2 |
3 | import com.google.auto.service.AutoService
4 | import com.google.devtools.ksp.processing.SymbolProcessor
5 | import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
6 | import com.google.devtools.ksp.processing.SymbolProcessorProvider
7 |
8 | @AutoService(SymbolProcessorProvider::class)
9 | class LikableSymbolProcessorProvider : SymbolProcessorProvider {
10 | override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
11 | return LikableSymbolProcessor(
12 | logger = environment.logger,
13 | codeGenerator = environment.codeGenerator
14 | )
15 | }
16 | }
--------------------------------------------------------------------------------
/lint/processor/src/main/java/com/m3u/processor/likable/LoggerSymbolProcessorProvider.kt:
--------------------------------------------------------------------------------
1 | package com.m3u.processor.likable
2 |
3 | import com.google.auto.service.AutoService
4 | import com.google.devtools.ksp.processing.SymbolProcessor
5 | import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
6 | import com.google.devtools.ksp.processing.SymbolProcessorProvider
7 |
8 | @AutoService(SymbolProcessorProvider::class)
9 | class LoggerSymbolProcessorProvider : SymbolProcessorProvider {
10 | override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
11 | return LoggerSymbolProcessor(
12 | codeGenerator = environment.codeGenerator,
13 | logger = environment.logger
14 | )
15 | }
16 | }
--------------------------------------------------------------------------------
/lint/processor/src/main/java/com/m3u/processor/likable/MyDataClassSymbolProcessorProvider.kt:
--------------------------------------------------------------------------------
1 | package com.m3u.processor.likable
2 |
3 | import com.google.auto.service.AutoService
4 | import com.google.devtools.ksp.processing.SymbolProcessor
5 | import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
6 | import com.google.devtools.ksp.processing.SymbolProcessorProvider
7 |
8 | @AutoService(SymbolProcessorProvider::class)
9 | class MyDataClassSymbolProcessorProvider : SymbolProcessorProvider {
10 | override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
11 | return MyDataClassSymbolProcessor(
12 | codeGenerator = environment.codeGenerator,
13 | logger = environment.logger
14 | )
15 | }
16 | }
--------------------------------------------------------------------------------
/play_store_512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oxyroid/M3UAndroid/4617fcef87064b5d4a823ed3868413fba22ff7b7/play_store_512.png
--------------------------------------------------------------------------------
/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3 | "extends": [
4 | "config:recommended"
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | gradlePluginPortal()
4 | google()
5 | mavenCentral()
6 | maven("https://plugins.gradle.org/m2/")
7 | }
8 | }
9 | dependencyResolutionManagement {
10 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
11 | repositories {
12 | google()
13 | mavenCentral()
14 | maven("https://jitpack.io")
15 | maven("https://plugins.gradle.org/m2/")
16 | }
17 | }
18 | rootProject.name = "M3U"
19 | include(":app:smartphone", ":app:tv", ":app:extension")
20 | include(":core", ":core:foundation", ":core:extension")
21 | include(":data")
22 | include(
23 | ":business:foryou",
24 | ":business:favorite",
25 | ":business:setting",
26 | ":business:playlist",
27 | ":business:playlist-configuration",
28 | ":business:channel",
29 | ":business:extension",
30 | )
31 | include(":baselineprofile:smartphone", ":baselineprofile:tv")
32 | include(":i18n")
33 | include(
34 | ":lint:annotation",
35 | ":lint:processor"
36 | )
37 |
--------------------------------------------------------------------------------