xref: /MusicFree/android/app/src/main/java/fun/upup/musicfree/mp3Util/Mp3UtilModule.kt (revision 5589cdf32b2bb0f641e5ac7bf1f6152cd6b9b70e)

<lambda>null1 package `fun`.upup.musicfree.mp3Util
2 
3 import android.graphics.Bitmap
4 import android.graphics.BitmapFactory
5 import android.media.MediaMetadataRetriever
6 import android.net.Uri
7 import com.facebook.react.bridge.*
8 import org.jaudiotagger.audio.AudioFileIO
9 import org.jaudiotagger.tag.FieldKey
10 import java.io.File
11 import java.io.FileOutputStream
12 import java.io.IOException
13 
14 class Mp3UtilModule(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
15 
16     override fun getName() = "Mp3Util"
17 
18     private fun isContentUri(uri: Uri?): Boolean {
19         return uri?.scheme?.equals("content", ignoreCase = true) == true
20     }
21 
22     @ReactMethod
23     fun getBasicMeta(filePath: String, promise: Promise) {
24         try {
25             val uri = Uri.parse(filePath)
26             val mmr = MediaMetadataRetriever()
27             if (isContentUri(uri)) {
28                 mmr.setDataSource(reactApplicationContext, uri)
29             } else {
30                 mmr.setDataSource(filePath)
31             }
32 
33             val properties = Arguments.createMap().apply {
34                 putString("duration", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION))
35                 putString("bitrate", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE))
36                 putString("artist", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST))
37                 putString("author", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_AUTHOR))
38                 putString("album", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM))
39                 putString("title", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE))
40                 putString("date", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE))
41                 putString("year", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR))
42             }
43             promise.resolve(properties)
44         } catch (e: Exception) {
45             promise.reject("Exception", e.message)
46         }
47     }
48 
49     @ReactMethod
50     fun getMediaMeta(filePaths: ReadableArray, promise: Promise) {
51         val metas = Arguments.createArray()
52         val mmr = MediaMetadataRetriever()
53         for (i in 0 until filePaths.size()) {
54             try {
55                 val filePath = filePaths.getString(i)
56                 val uri = Uri.parse(filePath)
57 
58                 if (isContentUri(uri)) {
59                     mmr.setDataSource(reactApplicationContext, uri)
60                 } else {
61                     mmr.setDataSource(filePath)
62                 }
63 
64                 val properties = Arguments.createMap().apply {
65                     putString("duration", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION))
66                     putString("bitrate", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE))
67                     putString("artist", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST))
68                     putString("author", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_AUTHOR))
69                     putString("album", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM))
70                     putString("title", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE))
71                     putString("date", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE))
72                     putString("year", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR))
73                 }
74                 metas.pushMap(properties)
75             } catch (e: Exception) {
76                 metas.pushNull()
77             }
78         }
79         try {
80             mmr.release()
81         } catch (ignored: Exception) {
82         }
83         promise.resolve(metas)
84     }
85 
86 
87     @ReactMethod
88     fun getMediaCoverImg(filePath: String, promise: Promise) {
89         try {
90             val file = File(filePath)
91             if (!file.exists()) {
92                 promise.reject("File not exist", "File not exist")
93                 return
94             }
95 
96             val pathHashCode = file.hashCode()
97             if (pathHashCode == 0) {
98                 promise.resolve(null)
99                 return
100             }
101 
102             val cacheDir = reactContext.cacheDir
103             val coverFile = File(cacheDir, "image_manager_disk_cache/$pathHashCode.jpg")
104             if (coverFile.exists()) {
105                 promise.resolve(coverFile.toURI().toString())
106                 return
107             }
108 
109             val mmr = MediaMetadataRetriever()
110             mmr.setDataSource(filePath)
111             val coverImg = mmr.embeddedPicture
112             if (coverImg != null) {
113                 val bitmap = BitmapFactory.decodeByteArray(coverImg, 0, coverImg.size)
114                 FileOutputStream(coverFile).use { outputStream ->
115                     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
116                     outputStream.flush()
117                 }
118                 promise.resolve(coverFile.toURI().toString())
119             } else {
120                 promise.resolve(null)
121             }
122             mmr.release()
123         } catch (ignored: Exception) {
124             promise.reject("Error", "Got error")
125         }
126     }
127 
128     @ReactMethod
129     fun getLyric(filePath: String, promise: Promise) {
130         try {
131             val file = File(filePath)
132             if (file.exists()) {
133                 val audioFile = AudioFileIO.read(file)
134                 val tag = audioFile.tag
135                 val lrc = tag.getFirst(FieldKey.LYRICS)
136                 promise.resolve(lrc)
137             } else {
138                 throw IOException("File not found")
139             }
140         } catch (e: Exception) {
141             promise.reject("Error", e.message)
142         }
143     }
144 
145     @ReactMethod
146     fun setMediaTag(filePath: String, meta: ReadableMap, promise: Promise) {
147         try {
148             val file = File(filePath)
149             if (file.exists()) {
150                 val audioFile = AudioFileIO.read(file)
151                 val tag = audioFile.tag
152                 meta.getString("title")?.let { tag.setField(FieldKey.TITLE, it) }
153                 meta.getString("artist")?.let { tag.setField(FieldKey.ARTIST, it) }
154                 meta.getString("album")?.let { tag.setField(FieldKey.ALBUM, it) }
155                 meta.getString("lyric")?.let { tag.setField(FieldKey.LYRICS, it) }
156                 meta.getString("comment")?.let { tag.setField(FieldKey.COMMENT, it) }
157                 audioFile.commit()
158                 promise.resolve(true)
159             } else {
160                 promise.reject("Error", "File Not Exist")
161             }
162         } catch (e: Exception) {
163             promise.reject("Error", e.message)
164         }
165     }
166 
167     @ReactMethod
168     fun getMediaTag(filePath: String, promise: Promise) {
169         try {
170             val file = File(filePath)
171             if (file.exists()) {
172                 val audioFile = AudioFileIO.read(file)
173                 val tag = audioFile.tag
174 
175                 val properties = Arguments.createMap().apply {
176                     putString("title", tag.getFirst(FieldKey.TITLE))
177                     putString("artist", tag.getFirst(FieldKey.ARTIST))
178                     putString("album", tag.getFirst(FieldKey.ALBUM))
179                     putString("lyric", tag.getFirst(FieldKey.LYRICS))
180                     putString("comment", tag.getFirst(FieldKey.COMMENT))
181                 }
182                 promise.resolve(properties)
183             } else {
184                 promise.reject("Error", "File Not Found")
185             }
186         } catch (e: Exception) {
187             promise.reject("Error", e.message)
188         }
189     }
190 }