Browse Source

ML: refactor method to get history

lastMediaPlayed() and lastPlayedStreams are merged into history(int
type) that takes a HISTORY_TYPE_GLOBAL/LOCAL/NETWORK parameter to
indicate what to query
merge-requests/1990/head
Duncan McNamara 3 years ago
parent
commit
fd03d6ad1a
  1. 4
      application/television/src/main/java/org/videolan/television/viewmodel/MainTvModel.kt
  2. 2
      application/vlc-android/src/org/videolan/vlc/ArtworkProvider.kt
  3. 4
      application/vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt
  4. 8
      application/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.kt
  5. 4
      application/vlc-android/src/org/videolan/vlc/viewmodels/HistoryModel.kt
  6. 3
      application/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt
  7. 2
      application/webserver/src/main/java/org/videolan/vlc/webserver/RemoteAccessRouting.kt
  8. 10
      medialibrary/jni/AndroidMediaLibrary.cpp
  9. 3
      medialibrary/jni/AndroidMediaLibrary.h
  10. 23
      medialibrary/jni/medialibrary.cpp
  11. 12
      medialibrary/src/org/videolan/medialibrary/MedialibraryImpl.java
  12. 7
      medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java
  13. 12
      medialibrary/src/org/videolan/medialibrary/stubs/StubMedialibrary.java

4
application/television/src/main/java/org/videolan/television/viewmodel/MainTvModel.kt

