/*
* Copyright (C) 2014 Michell Bak
*
* 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 com.miz.filesources;
import android.content.Context;
import android.database.Cursor;
import com.miz.abstractclasses.MovieFileSource;
import com.miz.db.DbAdapterMovieMappings;
import com.miz.functions.ColumnIndexCache;
import com.miz.functions.DbMovie;
import com.miz.functions.FileSource;
import com.miz.functions.MizLib;
import com.miz.mizuu.MizuuApplication;
import com.miz.utils.MovieDatabaseUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.TreeSet;
public class FileMovie extends MovieFileSource<File> {
private HashMap<String, String> existingMovies = new HashMap<String, String>();
private File tempFile;
public FileMovie(Context context, FileSource fileSource, boolean clearLibrary) {
super(context, fileSource, clearLibrary);
}
@Override
public void removeUnidentifiedFiles() {
List<DbMovie> dbMovies = getDbMovies();
File temp;
int count = dbMovies.size();
for (int i = 0; i < count; i++) {
if (!dbMovies.get(i).isNetworkFile() && !dbMovies.get(i).isUpnpFile()) {
temp = new File(dbMovies.get(i).getFilepath());
if (temp.exists() && dbMovies.get(i).isUnidentified())
MovieDatabaseUtils.deleteMovie(mContext, dbMovies.get(i).getTmdbId());
}
}
}
@Override
public void removeUnavailableFiles() {
List<DbMovie> dbMovies = getDbMovies();
File temp;
int count = dbMovies.size();
for (int i = 0; i < count; i++) {
if (!dbMovies.get(i).isNetworkFile()) {
temp = new File(dbMovies.get(i).getFilepath());
if (!temp.exists()) {
MovieDatabaseUtils.deleteMovie(mContext, dbMovies.get(i).getTmdbId());
}
}
}
}
@Override
public List<String> searchFolder() {
DbAdapterMovieMappings dbHelper = MizuuApplication.getMovieMappingAdapter();
Cursor cursor = dbHelper.getAllFilepaths(false); // Query database to return all filepaths in a cursor
ColumnIndexCache cache = new ColumnIndexCache();
try {
while (cursor.moveToNext()) {// Add all movies in cursor to ArrayList of all existing movies
existingMovies.put(cursor.getString(cache.getColumnIndex(cursor, DbAdapterMovieMappings.KEY_FILEPATH)), "");
}
} catch (Exception e) {
} finally {
cursor.close(); // Close cursor
cache.clear();
}
TreeSet<String> results = new TreeSet<String>();
// Do a recursive search in the file source folder
recursiveSearch(getFolder(), results);
List<String> list = new ArrayList<String>();
Iterator<String> it = results.iterator();
while (it.hasNext())
list.add(it.next());
return list;
}
@Override
public void recursiveSearch(File folder, TreeSet<String> results) {
try {
if (folder.isDirectory()) {
// Check if this is a DVD folder
if (folder.getName().equalsIgnoreCase("video_ts")) {
File[] children = folder.listFiles();
for (int i = 0; i < children.length; i++) {
if (children[i].getName().equalsIgnoreCase("video_ts.ifo"))
addToResults(children[i], results);
}
} // Check if this is a Blu-ray folder
else if (folder.getName().equalsIgnoreCase("bdmv")) {
File[] children = folder.listFiles();
for (int i = 0; i < children.length; i++) {
if (children[i].getName().equalsIgnoreCase("stream")) {
File[] m2tsVideoFiles = children[i].listFiles();
if (m2tsVideoFiles.length > 0) {
File largestFile = m2tsVideoFiles[0];
for (int j = 0; j < m2tsVideoFiles.length; j++)
if (largestFile.length() < m2tsVideoFiles[j].length())
largestFile = m2tsVideoFiles[j];
addToResults(largestFile, results);
}
}
}
} else {
String[] childs = folder.list();
for (int i = 0; i < childs.length; i++) {
tempFile = new File(folder.getAbsolutePath(), childs[i]);
recursiveSearch(tempFile, results);
}
}
} else {
addToResults(folder, results);
}
} catch (Exception e) {}
}
@Override
public void addToResults(File file, TreeSet<String> results) {
if (MizLib.checkFileTypes(file.getAbsolutePath())) {
if (file.length() < getFileSizeLimit() && !file.getName().equalsIgnoreCase("video_ts.ifo"))
return;
if (!clearLibrary())
if (existingMovies.get(file.getAbsolutePath()) != null) return;
String tempFileName = file.getName().substring(0, file.getName().lastIndexOf("."));
if (tempFileName.toLowerCase(Locale.ENGLISH).matches(".*part[2-9]|cd[2-9]")) return;
//Add the file if it reaches this point
results.add(file.getAbsolutePath());
}
}
@Override
public File getRootFolder() {
return new File(getFileSource().getFilepath());
}
@Override
public String toString() {
return getRootFolder().getAbsolutePath();
}
}