<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 }