Merge branch 'master' into librarysyncservicebounded

Conflicts:
	app/src/main/java/org/xbmc/kore/ui/ArtistListFragment.java
This commit is contained in:
martijn 2015-09-04 11:24:57 +02:00
commit bee35c216d
10 changed files with 407 additions and 53 deletions

View File

@ -41,6 +41,7 @@ import android.widget.AdapterView;
import android.widget.CursorAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
@ -49,10 +50,12 @@ import org.xbmc.kore.host.HostInfo;
import org.xbmc.kore.host.HostManager;
import org.xbmc.kore.jsonrpc.ApiException;
import org.xbmc.kore.jsonrpc.event.MediaSyncEvent;
import org.xbmc.kore.jsonrpc.type.PlaylistType;
import org.xbmc.kore.provider.MediaContract;
import org.xbmc.kore.provider.MediaDatabase;
import org.xbmc.kore.service.LibrarySyncService;
import org.xbmc.kore.utils.LogUtils;
import org.xbmc.kore.utils.MediaManager;
import org.xbmc.kore.utils.UIUtils;
import butterknife.ButterKnife;
@ -209,7 +212,7 @@ public class AlbumListFragment extends AbstractMusicListFragment {
final int YEAR = 6;
}
private static class AlbumsAdapter extends CursorAdapter {
private class AlbumsAdapter extends CursorAdapter {
private HostManager hostManager;
private int artWidth, artHeight;
@ -264,6 +267,11 @@ public class AlbumListFragment extends AbstractMusicListFragment {
UIUtils.loadImageWithCharacterAvatar(context, hostManager,
thumbnail, viewHolder.albumTitle,
viewHolder.artView, artWidth, artHeight);
// For the popupmenu
ImageView contextMenu = (ImageView)view.findViewById(R.id.list_context_menu);
contextMenu.setTag(viewHolder);
contextMenu.setOnClickListener(albumlistItemMenuClickListener);
}
}
@ -279,4 +287,32 @@ public class AlbumListFragment extends AbstractMusicListFragment {
int albumId;
String albumTitle;
}
private View.OnClickListener albumlistItemMenuClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
final ViewHolder viewHolder = (ViewHolder)v.getTag();
final PlaylistType.Item playListItem = new PlaylistType.Item();
playListItem.albumid = viewHolder.albumId;
final PopupMenu popupMenu = new PopupMenu(getActivity(), v);
popupMenu.getMenuInflater().inflate(R.menu.musiclist_item, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_play:
MediaManager.play(AlbumListFragment.this, playListItem);
return true;
case R.id.action_queue:
MediaManager.queueAudio(AlbumListFragment.this, playListItem);
return true;
}
return false;
}
});
popupMenu.show();
}
};
}

View File