@ -145,7 +145,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), Medialibrary.OnMedi
suspend fun updateHistory() {
if (!showHistory) return
(history as MutableLiveData).value = context.getFromMl { lastMediaPlayed().toMutableList() }
(history as MutableLiveData).value = context.getFromMl { history(Medialibrary.HISTORY_TYPE_LOCAL).toMutableList() }
}
private fun updateVideos() = viewModelScope.launch {
@ -174,7 +174,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), Medialibrary.OnMedi
}
private fun updateRecentlyPlayed() = viewModelScope.launch {
val history = context.getFromMl { lastMediaPlayed().toMutableList() }
val history = context.getFromMl { history(Medialibrary.HISTORY_TYPE_LOCAL).toMutableList() }
recentlyPlayed.addSource(withContext(Dispatchers.IO) { mediaMetadataRepository.getByIds(history.map { it.id }) }) {
recentlyPlayed.value = it.sortedBy { history.indexOf(history.find { media -> media.id == it.metadata.mlId }) }
}

2
application/vlc-android/src/org/videolan/vlc/ArtworkProvider.kt

@ -323,7 +323,7 @@ class ArtworkProvider : ContentProvider() {
private fun getHistory(ctx: Context): ByteArray? {
return runBlocking(Dispatchers.IO) {
/* Last Played */
val lastMediaPlayed = ctx.getFromMl { lastMediaPlayed()?.toList()?.filter { MediaSessionBrowser.isMediaAudio(it) } }
val lastMediaPlayed = ctx.getFromMl { history(Medialibrary.HISTORY_TYPE_LOCAL)?.toList()?.filter { MediaSessionBrowser.isMediaAudio(it) } }
if (!lastMediaPlayed.isNullOrEmpty()) {
return@runBlocking getHomeImage(ctx, HISTORY, lastMediaPlayed.toTypedArray())
}

4
application/vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt

@ -224,14 +224,14 @@ internal class MediaSessionCallback(private val playbackService: PlaybackService
}
}
MediaSessionBrowser.ID_HISTORY -> {
val tracks = context.getFromMl { lastMediaPlayed()?.toList()?.filter { MediaSessionBrowser.isMediaAudio(it) } }
val tracks = context.getFromMl { history(Medialibrary.HISTORY_TYPE_LOCAL)?.toList()?.filter { MediaSessionBrowser.isMediaAudio(it) } }
if (!tracks.isNullOrEmpty() && isActive) {
val mediaList = tracks.subList(0, tracks.size.coerceAtMost(MediaSessionBrowser.MAX_HISTORY_SIZE))
loadMedia(mediaList, position)
}
}
MediaSessionBrowser.ID_STREAM -> {
val tracks = context.getFromMl { lastStreamsPlayed() }
val tracks = context.getFromMl { history(Medialibrary.HISTORY_TYPE_NETWORK) }
if (tracks.isNotEmpty() && isActive) {
tracks.sortWith(MediaComparators.ANDROID_AUTO)
loadMedia(tracks.toList(), position)

8
application/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.kt

@ -213,7 +213,7 @@ class MediaSessionBrowser {
results.add(MediaBrowserCompat.MediaItem(lastAddedMediaDesc, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE))
/* History */
if (Settings.getInstance(context).getBoolean(PLAYBACK_HISTORY, true)) {
val lastMediaPlayed = ml.lastMediaPlayed()?.toList()?.filter { isMediaAudio(it) }
val lastMediaPlayed = ml.history(Medialibrary.HISTORY_TYPE_LOCAL)?.toList()?.filter { isMediaAudio(it) }
if (!lastMediaPlayed.isNullOrEmpty()) {
val lastMediaSize = lastMediaPlayed.size.coerceAtMost(MAX_HISTORY_SIZE)
val historyPath = Uri.Builder()
@ -298,7 +298,7 @@ class MediaSessionBrowser {
list.sortWith(MediaComparators.ANDROID_AUTO)
}
ID_STREAM -> {
list = ml.lastStreamsPlayed()
list = ml.history(Medialibrary.HISTORY_TYPE_NETWORK)
list.sortWith(MediaComparators.ANDROID_AUTO)
}
ID_LAST_ADDED -> {
@ -307,7 +307,7 @@ class MediaSessionBrowser {
}
ID_HISTORY -> {
limitSize = true
list = ml.lastMediaPlayed()?.toList()?.filter { isMediaAudio(it) }?.toTypedArray()
list = ml.history(Medialibrary.HISTORY_TYPE_LOCAL)?.toList()?.filter { isMediaAudio(it) }?.toTypedArray()
}
ID_SUGGESTED -> return buildSuggestions(context, parentId, ml)
else -> {
@ -418,7 +418,7 @@ class MediaSessionBrowser {
/* Obtain the most recently played albums from history */
val albumNames = mutableSetOf<String>()
if (Settings.getInstance(context).getBoolean(PLAYBACK_HISTORY, true)) {
val lastMediaPlayed = ml.lastMediaPlayed()?.toList()?.filter { isMediaAudio(it) }
val lastMediaPlayed = ml.history(Medialibrary.HISTORY_TYPE_LOCAL)?.toList()?.filter { isMediaAudio(it) }
if (!lastMediaPlayed.isNullOrEmpty()) for (mw in lastMediaPlayed) mw.album?.let { albumNames.add(it) }
}
/* Pad the end with recently added albums. We may end up dropping a few due to absent artwork. */

4
application/vlc-android/src/org/videolan/vlc/viewmodels/HistoryModel.kt

@ -27,6 +27,7 @@ import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.tools.CoroutineContextProvider
import org.videolan.tools.PLAYBACK_HISTORY
@ -38,7 +39,8 @@ class HistoryModel(context: Context, coroutineContextProvider: CoroutineContextP
override suspend fun updateList() {
if (!Settings.getInstance(context).getBoolean(PLAYBACK_HISTORY, true)) return
dataset.value = withContext(coroutineContextProvider.Default) { medialibrary.lastMediaPlayed().toMutableList() }
dataset.value = withContext(coroutineContextProvider.Default) { medialibrary.history(
Medialibrary.HISTORY_TYPE_LOCAL).toMutableList() }
}
fun moveUp(media: MediaWrapper) = dataset.move(media, 0)

3
application/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt

@ -31,6 +31,7 @@ import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.util.getFromMl
import org.videolan.tools.CoroutineContextProvider
@ -56,7 +57,7 @@ class StreamsModel(context: Context, private val showDummy: Boolean = false, cor
override suspend fun updateList() {
dataset.value = withContext(coroutineContextProvider.Default) {
medialibrary.lastStreamsPlayed().toMutableList()
medialibrary.history(Medialibrary.HISTORY_TYPE_NETWORK).toMutableList()
.also {
deletingMedia?.let { remove(it) }
if (showDummy) it.add(0, DummyMediaWrapperProvider.getDummyMediaWrapper(-1))

2
application/webserver/src/main/java/org/videolan/vlc/webserver/RemoteAccessRouting.kt

@ -564,7 +564,7 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) {
get("/stream-list") {
verifyLogin(settings)
val stream = appContext.getFromMl {
lastStreamsPlayed()
history(Medialibrary.HISTORY_TYPE_NETWORK)
}
val list = ArrayList<RemoteAccessServer.PlayQueueItem>()
stream.forEachIndexed { index, mediaLibraryItem ->

10
medialibrary/jni/AndroidMediaLibrary.cpp

@ -208,9 +208,9 @@ AndroidMediaLibrary::removeMediaFromHistory(int64_t mediaId)
}
std::vector<medialibrary::MediaPtr>
AndroidMediaLibrary::lastMediaPlayed()
AndroidMediaLibrary::history(medialibrary::HistoryType type)
{
return p_ml->history(medialibrary::HistoryType::Global)->items( 100, 0 );
return p_ml->history(type)->items( 100, 0 );
}
bool
@ -227,12 +227,6 @@ AndroidMediaLibrary::addToHistory( const std::string& mrl, const std::string& ti
return true;
}
std::vector<medialibrary::MediaPtr>
AndroidMediaLibrary::lastStreamsPlayed()
{
return p_ml->history(medialibrary::HistoryType::Network)->items( 100, 0 );
}
bool
AndroidMediaLibrary::clearHistory()
{

3
medialibrary/jni/AndroidMediaLibrary.h

@ -57,9 +57,8 @@ public:
bool removeMediaFromHistory(int64_t mediaId);
void setLibvlcInstance(libvlc_instance_t* inst);
/* History */
std::vector<medialibrary::MediaPtr> lastMediaPlayed();
std::vector<medialibrary::MediaPtr> history(medialibrary::HistoryType type);
bool addToHistory( const std::string& mrl, const std::string& title );
std::vector<medialibrary::MediaPtr> lastStreamsPlayed();
bool clearHistory();
medialibrary::SearchAggregate search(const std::string& query);

23
medialibrary/jni/medialibrary.cpp

@ -313,10 +313,10 @@ removeMediaFromHistory(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id
}
jobjectArray
lastMediaPLayed(JNIEnv* env, jobject thiz)
history(JNIEnv* env, jobject thiz, jint type)
{
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
std::vector<medialibrary::MediaPtr> mediaPlayed = aml->lastMediaPlayed();
std::vector<medialibrary::MediaPtr> mediaPlayed = aml->history((medialibrary::HistoryType)type);
utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(mediaPlayed.size(), ml_fields.MediaWrapper.clazz, NULL) };
int index = -1, drops = 0;
for(medialibrary::MediaPtr const& media : mediaPlayed) {
@ -340,22 +340,6 @@ addToHistory(JNIEnv* env, jobject thiz, jstring mrl, jstring title)
return ok;
}
jobjectArray
lastStreamsPlayed(JNIEnv* env, jobject thiz)
{
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
std::vector<medialibrary::MediaPtr> streamsPlayed = aml->lastStreamsPlayed();
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(streamsPlayed.size(), ml_fields.MediaWrapper.clazz, NULL);
int index = -1, drops = 0;
for(medialibrary::MediaPtr const& media : streamsPlayed) {
auto item = mediaToMediaWrapper(env, &ml_fields, media);
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
if (item == nullptr)
++drops;
}
return mediaRefs;
}
bool clearHistory(JNIEnv* env, jobject thiz)
{
return MediaLibrary_getInstance(env, thiz)->clearHistory();
@ -2474,8 +2458,7 @@ static JNINativeMethod methods[] = {
{"nativeBanFolder", "(Ljava/lang/String;)V", (void*)banFolder },
{"nativeUnbanFolder", "(Ljava/lang/String;)V", (void*)unbanFolder },
{"nativeBannedFolders", "()[Ljava/lang/String;", (void*)bannedFolders },
{"nativeLastMediaPlayed", "()[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)lastMediaPLayed },
{"nativeLastStreamsPlayed", "()[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)lastStreamsPlayed },
{"nativeHistory", "(I)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)history },
{"nativeAddToHistory", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*)addToHistory },
{"nativeClearHistory", "()Z", (void*)clearHistory },
{"nativeGetVideos", "()[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getVideos },

12
medialibrary/src/org/videolan/medialibrary/MedialibraryImpl.java

@ -419,13 +419,8 @@ public class MedialibraryImpl extends Medialibrary {
}
@WorkerThread
public MediaWrapper[] lastMediaPlayed() {
return mIsInitiated ? nativeLastMediaPlayed() : EMPTY_COLLECTION;
}
@WorkerThread
public MediaWrapper[] lastStreamsPlayed() {
return mIsInitiated ? nativeLastStreamsPlayed() : EMPTY_COLLECTION;
public MediaWrapper[] history(int type) {
return mIsInitiated ? nativeHistory(type) : EMPTY_COLLECTION;
}
public boolean clearHistory() {
@ -670,8 +665,7 @@ public class MedialibraryImpl extends Medialibrary {
private native void nativeRemoveEntryPoint(String path);
private native String[] nativeEntryPoints();
private native boolean nativeRemoveDevice(String uuid, String path);
private native MediaWrapper[] nativeLastMediaPlayed();
private native MediaWrapper[] nativeLastStreamsPlayed();
private native MediaWrapper[] nativeHistory(int type);
private native boolean nativeAddToHistory(String mrl, String title);
private native boolean nativeClearHistory();
private native MediaWrapper nativeGetMedia(long id);

7
medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java

@ -94,6 +94,10 @@ abstract public class Medialibrary {
public static final int ML_SET_TIME_AS_IS = 2;
public static final int ML_SET_TIME_END = 3;
public static final int HISTORY_TYPE_GLOBAL = 0;
public static final int HISTORY_TYPE_LOCAL = 1;
public static final int HISTORY_TYPE_NETWORK = 2;
public static final MediaWrapper[] EMPTY_COLLECTION = {};
public static final String VLC_MEDIA_DB_NAME = "/vlc_media.db";
public static final String THUMBS_FOLDER_NAME = "/thumbs";
@ -800,8 +804,7 @@ abstract public class Medialibrary {
abstract public void reload(String entrypoint);
abstract public void forceParserRetry();
abstract public void forceRescan();
abstract public MediaWrapper[] lastMediaPlayed();
abstract public MediaWrapper[] lastStreamsPlayed();
abstract public MediaWrapper[] history(int type);
abstract public boolean clearHistory();
abstract public void clearDatabase(boolean restorePlaylist);
abstract public boolean addToHistory(String mrl, String title);

12
medialibrary/src/org/videolan/medialibrary/stubs/StubMedialibrary.java

@ -372,7 +372,7 @@ public class StubMedialibrary extends Medialibrary {
public void forceParserRetry() {}
public void forceRescan() {}
public MediaWrapper[] lastMediaPlayed() {
public MediaWrapper[] history(int type) {
ArrayList<MediaWrapper> results = new ArrayList<>();
for (MediaWrapper media : dt.mHistory) {
if (media.getType() == MediaWrapper.TYPE_VIDEO ||
@ -383,16 +383,6 @@ public class StubMedialibrary extends Medialibrary {
return results.toArray(new MediaWrapper[0]);
}
public MediaWrapper[] lastStreamsPlayed() {
ArrayList<MediaWrapper> results = new ArrayList<>();
for (MediaWrapper media : dt.mHistory) {
if (media.getType() == MediaWrapper.TYPE_STREAM) results.add(media);
// the native method specifies an nbItems of 100, offset 0
if (results.size() >= 100) break;
}
return results.toArray(new MediaWrapper[0]);
}
public boolean clearHistory() {
dt.mHistory.clear();
return true;

Loading…
Cancel
Save