Merge branch 'libre-tube:master' into master

This commit is contained in:
XelXen 2022-06-29 22:16:21 +05:30 committed by GitHub
commit 4f1f04ebb8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 519 additions and 279 deletions

View File

@ -272,9 +272,15 @@
</activity>
<service
android:name=".DownloadService"
android:name=".services.DownloadService"
android:enabled="true"
android:exported="false" />
<service
android:name=".services.ClosingService"
android:enabled="true"
android:exported="false"
android:stopWithTask="false" />
</application>
</manifest>

View File

@ -34,6 +34,7 @@ import androidx.navigation.findNavController
import androidx.navigation.ui.setupWithNavController
import com.github.libretube.fragments.PlayerFragment
import com.github.libretube.fragments.isFullScreen
import com.github.libretube.services.ClosingService
import com.github.libretube.util.CronetHelper
import com.github.libretube.util.LocaleHelper
import com.github.libretube.util.PreferenceHelper
@ -52,6 +53,10 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
DynamicColors.applyToActivityIfAvailable(this)
super.onCreate(savedInstanceState)
// start service that gets called on closure
startService(Intent(this, ClosingService::class.java))
CronetHelper.initCronet(this.applicationContext)
RetrofitInstance.url =

View File

@ -60,6 +60,7 @@ class PlaylistAdapter(
holder.v.setOnClickListener {
var bundle = Bundle()
bundle.putString("videoId", streamItem.url!!.replace("/watch?v=", ""))
bundle.putString("playlistId", playlistId)
var frag = PlayerFragment()
frag.arguments = bundle
val activity = holder.v.context as AppCompatActivity

View File

@ -17,10 +17,10 @@ import android.widget.TextView
import androidx.core.app.ActivityCompat
import androidx.core.text.HtmlCompat
import androidx.fragment.app.DialogFragment
import com.github.libretube.DownloadService
import com.github.libretube.MainActivity
import com.github.libretube.R
import com.github.libretube.obj.Streams
import com.github.libretube.services.DownloadService
import com.google.android.material.dialog.MaterialAlertDialogBuilder
class DownloadDialog : DialogFragment() {

View File

@ -38,7 +38,6 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.IS_DOWNLOAD_RUNNING
import com.github.libretube.MainActivity
import com.github.libretube.R
import com.github.libretube.adapters.ChaptersAdapter
@ -50,12 +49,14 @@ import com.github.libretube.dialogs.ShareDialog
import com.github.libretube.hideKeyboard
import com.github.libretube.obj.ChapterSegment
import com.github.libretube.obj.PipedStream
import com.github.libretube.obj.Playlist
import com.github.libretube.obj.Segment
import com.github.libretube.obj.Segments
import com.github.libretube.obj.SponsorBlockPrefs
import com.github.libretube.obj.StreamItem
import com.github.libretube.obj.Streams
import com.github.libretube.obj.Subscribe
import com.github.libretube.services.IS_DOWNLOAD_RUNNING
import com.github.libretube.util.CronetHelper
import com.github.libretube.util.DescriptionAdapter
import com.github.libretube.util.PreferenceHelper
@ -86,6 +87,9 @@ import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.squareup.picasso.Picasso
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.chromium.net.CronetEngine
import retrofit2.HttpException
import java.io.IOException
@ -99,6 +103,7 @@ class PlayerFragment : Fragment() {
private val TAG = "PlayerFragment"
private var videoId: String? = null
private var playlistId: String? = null
private var sId: Int = 0
private var eId: Int = 0
private var paused = false
@ -119,8 +124,13 @@ class PlayerFragment : Fragment() {
private lateinit var motionLayout: MotionLayout
private lateinit var exoPlayer: ExoPlayer
private lateinit var segmentData: Segments
private var relatedStreams: List<StreamItem>? = arrayListOf()
private var relatedStreamsEnabled = true
private var relatedStreams: List<StreamItem>? = arrayListOf()
private var nextStreamId: String? = null
private var playlistStreamIds: MutableList<String> = arrayListOf()
private var playlistNextPage: String? = null
private var isPlayerLocked: Boolean = false
private lateinit var relDownloadVideo: LinearLayout
@ -138,6 +148,7 @@ class PlayerFragment : Fragment() {
super.onCreate(savedInstanceState)
arguments?.let {
videoId = it.getString("videoId")
playlistId = it.getString("playlistId")
}
}
@ -155,8 +166,9 @@ class PlayerFragment : Fragment() {
hideKeyboard()
setSponsorBlockPrefs()
createExoPlayer(view)
initializeTransitionLayout(view)
fetchJsonAndInitPlayer(view)
playVideo(view)
}
private fun initializeTransitionLayout(view: View) {
@ -252,14 +264,12 @@ class PlayerFragment : Fragment() {
}
}
// video description and chapters toggle
val descLinLayout = view.findViewById<LinearLayout>(R.id.desc_linLayout)
view.findViewById<RelativeLayout>(R.id.player_title_layout).setOnClickListener {
val arrowImageView = view.findViewById<ImageView>(R.id.player_description_arrow)
arrowImageView.animate().rotationBy(180F).setDuration(100).start()
if (playerDescription.isVisible) {
playerDescription.visibility = View.GONE
} else {
playerDescription.visibility = View.VISIBLE
}
arrowImageView.animate().rotationBy(180F).setDuration(250).start()
descLinLayout.visibility = if (descLinLayout.isVisible) View.GONE else View.VISIBLE
}
view.findViewById<MaterialCardView>(R.id.comments_toggle)
@ -375,7 +385,12 @@ class PlayerFragment : Fragment() {
val isScreenOn = pm.isInteractive
// pause player if screen off and setting enabled
if (exoPlayer != null && !isScreenOn && pausePlayerOnScreenOffEnabled) {
if (
this::exoPlayer.isInitialized &&
exoPlayer != null &&
!isScreenOn &&
pausePlayerOnScreenOffEnabled
) {
exoPlayer.pause()
}
super.onPause()
@ -419,7 +434,7 @@ class PlayerFragment : Fragment() {
}
}
private fun fetchJsonAndInitPlayer(view: View) {
private fun playVideo(view: View) {
fun run() {
lifecycleScope.launchWhenCreated {
val response = try {
@ -439,19 +454,19 @@ class PlayerFragment : Fragment() {
uploader = response.uploader!!
thumbnailUrl = response.thumbnailUrl!!
// check whether related streams and autoplay are enabled
// save whether related streams and autoplay are enabled
autoplay = PreferenceHelper.getBoolean(requireContext(), "autoplay", false)
relatedStreamsEnabled =
PreferenceHelper.getBoolean(requireContext(), "related_streams_toggle", true)
// save related streams for autoplay
relatedStreams = response.relatedStreams
runOnUiThread {
createExoPlayer(view)
prepareExoPlayerView()
if (response.chapters != null) initializeChapters(response.chapters)
// set media sources for the player
setResolutionAndSubtitles(view, response)
exoPlayer.prepare()
prepareExoPlayerView()
initializePlayerView(view, response)
// support for time stamped links
if (arguments?.getLong("timeStamp") != null) {
@ -464,12 +479,78 @@ class PlayerFragment : Fragment() {
fetchSponsorBlockSegments()
// show comments if related streams disabled
if (!relatedStreamsEnabled) toggleComments()
// prepare for autoplay
initAutoPlay()
}
}
}
run()
}
// the function is working recursively
private fun initAutoPlay() {
// save related streams for autoplay
if (autoplay) {
// if it's a playlist use the next video
if (playlistId != null) {
lateinit var playlist: Playlist // var for saving the list in
// runs only the first time when starting a video from a playlist
if (playlistStreamIds.isEmpty()) {
CoroutineScope(Dispatchers.IO).launch {
// fetch the playlists videos
playlist = RetrofitInstance.api.getPlaylist(playlistId!!)
// save the playlist urls in the array
playlist.relatedStreams?.forEach { video ->
playlistStreamIds += video.url?.replace("/watch?v=", "")!!
}
// save playlistNextPage for usage if video is not contained
playlistNextPage = playlist.nextpage
// restart the function after videos are loaded
initAutoPlay()
}
}
// if the playlists contain the video, then save the next video as next stream
else if (playlistStreamIds.contains(videoId)) {
val index = playlistStreamIds.indexOf(videoId)
// check whether there's a next video
if (index + 1 <= playlistStreamIds.size) {
nextStreamId = playlistStreamIds[index + 1]
}
// fetch the next page of the playlist if the video isn't contained
} else if (playlistNextPage != null) {
CoroutineScope(Dispatchers.IO).launch {
RetrofitInstance.api.getPlaylistNextPage(playlistId!!, playlistNextPage!!)
// append all the playlist item urls to the array
playlist.relatedStreams?.forEach { video ->
playlistStreamIds += video.url?.replace("/watch?v=", "")!!
}
// save playlistNextPage for usage if video is not contained
playlistNextPage = playlist.nextpage
// restart the function after videos are loaded
initAutoPlay()
}
}
// else: the video must be the last video of the playlist so nothing happens
// if it's not a playlist then use the next related video
} else if (relatedStreams != null && relatedStreams!!.isNotEmpty()) {
// save next video from related streams for autoplay
nextStreamId = relatedStreams!![0].url!!.replace("/watch?v=", "")!!
}
}
}
// used for autoplay and skipping to next video
private fun playNextVideo() {
// check whether there is a new video in the queue
// by making sure that the next and the current video aren't the same
if (videoId != nextStreamId) {
// save the id of the next stream as videoId and load the next video
videoId = nextStreamId
playVideo(view!!)
}
}
private fun setSponsorBlockPrefs() {
sponsorBlockPrefs.sponsorBlockEnabled =
PreferenceHelper.getBoolean(requireContext(), "sb_enabled_key", true)
@ -495,7 +576,7 @@ class PlayerFragment : Fragment() {
private fun fetchSponsorBlockSegments() {
fun run() {
lifecycleScope.launchWhenCreated {
lifecycleScope.launch(Dispatchers.IO) {
if (sponsorBlockPrefs.sponsorBlockEnabled) {
val categories: ArrayList<String> = arrayListOf()
if (sponsorBlockPrefs.introEnabled) {
@ -531,14 +612,10 @@ class PlayerFragment : Fragment() {
} catch (e: IOException) {
println(e)
Log.e(TAG, "IOException, you might not have internet connection")
Toast.makeText(context, R.string.unknown_error, Toast.LENGTH_SHORT)
.show()
return@launchWhenCreated
return@launch
} catch (e: HttpException) {
Log.e(TAG, "HttpException, unexpected response")
Toast.makeText(context, R.string.server_error, Toast.LENGTH_SHORT)
.show()
return@launchWhenCreated
return@launch
}
}
}
@ -601,14 +678,13 @@ class PlayerFragment : Fragment() {
// check if video has ended, next video is available and autoplay is enabled.
if (
playbackState == Player.STATE_ENDED &&
relatedStreams != null &&
relatedStreams!!.isNotEmpty() &&
nextStreamId != null &&
!transitioning &&
autoplay
) {
transitioning = true
videoId = relatedStreams!![0].url!!.replace("/watch?v=", "")
fetchJsonAndInitPlayer(view)
// check whether autoplay is enabled
if (autoplay) playNextVideo()
}
if (playWhenReady && playbackState == Player.STATE_READY) {
@ -657,29 +733,28 @@ class PlayerFragment : Fragment() {
if (response.hls != null) {
view.findViewById<LinearLayout>(R.id.relPlayer_vlc).setOnClickListener {
exoPlayer.pause()
try {
val vlcRequestCode = 42
val uri: Uri = Uri.parse(response.hls)
val vlcIntent = Intent(Intent.ACTION_VIEW)
vlcIntent.setPackage("org.videolan.vlc")
vlcIntent.setDataAndTypeAndNormalize(uri, "video/*")
vlcIntent.putExtra("title", response.title)
vlcIntent.putExtra("from_start", false)
vlcIntent.putExtra("position", exoPlayer.currentPosition)
startActivityForResult(vlcIntent, vlcRequestCode)
} catch (e: Exception) {
Toast.makeText(context, R.string.vlcerror, Toast.LENGTH_SHORT)
.show()
}
// start an intent with video as mimetype using the hls stream
val uri: Uri = Uri.parse(response.hls)
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.setDataAndType(uri, "video/*")
intent.putExtra(Intent.EXTRA_TITLE, title)
intent.putExtra("title", title)
intent.putExtra("artist", uploader)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
}
}
if (relatedStreamsEnabled) {
// only show related streams if enabled
relatedRecView.adapter = TrendingAdapter(
response.relatedStreams!!,
childFragmentManager
)
}
// set video description
val description = response.description!!
view.findViewById<TextView>(R.id.player_description).text =
// detect whether the description is html formatted
@ -717,28 +792,13 @@ class PlayerFragment : Fragment() {
}
private fun initializeChapters(chapters: List<ChapterSegment>) {
val chaptersToggle = view?.findViewById<LinearLayout>(R.id.chapters_toggle)
val chaptersRecView = view?.findViewById<RecyclerView>(R.id.chapters_recView)
val chaptersToggleText = view?.findViewById<TextView>(R.id.chapters_toggle_text)
val chaptersToggleArrow = view?.findViewById<ImageView>(R.id.chapters_toggle_arrow)
if (chapters.isNotEmpty()) {
chaptersToggle?.visibility = View.VISIBLE
chaptersToggle?.setOnClickListener {
if (chaptersRecView?.isVisible!!) {
chaptersRecView?.visibility = View.GONE
chaptersToggleText?.text = getString(R.string.show_chapters)
} else {
chaptersRecView?.visibility = View.VISIBLE
chaptersToggleText?.text = getString(R.string.hide_chapters)
}
chaptersToggleArrow!!.animate().setDuration(100).rotationBy(180F).start()
}
chaptersRecView?.layoutManager =
LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, false)
chaptersRecView?.adapter = ChaptersAdapter(chapters, exoPlayer)
chaptersRecView?.visibility = View.VISIBLE
}
}
@ -1121,7 +1181,7 @@ class PlayerFragment : Fragment() {
enableTransition(R.id.yt_transition, false)
}
view?.findViewById<ConstraintLayout>(R.id.main_container)?.isClickable = true
view?.findViewById<FrameLayout>(R.id.top_bar)?.visibility = View.GONE
view?.findViewById<LinearLayout>(R.id.top_bar)?.visibility = View.GONE
val mainActivity = activity as MainActivity
mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT
isFullScreen = false
@ -1133,7 +1193,7 @@ class PlayerFragment : Fragment() {
exoPlayerView.showController()
exoPlayerView.useController = true
view?.findViewById<ConstraintLayout>(R.id.main_container)?.isClickable = false
view?.findViewById<FrameLayout>(R.id.top_bar)?.visibility = View.VISIBLE
view?.findViewById<LinearLayout>(R.id.top_bar)?.visibility = View.VISIBLE
}
}

View File

@ -0,0 +1,31 @@
package com.github.libretube.services
import android.app.NotificationManager
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.IBinder
import android.util.Log
import androidx.annotation.Nullable
class ClosingService : Service() {
private val TAG = "ClosingService"
@Nullable
override fun onBind(intent: Intent?): IBinder? {
return null
}
// Handle application closing
override fun onTaskRemoved(rootIntent: Intent?) {
super.onTaskRemoved(rootIntent)
// destroy all notifications (especially the player notification)
val nManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
nManager.cancelAll()
Log.e(TAG, "closed")
// Destroy the service
stopSelf()
}
}

View File

@ -1,4 +1,4 @@
package com.github.libretube
package com.github.libretube.services
import android.app.DownloadManager
import android.app.PendingIntent
@ -18,6 +18,7 @@ import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.arthenica.ffmpegkit.FFmpegKit
import com.github.libretube.R
import com.github.libretube.util.PreferenceHelper
import java.io.File

View File

@ -17,7 +17,7 @@ object ThemeHelper {
}
private fun updateAccentColor(context: Context) {
when (PreferenceHelper.getString(context, "accent_color", "red")) {
when (PreferenceHelper.getString(context, "accent_color", "purple")) {
"my" -> context.setTheme(R.style.Theme_MY)
"red" -> context.setTheme(R.style.Theme_Red)
"blue" -> context.setTheme(R.style.Theme_Blue)

View File

@ -10,8 +10,8 @@
<ImageButton
android:id="@+id/back_imageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_marginVertical="10dp"
android:layout_marginLeft="15dp"
android:background="?android:selectableItemBackgroundBorderless"

View File

@ -1,15 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="80dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="10dp"
android:layout_marginHorizontal="5dp"
android:orientation="vertical">
<ImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/chapter_image"
android:layout_width="80dp"
android:layout_height="45dp"
android:src="@mipmap/ic_launcher" />
android:layout_width="match_parent"
android:layout_height="55dp"
android:src="@mipmap/ic_launcher"
app:shapeAppearanceOverlay="@style/roundedImageViewRounded" />
<TextView
android:id="@+id/chapter_title"

View File

@ -23,12 +23,14 @@
android:id="@+id/linLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/player_title_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<TextView
@ -55,108 +57,84 @@
</RelativeLayout>
<RelativeLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="10dp"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<TextView
android:id="@+id/player_views_info"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="10M views 2 days ago " />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/player_views_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="10M views 2 days ago " />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:layout_marginTop="2dp">
<ImageView
android:layout_gravity="center"
android:layout_width="15dp"
android:layout_height="15dp"
android:src="@drawable/ic_like" />
<TextView
android:id="@+id/textLike"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="5dp"
android:text="4.2K" />
<ImageView
android:layout_gravity="center"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_marginLeft="5dp"
android:src="@drawable/ic_like"
android:rotation="180"/>
<TextView
android:id="@+id/textDislike"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="5dp"
android:text="1.3K" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/chapters_toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:id="@+id/chapters_toggle_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/show_chapters" />
android:layout_marginLeft="3dp"
android:layout_marginTop="2dp">
<ImageView
android:id="@+id/chapters_toggle_arrow"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="bottom"
android:src="@drawable/ic_arrow_down" />
android:layout_width="12dp"
android:layout_height="12dp"
android:layout_gravity="center"
android:src="@drawable/ic_like" />
<TextView
android:id="@+id/textLike"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="5dp"
android:text="4.2K" />
<ImageView
android:layout_width="12dp"
android:layout_height="12dp"
android:layout_gravity="center"
android:layout_marginLeft="5dp"
android:rotation="180"
android:src="@drawable/ic_like" />
<TextView
android:id="@+id/textDislike"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="5dp"
android:text="1.3K" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/chapters_recView"
<LinearLayout
android:id="@+id/desc_linLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/comments_toggle"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:layout_marginRight="10dp"
android:nestedScrollingEnabled="false"
android:visibility="gone" />
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/player_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"
android:padding="8dp"
android:textIsSelectable="true"
android:textSize="14sp"
android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/chapters_recView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/comments_toggle"
android:layout_marginHorizontal="3dp"
android:layout_marginTop="20dp"
android:nestedScrollingEnabled="false"
android:visibility="gone" />
<TextView
android:id="@+id/player_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"
android:padding="8dp"
android:textIsSelectable="true"
android:textSize="14sp" />
</LinearLayout>
<com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Elevated"
@ -176,12 +154,7 @@
<LinearLayout
android:id="@+id/relPlayer_share"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:background="?android:attr/selectableItemBackground"
android:gravity="center"
android:orientation="vertical">
style="@style/PlayerActionsLayout">
<ImageView
android:layout_width="24dp"
@ -196,12 +169,7 @@
<LinearLayout
android:id="@+id/relPlayer_download"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:background="?android:attr/selectableItemBackground"
android:gravity="center"
android:orientation="vertical">
style="@style/PlayerActionsLayout">
<ImageView
android:layout_width="24dp"
@ -219,12 +187,7 @@
<LinearLayout
android:id="@+id/relPlayer_vlc"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:background="?android:attr/selectableItemBackground"
android:gravity="center"
android:orientation="vertical">
style="@style/PlayerActionsLayout">
<ImageView
android:layout_width="24dp"
@ -241,12 +204,7 @@
<LinearLayout
android:id="@+id/save"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:background="?android:attr/selectableItemBackground"
android:gravity="center"
android:orientation="vertical">
style="@style/PlayerActionsLayout">
<ImageView
android:layout_width="24dp"
@ -315,6 +273,7 @@
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:descendantFocusability="blocksDescendants">
<com.google.android.material.card.MaterialCardView

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="instances">اختر نظير</string>
<string name="customInstance">نظير مخصص</string>
<string name="instances">اختر نموذج</string>
<string name="customInstance">نموذج مخصص</string>
<string name="choose_quality_dialog">الجودة</string>
<string name="registered">تم إنشاء حساب بنجاح! تستطيع الآن أن تشترك بالقنوات التي تريدها.</string>
<string name="search_hint">بحث</string>
@ -24,7 +24,7 @@
<string name="register">إنشاء حساب جديد</string>
<string name="already_logged_in">لقد سجلت دخولك من قبل، تستطيع أن تسجل خروجك إذا أردت.</string>
<string name="subscribeIsEmpty">اشترك ببعض القنوات أولا.</string>
<string name="cannotDownload">لم يُقدر على تنزيل هذا البث.</string>
<string name="cannotDownload">لا بمكن تنزيل هذا البث.</string>
<string name="region">المنطقة</string>
<string name="importsuccess">تم الاشتراك</string>
<string name="dlcomplete">تم التنزيل.</string>
@ -33,7 +33,7 @@
<string name="import_from_yt">استيراد الاشتراكات</string>
<string name="app_theme">سمة التطبيق</string>
<string name="empty">لا يمكن لاسم المستخدم وكلمة المرور أن يكونوا فارغين.</string>
<string name="notgmail">هذا من أجل حساب LibreTube الخاص بك.</string>
<string name="notgmail">هذا لحساب Piped.</string>
<string name="defres">جودة الفيديو الافتراضية</string>
<string name="grid">أعمدة الشبكة</string>
<string name="emptyList">لا شيء هنا.</string>
@ -113,7 +113,7 @@
<string name="app_icon">أيقونة</string>
<string name="enabled">مفعل</string>
<string name="disabled">معطل</string>
<string name="piped">الانابيب</string>
<string name="piped">Piped</string>
<string name="youtube">يوتيوب</string>
<string name="playOnBackground">تشغيل في الخلفية</string>
<string name="no_replies">هذا التعليق ليس له ردود.</string>
@ -203,4 +203,8 @@
<string name="reset">استعادة الإعدادات الافتراضية</string>
<string name="reset_message">هل أنت متأكد؟ سيؤدي ذلك إلى تسجيل خروجك وإعادة تعيين جميع إعداداتك!</string>
<string name="clonePlaylist">نسخ قائمة التشغيل</string>
<string name="deleteAccount">حذف الحساب</string>
<string name="account">الحساب</string>
<string name="restore">استعادة</string>
<string name="deleteAccount_summary">حذف حساب Piped الخاص بك</string>
</resources>

View File

@ -77,7 +77,7 @@
<string name="unknown_error">Şəbəkə xətası.</string>
<string name="error">Nəsə xəta baş verdi.</string>
<string name="empty">Siz istifadəçi adı və şifrə daxil etməlisiniz.</string>
<string name="notgmail">Bu, LibreTube hesabı üçündür.</string>
<string name="notgmail">Bu, Piped hesabı üçündür.</string>
<string name="defres">Defolt video keyfiyyəti</string>
<string name="grid">Şəbəkə sütunları</string>
<string name="emptyList">Burada heç nə yoxdur.</string>
@ -201,6 +201,10 @@
<string name="pauseOnScreenOff">Avto-fasilə</string>
<string name="pauseOnScreenOff_summary">Ekran söndürüldükdə pleyeri dayandırın.</string>
<string name="clonePlaylist">Pleylisti klonlayın</string>
<string name="reset">Defoltlara bərpa edin</string>
<string name="reset">İlkin tənzimləmələrə bərpa edin</string>
<string name="reset_message">Siz əminsiz\? Bu, sizi sistemdən çıxaracaq və bütün tənzimləmələrinizi sıfırlayacaq!</string>
<string name="account">Hesab</string>
<string name="restore">Bərpa edin</string>
<string name="deleteAccount">Hesabı silin</string>
<string name="deleteAccount_summary">Piped hesabınızı silin</string>
</resources>

View File

@ -177,7 +177,7 @@
<string name="autoplay_summary">ভিডিও শেষ হওয়ার পর স্বয়ংক্রিয়ভাবে নতুন ভিডিও প্লে করুন।</string>
<string name="reset_message">আপনি কি নিশ্চিত\? আপনি লগ আউট হয়ে যাবেন এবং সমস্ত সেটিংস আগের অবস্থায় ফিরে যাবে!</string>
<string name="vlcerror">ভিএলসি অ্যাপে প্রদর্শন করা যাচ্ছে না। সম্ভবত অ্যাপটি ইনস্টল করা হয়নি।</string>
<string name="notgmail">এটি একটি লিবরাটিউব অ্যাকাউন্টের জন্য।</string>
<string name="notgmail">এটি একটি পাইপড অ্যাকাউন্টের জন্য।</string>
<string name="noInternet">প্রথমে ইন্টারনেট চালু করুন।</string>
<string name="yes">হ্যাঁ</string>
<string name="choose_quality_dialog">কোয়ালিটি</string>
@ -203,4 +203,8 @@
<string name="login">লগ ইন</string>
<string name="customInstance">কাস্টম ইনস্ট্যান্স</string>
<string name="vlc">ভিএলসি অ্যাপে প্রদর্শন</string>
<string name="deleteAccount">অ্যাকাউন্ট মুছে ফেলুন</string>
<string name="deleteAccount_summary">পাইপড অ্যাকাউন্ট মুছে ফেলুন</string>
<string name="restore">ফিরিয়ে আনুন</string>
<string name="account">অ্যাকাউন্ট</string>
</resources>

View File

@ -30,7 +30,7 @@
<string name="server_error">Der Server meldet Schwierigkeiten. Versuche eine andere Instanz\?</string>
<string name="unknown_error">Netzwerkfehler.</string>
<string name="error">Etwas ist schiefgelaufen.</string>
<string name="notgmail">Dies ist für ein LibreTube-Konto.</string>
<string name="notgmail">Dies ist für ein Piped-Konto.</string>
<string name="defres">Standard-Auflösung</string>
<string name="grid">Spaltenanzahl</string>
<string name="emptyList">Gähnende Leere.</string>
@ -181,4 +181,16 @@
<string name="audio">Audio</string>
<string name="video">Video</string>
<string name="downloading">Wird heruntergeladen</string>
<string name="reset">Standardwerte wiederherstellen</string>
<string name="reset_message">Sind Sie sicher\? Dadurch werden Sie abgemeldet und alle Ihre Einstellungen zurückgesetzt!</string>
<string name="deleteAccount">Konto löschen</string>
<string name="deleteAccount_summary">Ihr Piped-Konto löschen</string>
<string name="account">Konto</string>
<string name="restore">Wiederherstellen</string>
<string name="hideTrendingPage">Trendseite ausblenden</string>
<string name="quality">Qualität</string>
<string name="behavior">Verhalten</string>
<string name="player_summary">Qualität und Verhalten des Players</string>
<string name="pauseOnScreenOff">Automatische Pause</string>
<string name="clonePlaylist">Wiedergabeliste klonen</string>
</resources>

View File

@ -35,7 +35,7 @@
<string name="app_theme">Tema</string>
<string name="error">Algo salió mal.</string>
<string name="empty">Tienes que introducir un nombre de usuario y una contraseña.</string>
<string name="notgmail">Esto es para una cuenta de LibreTube.</string>
<string name="notgmail">Esto es para una cuenta Piped.</string>
<string name="defres">Resolución de vídeo predeterminada</string>
<string name="grid">Columnas de la cuadrícula</string>
<string name="emptyList">No hay nada aquí.</string>
@ -44,7 +44,7 @@
<string name="playlistName">Nombre de la lista de reproducción</string>
<string name="success">Hecho.</string>
<string name="fail">Error :(</string>
<string name="dlisinprogress">Por favor, espere hasta que todas las descargas hayan terminado…</string>
<string name="dlisinprogress">Otra descarga ya está en curso, por favor espere hasta que termine.</string>
<string name="server_error">Hay un problema con el servidor. ¿Probar con otra instancia\?</string>
<string name="unknown_error">Error de red.</string>
<string name="deletePlaylist">Eliminar lista de reproducción</string>
@ -108,7 +108,7 @@
<string name="color_blue">Azul</string>
<string name="color_purple">Púrpura</string>
<string name="oledTheme">Negro</string>
<string name="material_you">Mystic Material 3</string>
<string name="material_you">Material místico 3</string>
<string name="app_icon">Icono</string>
<string name="piped">Piped</string>
<string name="youtube">YouTube</string>
@ -195,7 +195,7 @@
<string name="quality">Calidad</string>
<string name="behavior">Comportamiento</string>
<string name="player_summary">Calidad y comportamiento del reproductor</string>
<string name="seek_increment">Incremento de búsqueda</string>
<string name="seek_increment">Incremento de desplazamiento</string>
<string name="piped_summary">Piped es una interfaz web alternativa de código abierto para YouTube que proporciona la API que usamos. Sin Piped, LibreTube no existiría. ¡Muchas gracias a sus desarrolladores!</string>
<string name="pauseOnScreenOff">Pausa automática</string>
<string name="pauseOnScreenOff_summary">Pausa el reproductor cuando se apaga la pantalla.</string>
@ -203,4 +203,8 @@
<string name="clonePlaylist">Clonar lista de reproducción</string>
<string name="reset">Restaurar los valores predeterminados</string>
<string name="reset_message">¿Está seguro\? ¡Esto te cerrará la sesión y restablecerá todos tus ajustes!</string>
<string name="account">Cuenta</string>
<string name="restore">Restaurar</string>
<string name="deleteAccount_summary">Elimina su cuenta Piped</string>
<string name="deleteAccount">Eliminar cuenta</string>
</resources>

View File

@ -7,7 +7,7 @@
<string name="loggedout">Kirjautunut ulos.</string>
<string name="loggedIn">Kirjautunut sisään.</string>
<string name="instances">Valitse instanssi</string>
<string name="region">Valitse alue</string>
<string name="region">Alue</string>
<string name="subscribe">Tilaa</string>
<string name="save">Tallenna</string>
<string name="username">Käyttäjätunnus</string>
@ -18,7 +18,7 @@
<string name="cancel">Peruuta</string>
<string name="registered">Rekisteröityminen onnistui! Voit nyt tilata haluamiasi kanavia.</string>
<string name="already_logged_in">Olet jo kirjautunut sisään, voit kirjautua ulos tililtäsi.</string>
<string name="login_first">Kirjaudu sisään ja yritä uudelleen!</string>
<string name="login_first">Kirjaudu sisään ja yritä uudelleen.</string>
<string name="login_register">Kirjaudu sisään/rekisteröidy</string>
<string name="please_login">Kirjaudu sisään tai rekisteröidy asetuksiin ensin!</string>
<string name="importsuccess">Tilattu</string>
@ -27,17 +27,17 @@
<string name="vlcerror">Ei voi avata VLC:ssä. Sitä ei ehkä ole asennettu.</string>
<string name="server_error">Palvelin vastasi ongelmaan. Ehkä kokeile toista instanssia\?</string>
<string name="empty">Käyttäjätunnus ja salasana eivät voi olla tyhjiä.</string>
<string name="notgmail">Tämä ei ole Gmail-tilisi.</string>
<string name="notgmail">Tämä on sinun Piped-tilillesi.</string>
<string name="defres">Videon oletustarkkuus</string>
<string name="grid">Valitse ruudukon sarakkeet</string>
<string name="app_theme">Sovelluksen teema</string>
<string name="success">Onnistui.</string>
<string name="about">Tietoja</string>
<string name="choose_quality_dialog">Valitse laatu:</string>
<string name="choose_quality_dialog">Laatu</string>
<string name="share">Jaa</string>
<string name="customInstance">Lisää mukautettu instanssi</string>
<string name="customInstance">Mukautettu instanssi</string>
<string name="subscribeIsEmpty">Tilaa ensin joitakin kanavia.</string>
<string name="dlisinprogress">Odota kunnes kaikki lataukset ovat valmiita.</string>
<string name="dlisinprogress">Odota kunnes kaikki lataukset ovat valmiita</string>
<string name="cannotDownload">Ei voi ladata tätä videota.</string>
<string name="vlc">Avaa VLC:ssä</string>
<string name="unknown_error">Verkkovirhe.</string>
@ -60,11 +60,11 @@
<string name="changeLanguage">Kieli</string>
<string name="systemLanguage">Järjestelmän kieli</string>
<string name="darkTheme">Tumma</string>
<string name="systemDefault">Järjestelmän oletusarvo</string>
<string name="systemDefault">Järjestelmä</string>
<string name="lightTheme">Vaalea</string>
<string name="subscribers">%1$s tilaajaa</string>
<string name="comments">Kommentit</string>
<string name="noInternet">Ei Internet-yhteyttä</string>
<string name="noInternet">Yhdistä Internetiin ensin.</string>
<string name="videoCount">%1$s videota</string>
<string name="retry">Yritä uudelleen</string>
<string name="location">Sijainti</string>
@ -72,9 +72,9 @@
<string name="settings">Asetukset</string>
<string name="instance">Instanssi</string>
<string name="website">Verkkosivusto</string>
<string name="app_icon">Sovelluksen kuvake</string>
<string name="enabled">Käytössä</string>
<string name="disabled">Pois käytöltä</string>
<string name="app_icon">Kuvake</string>
<string name="enabled">Päällä</string>
<string name="disabled">Pois päältä</string>
<string name="piped">Piped</string>
<string name="youtube">YouTube</string>
<string name="choose_filter">Valitse hakusuodatin</string>
@ -86,31 +86,125 @@
<string name="search_history">Hakuhistoria</string>
<string name="clear_history">Tyhjennä historia</string>
<string name="defaultTab">Oletusvälilehti</string>
<string name="sponsorblock">SponsorBlock</string>
<string name="sponsorblock">SponsoriBlokki</string>
<string name="playOnBackground">Toista taustalla</string>
<string name="color_green">Vihreä</string>
<string name="color_purple">Violetti</string>
<string name="oledTheme">OLED-teema</string>
<string name="color_green">Svengaava vihreä</string>
<string name="color_purple">Miellyttävä violetti</string>
<string name="oledTheme">Musta</string>
<string name="sponsorblock_notifications">Ilmoitukset</string>
<string name="authors">Tekijät</string>
<string name="no_replies">Tähän kommenttiin ei ole vastauksia.</string>
<string name="update_available">Versio %1$s on saatavilla.</string>
<string name="update_available">Versio %1$s on saatavilla</string>
<string name="appearance">Ulkonäkö</string>
<string name="downloads">Lataukset</string>
<string name="video_format">Videoformaatti</string>
<string name="app_uptodate">Sovellus ajan tasalla</string>
<string name="app_uptodate">Ajetaan viimeisintä versiota.</string>
<string name="donate">Lahjoita</string>
<string name="advanced_summary">Soitin, lataukset, historia</string>
<string name="appearance_summary">Tee sovelluksesta haluamasi näköinen.</string>
<string name="advanced_summary">Lataukset, historia</string>
<string name="appearance_summary">Säädä sovelluksesta haluamasi näköinen.</string>
<string name="advanced">Edistynyt</string>
<string name="live">Live</string>
<string name="music_playlists">YT Musiikki Soittolistat</string>
<string name="music_playlists">YT Music Soittolistat</string>
<string name="segment_skipped">Ohitettu segmentti</string>
<string name="category_sponsor">Sponsori</string>
<string name="category_selfpromo">Ei maksettu/itsensä mainostaminen</string>
<string name="category_segments">Segmentit</string>
<string name="category_intro">Väliaika/Intro animaatio</string>
<string name="sponsorblock_state">Päällä</string>
<string name="sponsorblock_state">Käytössä</string>
<string name="category_selfpromo_description">Samankaltainen kuin \"sponsori\" lukuunottamatta ei maksettua tai itsensä mainostamista. Tämä sisältää osiot, jotka sisältävät kauppatavaraa, lahjoituksia tai tietoa keiden kanssa he tekivät yhteistyötä.</string>
<string name="category_interaction">Vuorovaikutus muistutus (tykkäys ja tilaus)</string>
<string name="reset_message">Oletko varma\? Tämä kirjaa sinut ulos ja resetoi kaikki sinun asetuksesi!</string>
<string name="deleteAccount_summary">Poista sinun Piped-tili</string>
<string name="account">Tili</string>
<string name="restore">Palauta</string>
<string name="reset">Palauta oletukset</string>
<string name="deleteAccount">Poista tili</string>
<string name="music_songs">YT Music Kappaleet</string>
<string name="music_videos">YT Music Videot</string>
<string name="category_sponsor_description">Maksettu mainostaminen, maksetut vittaukset ja suorat mainokset. Ei itsensä mainostamiselle tai ilmaisille maininnoille kampanjoista, luojista, sivustoista ja tuotteista.</string>
<string name="internal_storage">Sisäinen tallennustila</string>
<string name="sdcard">SD-kortti</string>
<string name="music_directory">Musiikki kansio</string>
<string name="movies_directory">Elokuva kansio</string>
<string name="views">%1$s näyttökertaa</string>
<string name="defaultIcon">Oletus</string>
<string name="sponsorblock_summary">Käyttää https://sponsor.ajay.app ohjelmointirajapintaa</string>
<string name="category_intro_description">Aikaväli ilman mitään todellista sisältöä. Voi olla tauko, staattinen freimi tai toistuva animaatio. Ei tule käyttää siirroksiin, jotka sisältävät tietoa.</string>
<string name="category_interaction_description">Kun on lyhyt muistutus tykätä, tilata tai seurata sisällön keskellä. Jos se on pitkä tai jotain erityistä, sen tulisi olla itsensä mainostamista.</string>
<string name="category_outro">Loppukortit ja krediitit</string>
<string name="color_accent">Aksentit</string>
<string name="category_outro_description">Tiedot lopun jälkeen. Ei johtopäätöksille, jotka sisältävät tietoa.</string>
<string name="material_you">Mystinen materiaali 3</string>
<string name="update_available_text">Mene julkaisuihin Githubissa ladataksesi päivityksen\?</string>
<string name="app_behavior">Käytös</string>
<string name="download_directory">Lataa kohteeseen</string>
<string name="download_directory_summary">Sijainti, minne ladattu media tallennetaan.</string>
<string name="website_summary">Vieraile sivustolla saadaksesi lisää tietoa sovelluksesta ja sen ominaisuuksista.</string>
<string name="license_summary">GPLv3+ on copyleft-lisenssi. Käytä, opi, muuta ja jaa; kaikkien kanssa.</string>
<string name="contributing_summary">Tuota ideoita, käännöksiä, design muutoksia, puhdista ja kirjoita koodia. Mitä enemmän tulee tehtyä, sen paremmaksi se tulee!</string>
<string name="torchIcon">Trendikäs soihtu</string>
<string name="fireIcon">Muodikas tuli</string>
<string name="empty_instance">Täydennä nimi ja ohjelmointirajapinnan linkki.</string>
<string name="clear_customInstances">Tyhjennä mukautetut instanssit</string>
<string name="music_albums">YT Music Albumit</string>
<string name="show_chapters">Näytä osiot</string>
<string name="hide_chapters">Piilota osiot</string>
<string name="category_filler">Täytesisältö/Vitsit</string>
<string name="category_music_offtopic">Musiikki: Ei musiikkiosio</string>
<string name="category_preview">Esikatselu/Kertaus</string>
<string name="license">Lisenssi</string>
<string name="color_red">Levollinen punainen</string>
<string name="color_blue">Autuas sininen</string>
<string name="donate_summary">Anna sen verran, miten arvokas tämä on sinulle, jos voit. LibreTuben tiimi on pienempi kuin sinun lahjoitus tai apu.</string>
<string name="update">Etsi uutta versiota</string>
<string name="playback_speed">Oletustoistonopeus</string>
<string name="category_music_offtopic_description">Käyttö ainoastaan musiikki videoissa. Sen tulisi kattaa videon osat, jotka eivät ole osa virallisia mixejä. Videon tulee muistuttaa Spotifytä tai mitä tahansa muuta mixattua versiota mahdollisimman paljon tai vähentää puhumista tai muita häiriötekijöitä.</string>
<string name="category_preview_description">Segmenteille, jotka tarkentavat tulevaa sisältöä tässä tai tulevissa videoissa, mutta eivät tarjoa lisää tietoa. Jos se sisältää klippejä, jotka esiintyvät tässä, tämä on todennäköisesti väärä kategoria.</string>
<string name="color_yellow">Kellertävä keltainen</string>
<string name="update_summary">Paina selvittääksesi onko sovellus ajan tasalla.</string>
<string name="player">Ääni ja video</string>
<string name="download_folder">Nimi</string>
<string name="download_folder_summary">Kansion nimi, minne ladattu media on tallennettu.</string>
<string name="downloads_directory">Latauskansio</string>
<string name="shareTo">Jaa linkki kohteeseen</string>
<string name="legacyIcon">Kadotettu perintö</string>
<string name="shapedIcon">Hölmösti muotoiltu</string>
<string name="flameIcon">Lentävä liekki</string>
<string name="instance_summary">Piped, kirjautuminen, tilaukset</string>
<string name="customInstance_summary">Lisää oma instanssi (omalla vastuulla)</string>
<string name="instance_name">Instanssin nimi</string>
<string name="addInstance">Lisää instanssi</string>
<string name="version">Versio %1$s</string>
<string name="authors_summary">Tutustu kaikkiin, jotka ovat mukana kehittämässä ja parantamassa sovellusta.</string>
<string name="gradientIcon">Lipevä liukuväri</string>
<string name="birdIcon">Tehostettu lintu</string>
<string name="instance_api_url">Linkki instanssin ohjelmointirajapintaan</string>
<string name="invalid_url">Anna toimiva linkki</string>
<string name="about_summary">Tutustu LibreTuben tiimiin ja siihen, miten se kaikki tapahtuu.</string>
<string name="related_streams">Asiaan liittyvä sisältö</string>
<string name="related_streams_summary">Näytä aiheeseen liittyviä streameja katsomasi ohella.</string>
<string name="category_filler_description">Epäolennaisille kohtauksille, jotka lisätty vain täytteeksi tai huumori, joka on tarpeetonta ymmärtääkseen videon pääsisällön.</string>
<string name="playerVideoFormat">Video formaatti soittimelle</string>
<string name="buffering_goal">Esikuormitus</string>
<string name="buffering_goal_summary">Maksimi puskuroitavan videon sekuntimäärä.</string>
<string name="video_format_summary">Tiedostojen muuntaminen, jos sekä ääni että video ladataan.</string>
<string name="contributing">Projektin edistäminen</string>
<string name="no_update_available">Sinulla on viimeisin versio.</string>
<string name="no_audio">Ei ääntä</string>
<string name="no_video">Ei videota</string>
<string name="video">Video</string>
<string name="downloading">Ladataan</string>
<string name="audio">Ääni</string>
<string name="player_autoplay">Automaattinen toisto</string>
<string name="hideTrendingPage">Piilota trendaavat sivu</string>
<string name="instance_frontend_url">Linkki instanssin käyttöliittymään</string>
<string name="quality">Laatu</string>
<string name="behavior">Käytös</string>
<string name="player_summary">Laatu ja soittimen käytös</string>
<string name="seek_increment">Etsi lisäystä</string>
<string name="piped_summary">Piped on avoimen lähdekoodin vaihtoehtoinen web-käyttöliittymä YouTubelle, joka tarjoaa rajapinnan, jota käytämme. Ilman Pipediä, LibreTubea ei olisi. Suuret kiitokset sen kehittäjille!</string>
<string name="pauseOnScreenOff_summary">Pysäytä soitin, kun näyttö on pois päältä.</string>
<string name="pauseOnScreenOff">Automaattinen tauko</string>
<string name="autoplay_summary">Automaattisesti toistaa seuraavan videon kun nykyinen on päättynyt.</string>
<string name="clonePlaylist">Kloonaa soittolista</string>
</resources>

View File

@ -38,7 +38,7 @@
<string name="unknown_error">Erreur réseau.</string>
<string name="error">Quelque chose s\'est mal passé.</string>
<string name="empty">Le nom d\'utilisateur et le mot de passe ne peuvent pas être vides.</string>
<string name="notgmail">Ceci est pour un compte LibreTube.</string>
<string name="notgmail">Ceci est pour un compte Piped.</string>
<string name="defres">Résolution vidéo par défaut</string>
<string name="addToPlaylist">Ajouter à la liste de lecture</string>
<string name="success">Terminé.</string>
@ -203,4 +203,8 @@
<string name="pauseOnScreenOff_summary">Mettre le lecteur en pause lorsque l\'écran est éteint.</string>
<string name="autoplay_summary">Lancer automatiquement la vidéo suivante lorsque la vidéo en cours est terminée.</string>
<string name="clonePlaylist">Cloner la liste de lecture</string>
<string name="deleteAccount_summary">Supprimer votre compte Piped</string>
<string name="deleteAccount">Supprimer le compte</string>
<string name="account">Compte</string>
<string name="restore">Restaurer</string>
</resources>

View File

@ -27,9 +27,9 @@
<string name="app_theme">Tema dell\'app</string>
<string name="error">Qualcosa è andato storto.</string>
<string name="empty">Il nome utente e la password non possono essere vuoti.</string>
<string name="notgmail">Questo è per un account LibreTube.</string>
<string name="notgmail">Questo è per un account Piped.</string>
<string name="defres">Risoluzione video di Default</string>
<string name="dlisinprogress">Si prega di aspettare che tutti gli scaricamenti siano finiti…</string>
<string name="dlisinprogress">Un altro download è in corso, si prega di attendere che termini.</string>
<string name="unknown_error">Errore di connessione.</string>
<string name="server_error">Il server ha un problema. Prova un\'altra istanza\?</string>
<string name="customInstance">Istanza personalizzata</string>
@ -199,8 +199,12 @@
<string name="piped_summary">Piped è un\' alternativa web-frontend open-source per YouTube che fornisce l\'API che usiamo. Senza Piped, LibreTube non esisterebbe. Un enorme grazie ai loro sviluppatori!</string>
<string name="autoplay_summary">Riproduci automaticamente il video successivo quando quello corrente è finito.</string>
<string name="pauseOnScreenOff">Pausa automatica</string>
<string name="pauseOnScreenOff_summary">Metti in pausa il lettore quando lo schermo é spento.</string>
<string name="pauseOnScreenOff_summary">Metti in pausa il player quando lo schermo è spento.</string>
<string name="clonePlaylist">Clona playlist</string>
<string name="reset">Ripristina predefiniti</string>
<string name="reset_message">Sei sicuro\? Questo ti disconnetterà e ripristinerà tutte le tue impostazioni!</string>
<string name="reset_message">Sei sicuro/a\? Questo ti disconnetterà e ripristinerà tutte le tue impostazioni!</string>
<string name="deleteAccount">Elimina l\'account</string>
<string name="deleteAccount_summary">Elimina l\'account Piped</string>
<string name="restore">Ripristina</string>
<string name="account">Account</string>
</resources>

View File

@ -19,7 +19,7 @@
<string name="server_error">יש תקלה עם השרת. לנסות עותק אחר\?</string>
<string name="error">משהו השתבש.</string>
<string name="empty">עליך למלא שם משתמש וסיסמה.</string>
<string name="notgmail">זה לחשבון LibreTube.</string>
<string name="notgmail">זה לחשבון Piped.</string>
<string name="grid">עמודות רשת</string>
<string name="createPlaylist">יצירת רשימת נגינה</string>
<string name="playlistName">שם רשימת הנגינה</string>
@ -203,4 +203,8 @@
<string name="autoplay_summary">לנגן את הסרטון הבא אוטומטית כשהנוכחי מסתיים.</string>
<string name="reset">שחזור ברירות מחדל</string>
<string name="reset_message">להמשיך\? פעולה זו תוציא אותך מהמערכת ותאפס את כל ההגדרות שלך!</string>
<string name="account">חשבון</string>
<string name="restore">שחזור</string>
<string name="deleteAccount">מחיקת חשבון</string>
<string name="deleteAccount_summary">מחיקת חשבון ה־Piped</string>
</resources>

View File

@ -14,7 +14,7 @@
<string name="defres">Noklusējuma video izšķirtspēja</string>
<string name="playlistCreated">Atskaņošanas saraksts izveidots.</string>
<string name="already_logged_in">Jūs jau esat pierakstījies. Jūs varat izrakstīties no sava konta.</string>
<string name="notgmail">Šis ir LibreTube kontam.</string>
<string name="notgmail">Šis ir Piped kontam.</string>
<string name="registered">Jūsu konts ir reģistrēts. Tagad varat abonēt kanālus.</string>
<string name="startpage">Sākums</string>
<string name="login_register">Pierakstīties/reģistrēties</string>
@ -203,4 +203,8 @@
<string name="pauseOnScreenOff_summary">Iepauzēt atskaņotāju, kamēr ekrāns ir izslēgts.</string>
<string name="autoplay_summary">Automātiski atskaņot nākamo video, kad pašreizējais ir beidzies.</string>
<string name="clonePlaylist">Duplicēt atskaņošanas sarakstu</string>
<string name="deleteAccount">Izdzēst kontu</string>
<string name="deleteAccount_summary">Izdzēst Piped kontu</string>
<string name="restore">Atjaunot</string>
<string name="account">Konts</string>
</resources>

View File

@ -12,7 +12,7 @@
<string name="app_theme">Görünüm</string>
<string name="unknown_error">Bağlantı hatası.</string>
<string name="empty">Kullanıcı adı ve parola girmelisiniz.</string>
<string name="notgmail">Bu, LibreTube hesabı içindir.</string>
<string name="notgmail">Bu, Piped hesabı içindir.</string>
<string name="defres">Varsayılan Video Çözünürlüğü</string>
<string name="deletePlaylist">Oynatma listesini sil</string>
<string name="createPlaylist">Oynatma Listesi Oluştur</string>
@ -203,4 +203,8 @@
<string name="clonePlaylist">Oynatma listesini klonla</string>
<string name="reset">Varsayılanlara sıfırla</string>
<string name="reset_message">Emin misin\? Bu, oturumunuzu kapatacak ve tüm ayarlarınızı sıfırlayacaktır!</string>
<string name="deleteAccount_summary">Piped hesabınızı silin</string>
<string name="account">Hesap</string>
<string name="restore">Eski haline getir</string>
<string name="deleteAccount">Hesabı sil</string>
</resources>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_icon">Іконка Додатку</string>
<string name="app_icon">Іконка</string>
<string name="piped">Piped</string>
<string name="youtube">YouTube</string>
<string name="playOnBackground">Грати у фоновому режимі</string>
@ -11,8 +11,8 @@
<string name="empty">Вам необхідно ввести ім\'я користувача і пароль.</string>
<string name="clear_history">Очистити історію</string>
<string name="category_selfpromo_description">Схоже до \"Спонсор\" окрім неоплаченої або само промоції. Це включає секції про мерчандайз, донати, або інформацію про тих з ким вони співпрацювали.</string>
<string name="color_yellow">Жовтий</string>
<string name="color_accent">Колір Акценту</string>
<string name="color_yellow">Рухливий жовтий</string>
<string name="color_accent">Акценти</string>
<string name="startpage">Головна</string>
<string name="subscriptions">Підписки</string>
<string name="library">Бібліотека</string>
@ -20,7 +20,7 @@
<string name="search_hint">Пошук</string>
<string name="videos">Відео</string>
<string name="subscribe">Підписатися</string>
<string name="choose_quality_dialog">Обрати якість:</string>
<string name="choose_quality_dialog">Якість</string>
<string name="unsubscribe">Відписатися</string>
<string name="download">Завантажити</string>
<string name="save">Зберегти</string>
@ -33,17 +33,17 @@
<string name="loggedout">Вийшли.</string>
<string name="registered">Зареєстровано. Тепер Ви можете підписуватися на канали.</string>
<string name="already_logged_in">Уже ввійшли. Вам необхідно спершу вийти з аккаунту.</string>
<string name="login_first">Будь ласка, ввійдіть і спробуйте ще раз!</string>
<string name="login_first">Будь ласка, ввійдіть і спробуйте ще раз.</string>
<string name="instances">Виберіть сервер</string>
<string name="customInstance">Додати інший сервер</string>
<string name="region">Виберіть регіон</string>
<string name="login_register">Вхід/Реєстрація</string>
<string name="customInstance">Інший сервер</string>
<string name="region">Регіон</string>
<string name="login_register">Вхід/реєстрація</string>
<string name="please_login">Будь ласка, спочатку увійдіть або зареєструйтесь в налаштуваннях</string>
<string name="subscribeIsEmpty">Спочатку підпишіться на якісь канали.</string>
<string name="importsuccess">Підписки додано</string>
<string name="cannotDownload">Неможливо завантажити цей стрім.</string>
<string name="dlcomplete">Завантаження завершене.</string>
<string name="dlisinprogress">Інше завантаження вже в процесі. Будь ласка, зачекайте поки воно завершиться.</string>
<string name="dlisinprogress">Будь ласка, зачекайте поки воно завершиться</string>
<string name="vlc">Відкрити у VLC</string>
<string name="vlcerror">Неможливо відкрити у VLC. Ймовірно воно не інстальоване.</string>
<string name="import_from_yt">Імпорт підписок</string>
@ -51,33 +51,33 @@
<string name="app_theme">Тема</string>
<string name="unknown_error">Помилка мережі.</string>
<string name="error">Щось пішло не так.</string>
<string name="notgmail">Це не ваш аккаунт Gmail.</string>
<string name="notgmail">Це для акаунту Piped.</string>
<string name="defres">Розширення відео по замовчуванню</string>
<string name="grid">Виберіть стовбці поля</string>
<string name="grid">Стовпці сітки</string>
<string name="deletePlaylist">Видалити плейлист</string>
<string name="areYouSure">Видалити плейлист\?</string>
<string name="createPlaylist">Створити плейлист</string>
<string name="playlistCreated">Плейлист створено!</string>
<string name="playlistCreated">Плейлист створено.</string>
<string name="playlistName">Назва плейлисту</string>
<string name="emptyList">Тут нічого.</string>
<string name="emptyPlaylistName">Назва плейлисту не може бути порожньою</string>
<string name="addToPlaylist">Додати до плейлисту</string>
<string name="success">Успіх!</string>
<string name="success">Готово.</string>
<string name="fail">Невдача :(</string>
<string name="about">Про</string>
<string name="changeLanguage">Зміна мови</string>
<string name="systemLanguage">Системна мова</string>
<string name="systemDefault">По замовчуванню</string>
<string name="lightTheme">Світла тема</string>
<string name="darkTheme">Темна тема</string>
<string name="changeLanguage">Мова</string>
<string name="systemLanguage">Системна</string>
<string name="systemDefault">Системна</string>
<string name="lightTheme">Світла</string>
<string name="darkTheme">Темна</string>
<string name="subscribers">%1$s підписників</string>
<string name="settings">Налаштування</string>
<string name="location">Місце знаходження</string>
<string name="instance">Сервер</string>
<string name="customization">Налаштування</string>
<string name="customization">Коригування</string>
<string name="website">Веб-сторінка</string>
<string name="videoCount">%1$s відео</string>
<string name="noInternet">Відсутнє Інтернет з\'єднання</string>
<string name="noInternet">Спочатку підключіться до Інтернету.</string>
<string name="retry">Повторити</string>
<string name="comments">Коментарі</string>
<string name="choose_filter">Вибрати пошукові фільтри</string>
@ -98,47 +98,73 @@
<string name="sponsorblock_state">Увімкнено</string>
<string name="category_segments">Сегменти</string>
<string name="category_sponsor">Спонсор</string>
<string name="category_sponsor_description">Платні промоції, плантні реферали і прямі реклами. Не дня само-промоції або безкоштовних відгуків про причини/творці/веб-сайти/продукти, які їм подобаються.</string>
<string name="category_sponsor_description">Платні промоції, платні реферали та пряма реклама. Не для самореклами або чесних відгуків про творців, вебсайти та продукти які їм подобаються.</string>
<string name="category_selfpromo">Неоплачена/Само промоція</string>
<string name="category_interaction">Нагадування про дію (Підписатися)</string>
<string name="category_interaction_description">Там де є коротке нагадування про лайк, підписку або стежити за ними посеред контенту. Якщо воно довге або про щось специфічне, воно має бути під само-промоцією.</string>
<string name="category_interaction">Нагадування про взаємодію (лайк і підписка)</string>
<string name="category_interaction_description">Там де є коротке нагадування про те, щоб поставити лайк, підписатися або слідувати посеред контенту. Якщо це є довгим або про щось специфічне, воно тоді має бути само-промоцією.</string>
<string name="category_intro">Антракт/Вступна Анімація</string>
<string name="category_intro_description">Певний Інтервал без самого контенту. Може бути паузою, статичне зображення, повторювальна анімація. Це не слід використовувати для переходів, що містять інформацію.</string>
<string name="category_outro">Кінцеві картки/Титри</string>
<string name="category_outro_description">Титри або коли з\'являються кінцеві картки YouTube. Не для висновків з інформацією.</string>
<string name="category_intro_description">Певний Інтервал без самого контенту. Може бути паузою, статичне зображення, повторювальна анімація. Не слід використовувати для переходів, що містять інформацію.</string>
<string name="category_outro">Кінцеві картки та титри</string>
<string name="category_outro_description">Інформація яка слідує по завершені. Не для висновків з інформацією.</string>
<string name="license">Ліцензія</string>
<string name="color_red">Червоний</string>
<string name="color_blue">Синій піксель</string>
<string name="color_green">Зелений</string>
<string name="color_purple">Фіолетовий</string>
<string name="oledTheme">Тема для OLED</string>
<string name="material_you">Material You</string>
<string name="color_red">Заспокійливий червоний</string>
<string name="color_blue">Блаженний блакитний</string>
<string name="color_green">Ідеальний зелений</string>
<string name="color_purple">Приємний фіолетовий</string>
<string name="oledTheme">Чорний</string>
<string name="material_you">Містичний Material 3</string>
<string name="sponsorblock_notifications">Сповіщення</string>
<string name="enabled">Увімкнено</string>
<string name="disabled">Вимкнено</string>
<string name="no_replies">Цей коментар не має відповідей.</string>
<string name="authors">Автори</string>
<string name="download_folder_summary">Назва теки, у яку будуть збережені завантажені матеріали.</string>
<string name="download_folder">Назва теки</string>
<string name="download_folder">Назва</string>
<string name="internal_storage">Пам\'ять телефона</string>
<string name="downloads_directory">Тека завантажень</string>
<string name="movies_directory">Тека для відео</string>
<string name="music_directory">Тека для музики</string>
<string name="shareTo">Поділитися відео з:</string>
<string name="movies_directory">Відео тека</string>
<string name="music_directory">Музична тека</string>
<string name="shareTo">Поділитися посиланням з</string>
<string name="update_available">Версія %1$s доступна</string>
<string name="update_available_text">Нове оновлення доступно. Натисніть ОК щоб перейти на сторінку оновлень GitHub.</string>
<string name="update_available_text">Перейти до релізів на GitHub, щоб завантажити\?</string>
<string name="downloads">Завантаження</string>
<string name="video_format">Формат відео</string>
<string name="website_summary">Відвідайте наш сайт, щоб взнати більше про додаток та його функції.</string>
<string name="website_summary">Відвідайте сайт для більшої інформації про додаток та його функції.</string>
<string name="contributing">Внесок</string>
<string name="contributing_summary">Будь-яка допомога: нові ідеї, переклади, зміни у дизайні, чистка або зміни до коду, — допоможе цьому проєкту. Чим більше зроблено, тим краще!</string>
<string name="license_summary">Публічна ліцензія GNU - це безкоштовна копілефт ліцензія для додатків та інших видів робіт.</string>
<string name="update">Оновлення додатку</string>
<string name="update_summary">Натисніть тут, щоб перевірити наявність нових оновлень.</string>
<string name="app_uptodate">Додаток актуальний</string>
<string name="contributing_summary">Надавайте ідеї, перекладайте, змінюйте дизайн, чистіть або змінюйте код. Чим більше зроблено, тим краще!</string>
<string name="license_summary">GPLv3+ - це ліцензія на копілефтовану лібре. Використовувати, вивчати, змінювати і ділитися; з усіма.</string>
<string name="update">Шукати нову версію</string>
<string name="update_summary">Натисніть для перевірки чи додаток оновлений.</string>
<string name="app_uptodate">Це остання версія.</string>
<string name="playback_speed">Стандартна швидкість відтворення</string>
<string name="player">Програвач</string>
<string name="appearance_summary">Зробіть додаток таким, яким ви хочете його бачити.</string>
<string name="advanced_summary">Програвач, завантаження, історія</string>
<string name="player">Аудіо і відео</string>
<string name="appearance_summary">Змініть додаток так, як вам до вподоби.</string>
<string name="advanced_summary">Завантаження, історія</string>
<string name="live">Пряма трансляція</string>
<string name="advanced">Розширене</string>
<string name="sdcard">SD карта</string>
<string name="views">%1$s переглядів</string>
<string name="defaultIcon">По замовчуванню</string>
<string name="download_directory_summary">Де зберігаються завантажені медіа.</string>
<string name="video_format_summary">Перетворення файлів, якщо аудіо і відео завантажені.</string>
<string name="donate_summary">Дайте те, чого це варте для вас, якщо зможете. Команда LibreTube менша, ніж ваша пожертва чи допомога.</string>
<string name="authors_summary">Познайомтеся з усіма, хто бере участь у розробці та вдосконаленні програми.</string>
<string name="legacyIcon">Втрачена популярність</string>
<string name="no_update_available">Ви використовуєте останню версію.</string>
<string name="gradientIcon">Градієнт Glib</string>
<string name="flameIcon">Літаючий вогонь</string>
<string name="birdIcon">Посилений птах</string>
<string name="category_filler">Катсцени/Жарти</string>
<string name="category_filler_description">Для катсцен доданих лише для заповнення або гумор який не потребується для розуміння основного змісту відео.</string>
<string name="category_music_offtopic">Музика: Немузична секція</string>
<string name="category_preview">Огляд/Підсумок</string>
<string name="fireIcon">Красивий вогонь</string>
<string name="torchIcon">Популярний факел</string>
<string name="shapedIcon">Безглуздої форми</string>
<string name="category_music_offtopic_description">Тільки для використання в музичних кліпах. Він повинен охоплювати частини відео, а не частину офіційних міксів. Зрештою, відео має максимально нагадувати Spotify або будь-яку іншу змішану версію, або зменшувати розмови чи інші відволікання.</string>
<string name="category_preview_description">Для сегментів, що деталізують майбутній вміст у цьому або майбутньому відео у своїй серії, але не надають додаткової інформації. Якщо він включає в себе кліпи, які тільки з\'являються тут, це, швидше за все, неправильна категорія.</string>
<string name="appearance">Вид</string>
<string name="app_behavior">Поведінка</string>
<string name="download_directory">Завантажити до</string>
<string name="donate">Пожертвувати</string>
</resources>

View File

@ -69,7 +69,7 @@
<string name="clear_history">清除历史记录</string>
<string name="music_videos">YT Music 视频</string>
<string name="music_playlists">YT Music 播放列表</string>
<string name="notgmail">请在此输入 LibreTube 账户。</string>
<string name="notgmail">请在此输入 Piped 账户。</string>
<string name="defres">默认分辨率</string>
<string name="playlistCreated">已创建播放列表。</string>
<string name="lightTheme">浅色</string>
@ -203,4 +203,8 @@
<string name="category_preview_description">对于详细说明此系列视频或未来视频中即将出现的内容的片段,但不提供其他信息。如果它包含仅出现在此处的剪辑,则这很可能是错误的类别。</string>
<string name="reset">恢复默认值</string>
<string name="reset_message">你确定吗?这会让你退出账户并重置你的所有设置!</string>
<string name="deleteAccount_summary">删除你的 Piped 账户</string>
<string name="account">账户</string>
<string name="restore">恢复</string>
<string name="deleteAccount">删除账户</string>
</resources>

View File

@ -32,7 +32,7 @@
<string name="subscribeIsEmpty">Subscribe to some channels first.</string>
<string name="cannotDownload">Can\'t download this stream.</string>
<string name="dlcomplete">Download completed.</string>
<string name="dlisinprogress">Please wait till all downloads are finished…</string>
<string name="dlisinprogress">Another download is already in progress, please wait until it\'s finished.</string>
<string name="downloadfailed">Download failed.</string>
<string name="vlc">Open in VLC</string>
<string name="vlcerror">Can\'t open in VLC. It might not be installed.</string>
@ -207,4 +207,4 @@
<string name="deleteAccount_summary">Delete your Piped account</string>
<string name="account">Account</string>
<string name="restore">Restore</string>
</resources>
</resources>

View File

@ -30,20 +30,12 @@
<item name="android:layout_height">wrap_content</item>
<item name="android:paddingLeft">20dp</item>
<item name="android:paddingRight">20dp</item>
<item name="android:paddingTop">15dp</item>
<item name="android:paddingBottom">15dp</item>
<item name="android:paddingTop">12dp</item>
<item name="android:paddingBottom">12dp</item>
<item name="android:background">?android:attr/selectableItemBackground</item>
</style>
<style name="HorizontalLine">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">0.8dp</item>
<item name="android:background">@android:color/darker_gray</item>
</style>
<style name="CustomDialogButton" parent="@style/Widget.Material3.Button.TextButton">
<item name="android:layout_width">wrap_content</item>
@ -71,4 +63,15 @@
</style>
<style name="PlayerActionsLayout">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_weight">1</item>
<item name="android:background">?attr/selectableItemBackgroundBorderless</item>
<item name="android:gravity">center</item>
<item name="android:orientation">vertical</item>
</style>
</resources>