@ -34,14 +34,17 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import org.xbmc.kore.R;
import org.xbmc.kore.host.HostInfo;
import org.xbmc.kore.host.HostManager;
import org.xbmc.kore.jsonrpc.type.PlaylistType;
import org.xbmc.kore.provider.MediaContract;
import org.xbmc.kore.provider.MediaDatabase;
import org.xbmc.kore.utils.LogUtils;
import org.xbmc.kore.utils.MediaManager;
import org.xbmc.kore.utils.UIUtils;
/**
@ -139,7 +142,7 @@ public class ArtistListFragment extends AbstractMusicListFragment {
final int THUMBNAIL = 4;
}
private static class ArtistsAdapter extends CursorAdapter {
private class ArtistsAdapter extends CursorAdapter {
private HostManager hostManager;
private int artWidth, artHeight;
@ -188,6 +191,11 @@ public class ArtistListFragment extends AbstractMusicListFragment {
UIUtils.loadImageWithCharacterAvatar(context, hostManager,
thumbnail, viewHolder.artistName,
viewHolder.artView, artWidth, artHeight);
// For the popupmenu
ImageView contextMenu = (ImageView)view.findViewById(R.id.list_context_menu);
contextMenu.setTag(viewHolder);
contextMenu.setOnClickListener(artistlistItemMenuClickListener);
}
}
@ -202,4 +210,32 @@ public class ArtistListFragment extends AbstractMusicListFragment {
int artistId;
String artistName;
}
private View.OnClickListener artistlistItemMenuClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
final ViewHolder viewHolder = (ViewHolder)v.getTag();
final PlaylistType.Item playListItem = new PlaylistType.Item();
playListItem.artistid = viewHolder.artistId;
final PopupMenu popupMenu = new PopupMenu(getActivity(), v);
popupMenu.getMenuInflater().inflate(R.menu.musiclist_item, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_play:
MediaManager.play(ArtistListFragment.this, playListItem);
return true;
case R.id.action_queue:
MediaManager.queueAudio(ArtistListFragment.this, playListItem);
return true;
}
return false;
}
});
popupMenu.show();
}
};
}

View File

@ -41,6 +41,7 @@ import android.widget.AdapterView;
import android.widget.CursorAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
@ -49,9 +50,11 @@ import org.xbmc.kore.host.HostInfo;
import org.xbmc.kore.host.HostManager;
import org.xbmc.kore.jsonrpc.ApiException;
import org.xbmc.kore.jsonrpc.event.MediaSyncEvent;
import org.xbmc.kore.jsonrpc.type.PlaylistType;
import org.xbmc.kore.provider.MediaContract;
import org.xbmc.kore.service.LibrarySyncService;
import org.xbmc.kore.utils.LogUtils;
import org.xbmc.kore.utils.MediaManager;
import org.xbmc.kore.utils.UIUtils;
import butterknife.ButterKnife;
@ -152,7 +155,7 @@ public class AudioGenresListFragment extends AbstractMusicListFragment {
final int THUMBNAIL = 3;
}
private static class AudioGenresAdapter extends CursorAdapter {
private class AudioGenresAdapter extends CursorAdapter {
private HostManager hostManager;
private int artWidth, artHeight;
@ -198,6 +201,11 @@ public class AudioGenresListFragment extends AbstractMusicListFragment {
UIUtils.loadImageWithCharacterAvatar(context, hostManager,
thumbnail, viewHolder.genreTitle,
viewHolder.artView, artWidth, artHeight);
// For the popupmenu
ImageView contextMenu = (ImageView)view.findViewById(R.id.list_context_menu);
contextMenu.setTag(viewHolder);
contextMenu.setOnClickListener(genrelistItemMenuClickListener);
}
}
@ -211,4 +219,32 @@ public class AudioGenresListFragment extends AbstractMusicListFragment {
int genreId;
String genreTitle;
}
private View.OnClickListener genrelistItemMenuClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
final ViewHolder viewHolder = (ViewHolder)v.getTag();
final PlaylistType.Item playListItem = new PlaylistType.Item();
playListItem.genreid = viewHolder.genreId;
final PopupMenu popupMenu = new PopupMenu(getActivity(), v);
popupMenu.getMenuInflater().inflate(R.menu.musiclist_item, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_play:
MediaManager.play(AudioGenresListFragment.this, playListItem);
return true;
case R.id.action_queue:
MediaManager.queueAudio(AudioGenresListFragment.this, playListItem);
return true;
}
return false;
}
});
popupMenu.show();
}
};
}

View File

@ -137,14 +137,22 @@ public class SendTextDialogFragment extends DialogFragment {
textToSend.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEND) {
mListener.onSendTextFinished(
textToSend.getText().toString(),
finishAfterSend.isChecked());
if (actionId == EditorInfo.IME_ACTION_SEND ) {
onSendTextFinished();
} // handles enter key on external keyboard, issue #99
else if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED &&
(event != null && event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
onSendTextFinished();
}
dialog.dismiss();
return false;
}
private void onSendTextFinished() {
mListener.onSendTextFinished(
textToSend.getText().toString(),
finishAfterSend.isChecked());
}
});
return dialog;
}

View File

@ -0,0 +1,142 @@
/*
* Copyright 2015 Synced Synapse. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbmc.kore.utils;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.view.View;
import android.widget.Toast;
import org.xbmc.kore.R;
import org.xbmc.kore.Settings;
import org.xbmc.kore.host.HostManager;
import org.xbmc.kore.jsonrpc.ApiCallback;
import org.xbmc.kore.jsonrpc.method.Player;
import org.xbmc.kore.jsonrpc.method.Playlist;
import org.xbmc.kore.jsonrpc.type.PlaylistType;
import org.xbmc.kore.ui.RemoteActivity;
import java.util.ArrayList;
public class MediaManager {
/**
* Clears current playlist and starts playing item
* @param fragment Fragment instance from which this method is called
* @param item PlaylistType.Item that needs to be played
*/
public static void play(final Fragment fragment, final PlaylistType.Item item) {
HostManager hostManager = HostManager.getInstance(fragment.getActivity());
final Handler callbackHandler = new Handler();
final Context context = fragment.getActivity();
Player.Open action = new Player.Open(item);
action.execute(hostManager.getConnection(), new ApiCallback<String>() {
@Override
public void onSuccess(String result) {
if (!fragment.isAdded()) return;
boolean switchToRemote = PreferenceManager
.getDefaultSharedPreferences(context)
.getBoolean(Settings.KEY_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START,
Settings.DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START);
if (switchToRemote) {
Intent launchIntent = new Intent(context, RemoteActivity.class);
context.startActivity(launchIntent);
} else {
Toast.makeText(context, R.string.now_playing, Toast.LENGTH_SHORT)
.show();
}
}
@Override
public void onError(int errorCode, String description) {
if (!fragment.isAdded()) return;
// Got an error, show toast
String errorMessage = context.getString(R.string.error_play_media_file, description);
Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT)
.show();
}
}, callbackHandler);
}
/**
* Clears current playlist and starts playing item
* @param fragment Fragment instance from which this method is called
* @param item PlaylistType.Item that needs to be added to the current audio playlist
*/
public static void queueAudio(final Fragment fragment, final PlaylistType.Item item) {
Playlist.GetPlaylists getPlaylists = new Playlist.GetPlaylists();
final Handler callbackHandler = new Handler();
final Context context = fragment.getActivity();
final HostManager hostManager = HostManager.getInstance(fragment.getActivity());
getPlaylists.execute(hostManager.getConnection(), new ApiCallback<ArrayList<PlaylistType.GetPlaylistsReturnType>>() {
@Override
public void onSuccess(ArrayList<PlaylistType.GetPlaylistsReturnType> result) {
if (!fragment.isAdded()) return;
// Ok, loop through the playlists, looking for the audio one
int audioPlaylistId = -1;
for (PlaylistType.GetPlaylistsReturnType playlist : result) {
if (playlist.type.equals(PlaylistType.GetPlaylistsReturnType.AUDIO)) {
audioPlaylistId = playlist.playlistid;
break;
}
}
// If found, add to playlist
if (audioPlaylistId != -1) {
Playlist.Add action = new Playlist.Add(audioPlaylistId, item);
action.execute(hostManager.getConnection(), new ApiCallback<String>() {
@Override
public void onSuccess(String result) {
if (!fragment.isAdded()) return;
Toast.makeText(context, R.string.item_added_to_playlist, Toast.LENGTH_SHORT)
.show();
}
@Override
public void onError(int errorCode, String description) {
if (!fragment.isAdded()) return;
// Got an error, show toast
String errorMessage = context.getString(R.string.error_queue_media_file, description);
Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT)
.show();
}
}, callbackHandler);
} else {
Toast.makeText(context, R.string.no_suitable_playlist, Toast.LENGTH_SHORT)
.show();
}
}
@Override
public void onError(int errorCode, String description) {
if (!fragment.isAdded()) return;
// Got an error, show toast
Toast.makeText(context, R.string.error_getting_playlist, Toast.LENGTH_SHORT)
.show();
}
}, callbackHandler);
}
}

