Skip to content
Snippets Groups Projects
Commit c97b8f4b authored by Duncan McNamara's avatar Duncan McNamara Committed by Geoffrey Métais
Browse files

Medialibrary Stub: add json file loading

The prep_media script takes a file or directory and extracts
mediainformation, to create a json file. This json file can later be
used to load fake media data to the medialibrary stub.
The goal of this is to be able to create reusable data profiles for
automated testing.
parent 9f549861
No related branches found
No related tags found
1 merge request!217[GSoC 2019]Medialibrary Stub: logic implementation
......@@ -40,6 +40,7 @@ public class MLServiceLocator {
}
MLServiceLocator.sMode = mode;
}
public static LocatorMode getLocatorMode() { return MLServiceLocator.sMode; }
public static String EXTRA_TEST_STUBS = "extra_test_stubs";
public enum LocatorMode {
......
......@@ -2,8 +2,11 @@ package org.videolan.medialibrary.stubs;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.videolan.medialibrary.MLServiceLocator;
import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
......@@ -12,7 +15,6 @@ import org.videolan.medialibrary.interfaces.media.AbstractFolder;
import org.videolan.medialibrary.interfaces.media.AbstractGenre;
import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
import org.videolan.medialibrary.media.MediaLibraryItem;
import java.util.ArrayList;
import java.util.Arrays;
......@@ -32,13 +34,8 @@ import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_LAS
import static org.videolan.medialibrary.interfaces.AbstractMedialibrary.SORT_RELEASEDATE;
public class StubDataSource {
public static final String STUBBED_VIDEO_TITLE = "Invincible";
public static final String STUBBED_AUDIO_TITLE = "Show Me The Way";
public static final String STUBBED_VIDEO_EXTENSION = ".mp4";
public static final String STUBBED_AUDIO_EXTENSION = ".mp3";
private String TAG = this.getClass().getName();
ArrayList<AbstractMediaWrapper> mVideoMediaWrappers = new ArrayList<>();
ArrayList<AbstractMediaWrapper> mAudioMediaWrappers = new ArrayList<>();
ArrayList<AbstractMediaWrapper> mStreamMediaWrappers = new ArrayList<>();
......@@ -67,8 +64,6 @@ public class StubDataSource {
private StubDataSource() {
}
public void init() {
}
public void resetData() {
mFolders.clear();
......@@ -84,113 +79,6 @@ public class StubDataSource {
mDevices.clear();
}
public void setVideoByCount(int count, @Nullable String folder) {
AbstractMediaWrapper media;
String fileName;
for (int i = 0; i < count; i++) {
fileName = i + " - " + STUBBED_VIDEO_TITLE + STUBBED_AUDIO_EXTENSION;
String mrl = baseMrl + ((folder != null) ? folder + "/" : "") + fileName;
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), mrl, 0L, 18820L, AbstractMediaWrapper.TYPE_VIDEO,
fileName, fileName, "", "",
"", "", 416, 304, "", 0, -2,
0, 0, 1509466228L, 0L, true, 0);
addVideo(media);
}
// Video
fileName = "058_foar_everywun_frum_boxxy.flv";
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 18820L, 0,
fileName, fileName, "", "",
"", "", 416, 304, "", 0, -2,
0, 0, 1509466228L, 0L, true, 0);
addVideo(media);
fileName = "FMA - MultiChapter.mkv";
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 1467383L, 0,
"Encoded with MiniCoder", fileName, "", "",
"", "", 1280, 720, "", 0,
-2, 0, 0, 1512396147L, 0L, true, 0);
addVideo(media);
fileName = "114_My_Heart_Will_Go_On.avi";
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 20000L, 0,
"My Heart Will Go On - Celine Dion", fileName, "", "",
"", "", 352, 220, "", 0,
-2, 0, 0, 1509465852L, 0L, true, 0);
addVideo(media);
// Audio
fileName = "01-Show Me The Way.mp3";
baseMrl = "/storage/emulated/0/Music/Peter Frampton/Shine On - CD2/";
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 280244L, 1,
"01-Show Me The Way", fileName, "Peter Frampton", "Rock",
"Shine On CD2", "Peter Frampton",
0, 0, "/storage/emulated/0/Music/Peter Frampton/Shine On - CD2/Folder.jpg",
0, -2, 1, 0,
1547452796L, 0L, true, 0);
addAudio(media, "", 1965, 400);
fileName = "01-Wind Of Change.mp3";
baseMrl = "/storage/emulated/0/Music/Peter Frampton/Shine On - CD1/";
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 184271L, 1,
"01-Wind Of Change", fileName, "Peter Frampton", "Rock",
"Shine On CD1", "Peter Frampton",
0, 0, "/storage/emulated/0/Music/Peter Frampton/Shine On - CD1/Folder.jpg",
0, -2, 1, 0,
1547452786L, 0L, true, 0);
addAudio(media, "", 1960, 250);
fileName = "03 Bloody Well Right.wma";
baseMrl = "/storage/emulated/0/Music/Supertramp/Best of/";
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 257199L, 1,
"Bloody Well Right", fileName, "Supertramp", "Rock",
"The Autobiography of Supertramp", "Supertramp",
0, 0, "/storage/emulated/0/Music/Supertramp/Best of/Folder.jpg", 0,
-2, 3, 0,
1547452814L, 0L, true, 0);
addAudio(media, "", 1970, 360);
}
public void setAudioByCount(int count, @Nullable String folder) {
mAudioMediaWrappers.clear();
String fileName;
AbstractMediaWrapper media;
for (int i = 0; i < count; i++) {
fileName = i + " - " + STUBBED_AUDIO_TITLE + STUBBED_AUDIO_EXTENSION;
String mrl = baseMrl + ((folder != null) ? folder + "/" : "") + fileName;
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), mrl, 0L, 280244L, AbstractMediaWrapper.TYPE_AUDIO,
i + "-Show Me The Way", fileName, "Peter Frampton", "Rock",
"Shine On CD2", "Peter Frampton",
0, 0, baseMrl + folder + ".jpg",
0, -2, 1, 0,
1547452796L, 0L, true, 0);
addAudio(media, "", 1965, 400);
}
}
public AbstractMediaWrapper addMediaWrapper(String mrl, String title, int type) {
AbstractMediaWrapper media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), mrl, 0L, 280224L, type,
title, title, "Artisto", "Jazz", "XYZ CD1", "", 0, 0, baseMrl + title, -2,
1, 1, 0, 1547452796L, 0L, true, 0);
if (type == AbstractMediaWrapper.TYPE_ALL) type = media.getType();
if (type == AbstractMediaWrapper.TYPE_VIDEO) addVideo(media);
else if (type == AbstractMediaWrapper.TYPE_AUDIO) addAudio(media, "", 2018, 12313);
return media;
}
public AbstractMediaWrapper addMediaWrapper(String title, int type) {
return addMediaWrapper(baseMrl + title, title, type);
}
public AbstractFolder createFolder(String name) {
AbstractFolder folder = MLServiceLocator.getAbstractFolder(getUUID(), name, baseMrl + name);
mFolders.add(folder);
return folder;
}
<T> List<T> secureSublist(List<T> list, int offset, int nbItems) {
int min = list.size() - 1 < 0 ? 0 : list.size();
int secureOffset = (offset >= list.size()) && (offset > 0) ? min : offset;
......@@ -239,8 +127,7 @@ public class StubDataSource {
public int compare(AbstractArtist o1, AbstractArtist o2) {
switch (sort) {
case SORT_DEFAULT:
case SORT_ARTIST:
return o1.getTitle().compareTo(o2.getTitle());
case SORT_ARTIST: return o1.getTitle().compareTo(o2.getTitle());
default:
return 0;
}
......@@ -249,10 +136,7 @@ public class StubDataSource {
class AlbumComparator implements Comparator<AbstractAlbum> {
private int sort;
AlbumComparator(int sort) {
this.sort = sort;
}
AlbumComparator(int sort) { this.sort = sort; }
@Override
public int compare(AbstractAlbum o1, AbstractAlbum o2) {
......@@ -268,59 +152,43 @@ public class StubDataSource {
class GenreComparator implements Comparator<AbstractGenre> {
private int sort;
GenreComparator(int sort) {
this.sort = sort;
}
GenreComparator(int sort) { this.sort = sort; }
@Override
public int compare(AbstractGenre o1, AbstractGenre o2) {
switch (sort) {
case SORT_DEFAULT:
case SORT_ALPHA:
return o1.getTitle().compareTo(o2.getTitle());
default:
return 0;
case SORT_ALPHA: return o1.getTitle().compareTo(o2.getTitle());
default: return 0;
}
}
}
class PlaylistComparator implements Comparator<AbstractPlaylist> {
private int sort;
PlaylistComparator(int sort) {
this.sort = sort;
}
PlaylistComparator(int sort) { this.sort = sort; }
@Override
public int compare(AbstractPlaylist o1, AbstractPlaylist o2) {
switch (sort) {
case SORT_DEFAULT:
case SORT_ALPHA:
return o1.getTitle().compareTo(o2.getTitle());
case SORT_DURATION:
return 0; //TODO WTF is there a duration attribute
default:
return 0;
case SORT_ALPHA: return o1.getTitle().compareTo(o2.getTitle());
case SORT_DURATION: return 0; //TODO WTF is there a duration attribute
default: return 0;
}
}
}
class FolderComparator implements Comparator<AbstractFolder> {
private int sort;
FolderComparator(int sort) {
this.sort = sort;
}
FolderComparator(int sort) { this.sort = sort; }
@Override
public int compare(AbstractFolder o1, AbstractFolder o2) {
switch (sort) {
case SORT_DEFAULT:
case SORT_ALPHA:
return o1.getTitle().compareTo(o2.getTitle());
default:
return 0;
case SORT_ALPHA: return o1.getTitle().compareTo(o2.getTitle());
default: return 0;
}
}
}
......@@ -373,63 +241,110 @@ public class StubDataSource {
return array.toArray(new AbstractFolder[0]);
}
private boolean checkUuidForMatches(long id) {
if (id == 1L || id == 2L)
return true;
for (MediaLibraryItem item : mVideoMediaWrappers) {
if (item.getId() == id)
return true;
}
for (MediaLibraryItem item : mAudioMediaWrappers) {
if (item.getId() == id)
return true;
}
for (MediaLibraryItem item : mAlbums) {
if (item.getId() == id)
return true;
AtomicLong getUUID() {
uuid.incrementAndGet();
return uuid;
}
void loadJsonData(String jsonContent) {
try {
JSONArray jsonArray = new JSONArray(jsonContent);
for (int i = 0 ; i < jsonArray.length() ; i++) {
Log.w(TAG, "discover: " + jsonArray.getJSONObject(i).getString("title"));
addMediaFromJson(jsonArray.getJSONObject(i));
}
} catch (JSONException exception) {
Log.e(TAG, "discover: " + exception.toString());
}
for (MediaLibraryItem item : mArtists) {
if (item.getId() == id)
return true;
}
private void addMediaFromJson(JSONObject jsonObject) {
try {
AbstractMediaWrapper media = MLServiceLocator.getAbstractMediaWrapper(
getUUID(),
jsonObject.getString("mrl"),
0L,
jsonObject.getLong("length"),
0,
jsonObject.getString("title"),
jsonObject.getString("filename"),
jsonObject.getString("artist"),
jsonObject.getString("genre"),
jsonObject.getString("album"),
jsonObject.getString("album_artist"),
jsonObject.getInt("width"),
jsonObject.getInt("height"),
jsonObject.getString("artwork_url"),
jsonObject.getInt("audio"),
jsonObject.getInt("spu"),
jsonObject.getInt("track_number"),
0,
jsonObject.getLong("last_modified"),
0L,
true
);
if (jsonObject.getString("genre").equals("")) {
addVideo(media);
} else {
addAudio(media,
"",
jsonObject.getInt("year"),
jsonObject.getInt("album_duration"),
jsonObject.getInt("track_total")
);
}
} catch (JSONException exception) {
Log.e(TAG, "addMediaFromJson: failed to load json: " + exception.toString());
}
for (MediaLibraryItem item : mGenres) {
if (item.getId() == id)
return true;
}
private void addArtistSecure(AbstractArtist newArtist) {
for (AbstractArtist artist : mArtists) {
if (artist.getTitle().equals(newArtist.getTitle())) {
return;
}
}
for (MediaLibraryItem item : mFolders) {
if (item.getId() == id)
return true;
mArtists.add(newArtist);
}
private void addGenreSecure(AbstractGenre newGenre) {
for (AbstractGenre genre : mGenres) {
if (genre.getTitle().equals(newGenre.getTitle()))
return;
}
return false;
mGenres.add(newGenre);
}
public long getUUID() {
return uuid.addAndGet(1);
private void addAlbumSecure(AbstractAlbum newAlbum) {
for (AbstractAlbum album : mAlbums) {
if (album.getTitle().equals(newAlbum.getTitle()))
return;
}
mAlbums.add(newAlbum);
}
private void addAudio(AbstractMediaWrapper media, String shortBio, int releaseYear, int albumDuration) {
private void addAudio(AbstractMediaWrapper media, String shortBio, int releaseYear, int albumDuration, int trackTotal) {
addFolders(media);
mAudioMediaWrappers.add(media);
AbstractArtist artist = MLServiceLocator.getAbstractArtist(getUUID(), media.getArtist(), shortBio, media.getArtworkMrl(), "");
mArtists.add(artist);
AbstractArtist artist = MLServiceLocator.getAbstractArtist(getUUID().longValue(), media.getArtist(), shortBio, media.getArtworkMrl(), "");
addArtistSecure(artist);
AbstractArtist albumArtist = null;
if (!media.getArtist().equals(media.getAlbumArtist())) {
albumArtist = MLServiceLocator.getAbstractArtist(getUUID(), media.getAlbumArtist(), "", media.getArtworkMrl(), "");
mArtists.add(albumArtist);
if (!media.getArtist().equals(media.getAlbumArtist()) && !media.getArtist().isEmpty()) {
albumArtist = MLServiceLocator.getAbstractArtist(getUUID().longValue(), media.getAlbumArtist(), "", media.getArtworkMrl(), "");
addArtistSecure(albumArtist);
}
AbstractAlbum album;
if (albumArtist == null)
album = MLServiceLocator.getAbstractAlbum(getUUID(), media.getAlbum(), releaseYear,
media.getArtworkMrl(), artist.getTitle(),
artist.getId(), media.getTracks().length, albumDuration);
else
album = MLServiceLocator.getAbstractAlbum(getUUID(), media.getAlbum(), releaseYear,
if (albumArtist != null && !albumArtist.getTitle().isEmpty())
album = MLServiceLocator.getAbstractAlbum(getUUID().longValue(), media.getAlbum(), releaseYear,
media.getArtworkMrl(), albumArtist.getTitle(),
albumArtist.getId(), media.getTracks().length, albumDuration);
mAlbums.add(album);
ArrayList genreStrings = new ArrayList<>();
// if (!getGenresString())
mGenres.add(MLServiceLocator.getAbstractGenre(getUUID(), media.getGenre()));
albumArtist.getId(), trackTotal, albumDuration);
else
album = MLServiceLocator.getAbstractAlbum(getUUID().longValue(), media.getAlbum(), releaseYear,
media.getArtworkMrl(), artist.getTitle(),
artist.getId(), trackTotal, albumDuration);
addAlbumSecure(album);
addGenreSecure(MLServiceLocator.getAbstractGenre(getUUID().longValue(), media.getGenre()));
}
private void addVideo(AbstractMediaWrapper media) {
......@@ -437,19 +352,9 @@ public class StubDataSource {
mVideoMediaWrappers.add(media);
}
private String[] getGenresString() {
ArrayList<String> results = new ArrayList<>();
for (AbstractGenre genre : mGenres) {
results.add(genre.getTitle());
}
return results.toArray(new String[0]);
}
private String[] getFoldersString() {
ArrayList<String> results = new ArrayList<>();
for (AbstractFolder folder : mFolders) {
results.add(folder.getTitle());
}
for (AbstractFolder folder : mFolders) { results.add(folder.getTitle()); }
return results.toArray(new String[0]);
}
......@@ -464,7 +369,7 @@ public class StubDataSource {
ArrayList<String> mlFolders = new ArrayList<>(Arrays.asList(getFoldersString()));
if (!mlFolders.contains(mrl)) {
final String name = folderArray[folderArray.length - 1];
mFolders.add(MLServiceLocator.getAbstractFolder(getUUID(), name, mrl));
mFolders.add(MLServiceLocator.getAbstractFolder(getUUID().longValue(), name, mrl));
}
}
}
......
......@@ -32,7 +32,6 @@ public class StubMedialibrary extends AbstractMedialibrary {
public int init(Context context) {
if (context == null) return ML_INIT_FAILED;
sContext = context;
dt.init();
return ML_INIT_SUCCESS;
}
......@@ -70,19 +69,22 @@ public class StubMedialibrary extends AbstractMedialibrary {
return false;
}
public void loadJsonData(String jsonContent) {
dt.loadJsonData(jsonContent);
reload();
}
public void discover(@NonNull String path) {
onDiscoveryStarted(path);
onDiscoveryCompleted(path);
onBackgroundTasksIdleChanged(true);
}
public void removeFolder(@NonNull String mrl) {
}
public void removeFolder(@NonNull String mrl) {}
public boolean removeDevice(String uuid, String path) {
return true;
}
public String[] getFoldersList() {
ArrayList<String> results = new ArrayList<>();
for (AbstractFolder folder : dt.mFolders) {
......@@ -302,23 +304,18 @@ public class StubMedialibrary extends AbstractMedialibrary {
}
public void pauseBackgroundOperations() {}
public void resumeBackgroundOperations() {}
public void reload() {
Log.e(TAG, "reload: no entrypoint");
reload("");
}
public void reload(String entrypoint) {
Log.e(TAG, "reload(string entrypoint): ");
onReloadStarted(entrypoint);
onReloadCompleted(entrypoint);
onBackgroundTasksIdleChanged(true);
}
public void forceParserRetry() {}
public void forceRescan() {}
public AbstractMediaWrapper[] lastMediaPlayed() {
......
......@@ -197,15 +197,19 @@ android {
}
sourceSets.debug {
res.srcDirs = ['flavors/debug/res']
assets.srcDirs = ['flavors/debug/assets']
}
sourceSets.dev {
res.srcDirs = ['flavors/debug/res']
assets.srcDirs = ['flavors/debug/assets']
}
sourceSets.test {
java.srcDirs = ['test', 'test-common']
assets.srcDirs = ['flavors/debug/assets']
}
sourceSets.androidTest {
java.srcDirs = ['androidTest', 'test-common']
assets.srcDirs = ['flavors/debug/assets']
assets.srcDirs += files("$projectDir/assets/schemas".toString())
}
}
......
[
{
"width":1280,
"height":720,
"spu":-2,
"album_duration":0,
"title":"Encoded with MiniCoder",
"mrl":"/storage/emulated/0/Videos/samples/FMA - MultiChapter.mkv",
"filename":"FMA - MultiChapter.mkv",
"last_modified":1415791531,
"length":1467383,
"artist":"",
"album":"",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"",
"track_number":0,
"track_total":0,
"audio":2
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":4128392,
"title":"Don't You Know Who I Think I Am?",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/08 Don't You Know Who I Think I Am_.mp3",
"filename":"08 Don't You Know Who I Think I Am_.mp3",
"last_modified":1251875898,
"length":172016,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":8,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":4885734,
"title":"Thanks For The Memories",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/07 Thanks For The Memories.mp3",
"filename":"07 Thanks For The Memories.mp3",
"last_modified":1251875898,
"length":203572,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":7,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":5090743,
"title":"This Ain't A Scene, It's An Arms Race",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/03 This Ain't A Scene, It's An Arms Race.mp3",
"filename":"03 This Ain't A Scene, It's An Arms Race.mp3",
"last_modified":1251875898,
"length":212114,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":3,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":4466312,
"title":"Fame < Infamy",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/12 Fame _ Infamy.mp3",
"filename":"12 Fame _ Infamy.mp3",
"last_modified":1251875898,
"length":186096,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":12,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":5082593,
"title":"I'm Like A Lawyer With The Way I'm Always Trying To Get You Off (Me & You)",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/04 I'm Like A Lawyer With The Way I'm Always Trying To Get You Off (Me & You).mp3",
"filename":"04 I'm Like A Lawyer With The Way I'm Always Trying To Get You Off (Me & You).mp3",
"last_modified":1251875898,
"length":211774,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":4,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":5918303,
"title":"I've Got All This Ringing In My Ears And None On My Fingers",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/14 I've Got All This Ringing In My Ears And None On My Fingers.mp3",
"filename":"14 I've Got All This Ringing In My Ears And None On My Fingers.mp3",
"last_modified":1251875898,
"length":246595,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":14,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":5334623,
"title":"You're Crashing, But You're No Wave",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/13 You're Crashing, But You're No Wave.mp3",
"filename":"13 You're Crashing, But You're No Wave.mp3",
"last_modified":1251875898,
"length":222275,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":13,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":5073816,
"title":"Bang The Doldrums",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/11 Bang The Doldrums.mp3",
"filename":"11 Bang The Doldrums.mp3",
"last_modified":1251875898,
"length":211409,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":11,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":4551575,
"title":"Immortals",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/Fall Out Boy - Immortals.mp3",
"filename":"Fall Out Boy - Immortals.mp3",
"last_modified":1523984311,
"length":189649,
"artist":"Fall Out Boy",
"album":"",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Unknown",
"track_number":0,
"track_total":0,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":3659442,
"title":"Golden",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/06 Golden.mp3",
"filename":"06 Golden.mp3",
"last_modified":1251875898,
"length":152476,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":6,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":5533989,
"title":"Hum Hallelujah",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/05 Hum Hallelujah.mp3",
"filename":"05 Hum Hallelujah.mp3",
"last_modified":1251875898,
"length":230582,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":5,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":5127733,
"title":"The Take Over, The Break's Over",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/02 The Take Over, The Break's Over.mp3",
"filename":"02 The Take Over, The Break's Over.mp3",
"last_modified":1251875898,
"length":213655,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":2,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":5034946,
"title":"Thriller",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/01 Thriller.mp3",
"filename":"01 Thriller.mp3",
"last_modified":1251875898,
"length":209789,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":1,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":4893885,
"title":"The Carpal Tunnel Of Love",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/10 The Carpal Tunnel Of Love.mp3",
"filename":"10 The Carpal Tunnel Of Love.mp3",
"last_modified":1251875898,
"length":203911,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":10,
"track_total":14,
"audio":1
},
{
"width":0,
"height":0,
"spu":-2,
"album_duration":4842476,
"title":"The (After) Life Of The Party",
"mrl":"/storage/emulated/0/Music/Fall Out Boy/09 The (After) Life Of The Party.mp3",
"filename":"09 The (After) Life Of The Party.mp3",
"last_modified":1251875898,
"length":201769,
"artist":"Fall Out Boy",
"album":"Infinity On High",
"album_artist":"",
"artwork_url":"",
"year":0,
"genre":"Rock",
"track_number":9,
"track_total":14,
"audio":1
}
]
\ No newline at end of file
#!/usr/bin/python3.7
from pymediainfo import MediaInfo
import time
import datetime
import sys
from os import listdir
import os.path
import argparse
import collections
import json
class JsonManager:
def __init__(self, path):
if not os.path.exists(path):
self.jsonfile = open(path, "w+")
else:
self.jsonfile = open(path, "r+")
def getData(self):
jsonstr = self.jsonfile.read()
if jsonstr == "":
return []
return json.loads(jsonstr)
def dump(self, data):
datastr = json.dumps(data, indent=4, separators=(',', ':'))
self.jsonfile.seek(0)
self.jsonfile.write(datastr)
self.jsonfile.truncate()
self.jsonfile.close()
def fileLoop(dirpath, csvWriter):
for filename in listdir(dirpath):
csvWriter.writerow(getMediaCSV(dirpath + filename))
return
def print_dict( d ):
d = dict( collections.OrderedDict( sorted( d.items() ) ) )
for key, value in d.items():
print( "{0}: {1}".format( key, value ) )
def printMediaInfo( filepath ):
media_info = MediaInfo.parse( filepath )
for track in media_info.tracks:
print(track.track_type)
if (track.track_type == 'General'
or track.track_type == 'Video'
or track.track_type == 'Audio'):
print( "type: {0}: ".format( track.track_type ) )
print_dict( track.__dict__ )
print()
def get(track, key, default):
if hasattr(track, key) and getattr(track, key) != None:
return getattr(track, key)
return default
def getMediaInfo(filepath):
data = dict()
data["width"] = 0
data["height"] = 0
data["spu"] = -2
data["album_duration"] = 0
media_info = MediaInfo.parse(filepath)
for track in media_info.tracks:
if track.track_type == 'General':
data["title"] = getattr(track, "title")
mrl = "/".join(getattr(track, "complete_name").split("/")[3:])
data["mrl"] = "/storage/emulated/0/" + mrl
data["filename"] = data["mrl"].split("/")[-1]
last_mod_str = getattr(track, "file_last_modification_date__local")
timestamp = time.mktime(datetime.datetime.strptime(last_mod_str, "%Y-%m-%d %H:%M:%S").timetuple())
data["last_modified"] = int(timestamp)
data["length"] = int(get(track, "duration", "0"))
data["artist"] = get(track, "performer", "")
data["album"] = get(track, "album", "")
data["album_artist"] = get(track, "album_performer", "")
data["artwork_url"] = ""
data["year"] = int(get(track, "year", "0"))
data["genre"] = get(track, "genre", "Unknown")
data["track_number"] = int(get(track, "track_name_position", "0"))
data["track_total"] = int(get(track, "track_name_total", "0"))
data["audio"] = int(get(track, "count_of_audio_streams", "1"))
if track.track_type == 'Video':
data["width"] = int(get(track, "width", "0"))
data["height"] = int(get(track, "height", "0"))
data["genre"] = ""
if track.track_type == 'Audio':
data["album_duration"] = int(get(track, "stream_size", "0"))
data["spu"] = -2
print(data)
return data
description = "Extracts mediainfo data from a file or directory to add them "
description += "to a media configuration file for the medialibrary stub."
parser = argparse.ArgumentParser( description=description )
parser.add_argument( '-i', '--input', dest='input_path',
help="path to file or directory" )
parser.add_argument( '-o', '--output', dest='output',
help="file to save output, mendatory and only for a directory" )
parser.add_argument( '-p', '--print', dest='vprint',
help="Print media info of specified file")
args = parser.parse_args()
input_path = args.input_path
output = args.output
vprint = args.vprint
if vprint != None:
printMediaInfo(vprint)
exit( 0 )
if input_path != None:
if os.path.exists( input_path ) == False:
print( "Error: input: No such file or directory" )
exit( 1 )
if output == None:
print( "Error: You didn't specify an output file" )
exit( 1 )
jsonManager = JsonManager(output)
json_data = jsonManager.getData()
if os.path.isdir( input_path ) == True:
print( "Input directory: " + str( input_path ) )
for filename in os.listdir( input_path ):
json_data.append( getMediaInfo( input_path + filename ) )
else:
json_data.append( getMediaInfo( input_path ) )
jsonManager.dump(json_data)
else:
parser.print_help()
......@@ -43,13 +43,16 @@ import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.actor
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.MLServiceLocator
import org.videolan.medialibrary.interfaces.AbstractMedialibrary
import org.videolan.medialibrary.interfaces.DevicesDiscoveryCb
import org.videolan.medialibrary.stubs.StubMedialibrary
import org.videolan.vlc.gui.SendCrashActivity
import org.videolan.vlc.gui.helpers.NotificationHelper
import org.videolan.vlc.moviepedia.MoviepediaIndexer
import org.videolan.vlc.repository.DirectoryRepository
import org.videolan.vlc.util.*
import org.videolan.vlc.util.Util.readAsset
import java.io.File
private const val TAG = "VLC/MediaParsingService"
......@@ -259,6 +262,9 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb, LifecycleOwn
private fun startScan(shouldInit: Boolean, upgrade: Boolean) {
scanActivated = true
if (MLServiceLocator.getLocatorMode() == MLServiceLocator.LocatorMode.TESTS) {
(medialibrary as StubMedialibrary).loadJsonData(readAsset("basic_stub.json", ""))
}
when {
shouldInit -> {
for (folder in AbstractMedialibrary.getBlackList())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment