Try to load lyrics from file if tag is empty

This commit is contained in:
tkashkin 2017-06-12 04:59:07 +03:00
commit 1ee7d8c7b6
4 changed files with 86 additions and 24 deletions

View file

@ -52,11 +52,6 @@ import com.kabouzeid.gramophone.util.ViewUtil;
import com.kabouzeid.gramophone.views.WidthFitSquareLayout;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.tag.FieldKey;
import java.io.File;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
@ -316,13 +311,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
@Override
protected String doInBackground(Void... params) {
try {
return AudioFileIO.read(new File(song.data)).getTagOrCreateDefault().getFirst(FieldKey.LYRICS);
} catch (Exception e) {
e.printStackTrace();
cancel(false);
return null;
}
return MusicUtil.getLyrics(song);
}
@Override

View file

@ -50,11 +50,6 @@ import com.kabouzeid.gramophone.util.ViewUtil;
import com.kabouzeid.gramophone.views.WidthFitSquareLayout;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.tag.FieldKey;
import java.io.File;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
@ -312,13 +307,7 @@ public class FlatPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
@Override
protected String doInBackground(Void... params) {
try {
return AudioFileIO.read(new File(song.data)).getTagOrCreateDefault().getFirst(FieldKey.LYRICS);
} catch (Exception e) {
e.printStackTrace();
cancel(false);
return null;
}
return MusicUtil.getLyrics(song);
}
@Override

View file

@ -11,9 +11,13 @@ import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.loader.SortedCursor;
import com.kabouzeid.gramophone.model.Song;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@ -160,4 +164,30 @@ public final class FileUtil {
}
return false;
}
public static String stripExtension(String str) {
if (str == null) return null;
int pos = str.lastIndexOf('.');
if (pos == -1) return str;
return str.substring(0, pos);
}
public static String readFromStream(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
if (sb.length() > 0) sb.append("\n");
sb.append(line);
}
reader.close();
return sb.toString();
}
public static String read(File file) throws Exception {
FileInputStream fin = new FileInputStream(file);
String ret = readFromStream(fin);
fin.close();
return ret;
}
}

View file

@ -25,9 +25,15 @@ import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.tag.FieldKey;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
* @author Karim Abou Zeid (kabouzeid)
@ -255,4 +261,52 @@ public class MusicUtil {
if (musicMediaTitle.isEmpty()) return "";
return String.valueOf(musicMediaTitle.charAt(0)).toUpperCase();
}
@Nullable
public static String getLyrics(Song song) {
String lyrics = null;
File file = new File(song.data);
try {
lyrics = AudioFileIO.read(file).getTagOrCreateDefault().getFirst(FieldKey.LYRICS);
} catch (Exception e) {
e.printStackTrace();
}
if (lyrics == null || lyrics.trim().isEmpty()) {
File dir = file.getAbsoluteFile().getParentFile();
if (dir != null && dir.exists() && dir.isDirectory()) {
final ArrayList<Pattern> patterns = new ArrayList<>();
patterns.add(Pattern.compile(String.format(".*%s.*\\.(lrc|txt)", FileUtil.stripExtension(file.getName())), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE));
patterns.add(Pattern.compile(String.format(".*%s.*\\.(lrc|txt)", song.title), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE));
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
for (Pattern pattern : patterns) {
if (pattern.matcher(f.getName()).matches()) return true;
}
return false;
}
});
if (files != null && files.length > 0) {
for (File f : files) {
try {
lyrics = FileUtil.read(f);
if (lyrics != null && !lyrics.trim().isEmpty()) {
return lyrics;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
return lyrics;
}
}