View File

@ -35,28 +35,43 @@
android:layout_alignParentLeft="true"
android:contentDescription="@string/poster"/>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/art"
<ImageView
android:id="@+id/list_context_menu"
android:layout_width="@dimen/default_icon_size"
android:layout_height="@dimen/default_icon_size"
android:padding="@dimen/default_icon_padding"
android:layout_alignTop="@id/art"
style="@style/TextAppearance.Medialist.Title"/>
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/title"
android:layout_below="@id/title"
style="@style/TextAppearance.Medialist.Details"/>
android:layout_alignParentRight="true"
style="@style/Widget.Button.Borderless"
android:src="?attr/iconOverflow"
android:contentDescription="@string/action_options"/>
<TextView
android:id="@+id/genres"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/name"
android:layout_alignLeft="@id/title"
android:layout_alignParentBottom="true"
style="@style/TextAppearance.Medialist.OtherInfo"/>
android:orientation="vertical"
android:layout_toLeftOf="@+id/list_context_menu"
android:layout_toRightOf="@id/art"
android:layout_alignTop="@id/art">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextAppearance.Medialist.Title"/>
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextAppearance.Medialist.Details"/>
<TextView
android:id="@+id/genres"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextAppearance.Medialist.OtherInfo"/>
</LinearLayout>
</RelativeLayout>
</android.support.v7.widget.CardView>

View File

@ -35,9 +35,10 @@
android:contentDescription="@string/poster"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:id="@+id/name"
@ -53,5 +54,14 @@
android:paddingBottom="0dp"/>
</LinearLayout>
<ImageView
android:id="@+id/list_context_menu"
android:layout_width="@dimen/default_icon_size"
android:layout_height="@dimen/default_icon_size"
android:padding="@dimen/default_icon_padding"
style="@style/Widget.Button.Borderless"
android:src="?attr/iconOverflow"
android:contentDescription="@string/action_options"/>
</LinearLayout>
</android.support.v7.widget.CardView>

View File

@ -34,11 +34,21 @@
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"
style="@style/TextAppearance.Medialist.Title"
android:paddingTop="0dp"
android:paddingBottom="0dp"
android:gravity="center_vertical"/>
<ImageView
android:id="@+id/list_context_menu"
android:layout_width="@dimen/default_icon_size"
android:layout_height="@dimen/default_icon_size"
android:padding="@dimen/default_icon_padding"
style="@style/Widget.Button.Borderless"
android:src="?attr/iconOverflow"
android:contentDescription="@string/action_options"/>
</LinearLayout>
</android.support.v7.widget.CardView>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2015 Synced Synapse. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_play"
android:title="@string/play"
android:orderInCategory="1"
app:showAsAction="never" />
<item android:id="@+id/action_queue"
android:title="@string/add_to_playlist"
android:orderInCategory="2"
app:showAsAction="never" />
</menu>

View File

@ -23,17 +23,19 @@
<string name="loading">Зареждане…</string>
<!-- Navigation drawer tips -->
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
<string name="xbmc_media_center">Медиен център</string>
<string name="home">Начален екран</string>
<string name="movies">Филми</string>
<string name="tv_shows">ТВ Сериали</string>
<string name="music">Музика</string>
<string name="pictures">Снимки</string>
<string name="xbmc_media_center">Медиен център</string>
<string name="home">Начален екран</string>
<string name="movies">Филми</string>
<string name="tv_shows">ТВ Сериали</string>
<string name="music">Музика</string>
<string name="pictures">Снимки</string>
<string name="addons">Добавки</string>
<string name="files">Файлове</string>
<string name="video">Видео</string>
<string name="file_browser">Диспечер на файлове</string>
<string name="no_xbmc_configured">Няма настроен медиен център</string>
<string name="add_xbmc">Добавяне на медиен център</string>
@ -43,6 +45,7 @@
<string name="power">Изключи...</string>
<string name="quit">Изход</string>
<string name="suspend">Суспендиране</string>
<string name="reboot">Рестартиране</string>
<string name="shutdown">Изключване</string>
<string name="send">Изпрати</string>
@ -77,7 +80,7 @@
Докоснете <i>Повторно търсене</i> за втори опит или <i>Напред</i> за ръчно настройване.
]]></string>
<string name="wizard_search_host_found"><![CDATA[
В локалната мрежа са открити следните медийни центрове.<br/><br/>Изберет кой да бъде добавен или докоснете <i>Напред</i> за ръчно добавяне.
В локалната мрежа са открити следните медийни центрове.<br/><br/>Изберете кой да бъде добавен или докоснете <i>Напред</i> за ръчно добавяне.
]]></string>
<string name="searching">Търсене…</string>
<string name="no_xbmc_found">Няма открити медийни центрове</string>
@ -93,11 +96,15 @@
<string name="wizard_xbmc_tcp_port">TCP порт (9090)</string>
<string name="wizard_xbmc_mac_address">MAC адрес</string>
<string name="wizard_xbmc_wol_port">WoL порт (9)</string>
<string name="wizard_xbmc_use_tcp">Ползвай TCP</string>
<string name="wizard_xbmc_event_server_port">СС порт (9777)</string>
<string name="wizard_xbmc_use_event_server">Ползвай Сървър за Събития</string>
<string name="wizard_no_name_specified">Моля, въведете име за медийния център, с което ще го отличавате по-късно.</string>
<string name="wizard_no_address_specified">Моля, въведете адреса на медийния център, за да бъде открит.</string>
<string name="wizard_invalid_http_port_specified">Моля, въведете HTTP порт за медийния център, за да бъде открит.</string>
<string name="wizard_invalid_tcp_port_specified">Моля, въведете TCP порт за медийния център, за да бъде открит.</string>
<string name="wizard_invalid_http_port_specified">Моля, въведете HTTP порт за медийния център.</string>
<string name="wizard_invalid_tcp_port_specified">Моля, въведете TCP порт за медийния център.</string>
<string name="wizard_invalid_es_port_specified">Моля, въведете порта на Сървъра за Събития за медийния център.</string>
<string name="wizard_connecting_to_xbmc_title">Свързване към %1$s…</string>
<string name="wizard_connecting_to_xbmc_message">Моля, изчакайте докато връзката се тества…</string>
@ -114,6 +121,9 @@
Докоснете <b><i>Завършено</i></b> за да започнете да ползвате дистанционното.
]]></string>
<string name="wizard_zeroconf_no_host_address">Адресът на медийният център не може да бъде открит!</string>
<string name="wizard_zeroconf_cant_connect_no_host_address">Свързването с медийния център не е възможно, защото адреса му не може да бъде открит.</string>
<string name="play">Възпроизведи</string>
<string name="pause">Пауза</string>
<string name="stop">Стоп</string>
@ -130,6 +140,8 @@
<string name="no_audiostream">Няма налични аудио потоци</string>
<string name="download_subtitle">Сваляне на субтитри</string>
<string name="none">Няма</string>
<string name="audio_sync">Sync audio</string>
<string name="subtitle_sync">Sync subtitles</string>
<string name="left">Наляво</string>
<string name="right">Надясно</string>
@ -138,7 +150,7 @@
<string name="select">Избор</string>
<string name="info">Информация</string>
<string name="codec_info">Кодек</string>
<string name="context">Контекст</string>
<string name="context">Контекстно меню</string>
<string name="osd">Меню</string>
<string name="back">Назад</string>
@ -153,7 +165,10 @@
<string name="wake_up">Събуждане</string>
<string name="edit_xbmc">Редактиране на медиен център</string>
<string name="delete_xbmc">Изтриване на медиен център</string>
<string name="delete_xbmc_confirm">Желаете медийният център да бъде изтрит?</string>
<string name="delete_xbmc_confirm">Желаете ли медийният център да бъде изтрит?</string>
<string name="queue_file">На опашката</string>
<string name="play_file">Възпроизведи</string>
<string name="play_from_here">Възпроизведи от тук</string>
<string name="connecting_to_xbmc">Свързване…</string>
<string name="unable_to_connect_to_xbmc">Свързването с медийния център не е възможно</string>
@ -178,7 +193,7 @@
<string name="max_rating_music">/5</string>
<string name="fanart">Фен-арт</string>
<string name="poster">Постер</string>
<string name="poster">Плакат</string>
<string name="thumbnail">Миниатюра</string>
<string name="error_getting_properties">Свойствата на Kodi/XBMC не са достъпни.\nГрешка:
@ -186,40 +201,52 @@
<string name="error_executing_subtitles">Добавката за субтитри не може да бъде стартирана.\nГрешка: %1$s.</string>
<string name="error_getting_addon_info">Информацията за добавката не е достъпна.\nГрешка:
%1$s.</string>
<string name="error_getting_source_info">Списъкът на файлове не е достъпен.\nГрешка:
%1$s.</string>
<string name="error_play_media_file">Файлът не може да бъде възпроизведен.\nГрешка:
%1$s.</string>
<string name="error_queue_media_file">Файлът не може да бъде добавен към опашката.\nГрешка:
%1$s.</string>
<string name="error_get_active_player">Couldn\'t get active player.\nГрешка:
%1$s.</string>
<string name="directors">Режисьор:</string>
<string name="studio">Студио:</string>
<string name="cast">Участници</string>
<string name="additional_cast">Други участници</string>
<string name="cast_list_text">%1$s като %2$s</string>
<!-- String to be used as the text on the cast grid view, when there is more actors than are shown -->
<string name="remaining_cast_count">Още %d</string>
<string name="general_error_executing_action">Грешка при изпълнение на действие: %1$s</string>
<string name="error_getting_playlist">Грешка при изтеглянето на плейлист</string>
<string name="error_message">Грешка: %1$s</string>
<string name="playlist_empty">Празен плейлист</string>
<string name="clear_playlist">Изчисти плейлиста</string>
<string name="source_empty">Източникът на медия е празен</string>
<string name="no_movies_found_refresh">Няма открити филми\n\nПлъзнете надолу за обновяване</string>
<string name="no_tvshows_found_refresh">Няма открити ТВ Сериали\n\nПлъзнете надолу за обновяване</string>
<string name="no_episodes_found">Няма открити епизоди</string>
<string name="no_artists_found_refresh">No artists found\n\nПлъзнете надолу за обновяване</string>
<string name="no_artists_found_refresh">Няма открити артисти\n\nПлъзнете надолу за обновяване</string>
<string name="no_albums_found_refresh">Няма открити албуми\n\nПлъзнете надолу за обновяване</string>
<string name="no_genres_found_refresh">Няма открити жанрове\n\nПлъзнете надолу за обновяване</string>
<string name="no_addons_found_refresh">Няма открити добавки или няма връзка\n\nПлъзнете надолу за обновяване</string>
<string name="no_music_videos_found_refresh">Няма открити клипове\n\nПлъзнете надолу за обновяване</string>
<string name="pull_to_refresh">Плъзнете за обновяване</string>
<string name="no_cast_info">Няма информация за участниците</string>
<string name="minutes_abbrev">%1$s мин</string>
<string name="sync_successful">Успешно синхронизиране</string>
<string name="error_while_syncing">Възникна грешка при синхронизирането: %1$s</string>
<string name="action_search">Търсене</string>
<string name="action_search_movies">Търси филм</string>
<string name="action_search_tvshows">Търси ТВ Сериал</string>
<string name="action_search_albums">Търси албум</string>
<string name="action_search_artists">Търси артист</string>
<string name="action_search_genres">Търси жанр</string>
<string name="action_search_music_videos">Търси клип</string>
<string name="action_search_movies">Търсене за филм</string>
<string name="action_search_tvshows">Търсене за ТВ Сериал</string>
<string name="action_search_albums">Търсене за албум</string>
<string name="action_search_artists">Търсене за артист</string>
<string name="action_search_genres">Търсене за жанр</string>
<string name="action_search_music_videos">Търсене за клип</string>
<string name="add_to_playlist">Добави към плейлист</string>
<string name="item_added_to_playlist">Добавен към плейлист</string>
@ -229,6 +256,10 @@
<string name="seen">Гледан</string>
<string name="download">Сваляне</string>
<string name="confirm_movie_download">Желаете ли да свалите филма?\nСвалянето ще започне на заден фон и най-вероятно ще отнеме известно време.</string>
<string name="confirm_episode_download">Желаете ли да свалите епизода?\nСвалянето ще започне на заден фон и най-вероятно ще отнеме известно време.</string>
<string name="confirm_album_download">Желаете ли да свалите албума?\nСвалянето ще започне на заден фон и най-вероятно ще отнеме известно време.</string>
<string name="download_file_exists">Файлът съществува.\nДа бъде презаписан или свален с ново име?</string>
<string name="download_dir_exists">Директорията вече съществува.\nАко съществуват и файлове със същото име да бъдат презаписани или свалени с ново име?</string>
<string name="overwrite">Презаписване</string>
@ -251,13 +282,13 @@
<string name="author">Автор:</string>
<string name="version">Версия:</string>
<string name="enable_disable">Вкл./Изкл. на добавка</string>
<string name="enable_disable">Вкл./Изкл. на добавката</string>
<string name="addon_enabled">Добавката е включена</string>
<string name="addon_disabled">Добавката е изключена</string>
<!-- Filters on list menus -->
<string name="hide_watched">Без гледаните</string>
<string name="sort_order">Сортирай по</string>
<string name="sort_order">Сортирай по</string>
<string name="sort_by_name">име</string>
<string name="sort_by_date_added">дата на добавяне</string>
<string name="ignore_prefixes">Игнорирай представките</string>
@ -273,13 +304,14 @@
<string name="switch_to_remote">Към дистанционното след стартиране</string>
<string name="show_notification">Показвай известия и при възпроизвеждане</string>
<string name="use_hardware_volume_keys">Контрол на звука с клавишите за сила за звука</string>
<string name="vibrate_on_remote">Вибриране при натискане на бутон</string>
<string name="about">За приложението</string>
<string name="about_desc"><![CDATA[
\u00A9 2015 XBMC Foundation.<br><br>
Моля, оценете ни в <b><a href="market://details?id=org.xbmc.kore">Google Play</a></b><br><br>
If you need help, check our <b><a href="http://forum.kodi.tv/forumdisplay.php?fid=129">forum</a></b>
Ако се нуждаете от помощ посетете форума: <b><a href="http://forum.kodi.tv/forumdisplay.php?fid=129">forum</a></b>
]]></string>
<!--&lt;!&ndash; String for coffee &ndash;&gt;-->
@ -294,4 +326,6 @@
<!--<string name="error_during_purchased">Възникна грешка по време на закупуването.</string>-->
<!--<string name="purchase_thanks">Благодаря за подкрепата!</string>-->
<string name="play_on_kodi">Kodi</string>
</resources>