Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3a462ee146 | ||
|
|
4bdfae155a | ||
|
|
5778035656 | ||
|
|
0a28f05d53 | ||
|
|
6537c34a38 | ||
|
|
094f116b10 |
@@ -117,7 +117,7 @@ jobs:
|
|||||||
echo "Release: $SERVER/$REPO/releases/tag/$REF_NAME"
|
echo "Release: $SERVER/$REPO/releases/tag/$REF_NAME"
|
||||||
else
|
else
|
||||||
owner=${REPO%%/*}
|
owner=${REPO%%/*}
|
||||||
version="$(echo "$REF_NAME" | tr -c 'A-Za-z0-9._-\n' '-')-${SHA::8}"
|
version="$(printf '%s' "$REF_NAME" | tr -c 'A-Za-z0-9._-' '-')-$(printf '%s' "$SHA" | cut -c1-8)"
|
||||||
for f in *.apk SHA256SUMS; do
|
for f in *.apk SHA256SUMS; do
|
||||||
curl -fsS -X PUT -H "$auth" --upload-file "$f" "$SERVER/api/packages/$owner/generic/musicshare-android/$version/$f"
|
curl -fsS -X PUT -H "$auth" --upload-file "$f" "$SERVER/api/packages/$owner/generic/musicshare-android/$version/$f"
|
||||||
echo "Uploaded $f"
|
echo "Uploaded $f"
|
||||||
|
|||||||
@@ -10,3 +10,5 @@ next-env.d.ts
|
|||||||
# Production secrets and database backups
|
# Production secrets and database backups
|
||||||
deploy/production.env
|
deploy/production.env
|
||||||
backups/
|
backups/
|
||||||
|
.aider*
|
||||||
|
deploy/gitea-runner/data/
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"expo": {
|
"expo": {
|
||||||
"name": "musicshare",
|
"name": "musicshare",
|
||||||
"slug": "musicshare",
|
"slug": "musicshare",
|
||||||
"version": "1.4.0",
|
"version": "1.5.0",
|
||||||
"orientation": "portrait",
|
"orientation": "portrait",
|
||||||
"icon": "./assets/images/icon.png",
|
"icon": "./assets/images/icon.png",
|
||||||
"scheme": "musicshare",
|
"scheme": "musicshare",
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
},
|
},
|
||||||
"predictiveBackGestureEnabled": false,
|
"predictiveBackGestureEnabled": false,
|
||||||
"package": "tech.chrisedwards.musicshare",
|
"package": "tech.chrisedwards.musicshare",
|
||||||
"versionCode": 5
|
"versionCode": 6
|
||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"expo-router",
|
"expo-router",
|
||||||
|
|||||||
+4
-2
@@ -121,9 +121,11 @@ class MediaListenerService : NotificationListenerService() {
|
|||||||
private fun snapshot(controller: MediaController): Playback? {
|
private fun snapshot(controller: MediaController): Playback? {
|
||||||
val metadata = controller.metadata
|
val metadata = controller.metadata
|
||||||
val title = metadata?.text(MediaMetadata.METADATA_KEY_TITLE) ?: metadata?.text(MediaMetadata.METADATA_KEY_DISPLAY_TITLE)
|
val title = metadata?.text(MediaMetadata.METADATA_KEY_TITLE) ?: metadata?.text(MediaMetadata.METADATA_KEY_DISPLAY_TITLE)
|
||||||
val artist = metadata?.text(MediaMetadata.METADATA_KEY_ARTIST)
|
val realArtist = metadata?.text(MediaMetadata.METADATA_KEY_ARTIST)
|
||||||
?: metadata?.text(MediaMetadata.METADATA_KEY_ALBUM_ARTIST)
|
?: metadata?.text(MediaMetadata.METADATA_KEY_ALBUM_ARTIST)
|
||||||
?: metadata?.text(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE)
|
val artist = realArtist ?: metadata?.text(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE)
|
||||||
|
// A phone video or other non-song: treat the session as if it weren't there.
|
||||||
|
if (NonMusicFilter.isNonMusic(controller.packageName, title, realArtist)) return null
|
||||||
val playbackState = controller.playbackState
|
val playbackState = controller.playbackState
|
||||||
val state = when (playbackState?.state) {
|
val state = when (playbackState?.state) {
|
||||||
PlaybackState.STATE_PLAYING, PlaybackState.STATE_BUFFERING,
|
PlaybackState.STATE_PLAYING, PlaybackState.STATE_BUFFERING,
|
||||||
|
|||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
package tech.chrisedwards.musicshare.nowplaying
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keeps things that aren't songs (phone videos, screen recordings) out of what we share.
|
||||||
|
* General-purpose players report a local file's name as its title, so a video played
|
||||||
|
* in VLC would otherwise show up as "VID_20261025_181502.mp4".
|
||||||
|
*/
|
||||||
|
internal object NonMusicFilter {
|
||||||
|
/** Players that also open videos and arbitrary files: only share from them when there's a real artist. */
|
||||||
|
private val GENERAL_PLAYERS = setOf(
|
||||||
|
"org.videolan.vlc",
|
||||||
|
"org.videolan.vlc.debug",
|
||||||
|
"com.mxtech.videoplayer.ad",
|
||||||
|
"com.mxtech.videoplayer.pro",
|
||||||
|
"is.xyz.mpv",
|
||||||
|
"com.brouken.player", // Just Player
|
||||||
|
"com.google.android.apps.photos",
|
||||||
|
"com.sec.android.gallery3d",
|
||||||
|
"com.android.gallery3d",
|
||||||
|
"com.miui.gallery",
|
||||||
|
"com.google.android.apps.nbu.files",
|
||||||
|
"com.sec.android.app.myfiles",
|
||||||
|
)
|
||||||
|
|
||||||
|
private val FILE_NAME = Regex(
|
||||||
|
""".*\.(mp4|m4v|mkv|mov|webm|avi|3gp|3g2|wmv|flv|ts|mts|m2ts|mpg|mpeg)$""",
|
||||||
|
RegexOption.IGNORE_CASE,
|
||||||
|
)
|
||||||
|
|
||||||
|
/** Camera, screen-recorder and messaging-app naming schemes. */
|
||||||
|
private val RECORDING_NAME = Regex(
|
||||||
|
"""^(VID|PXL|IMG|MVIMG|MOV|DSC|GOPR|GX\d{2}|Screen[_ ]?Recording|Screenrecorder|Record|signal|WhatsApp Video)[-_ ]?\d.*""",
|
||||||
|
RegexOption.IGNORE_CASE,
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [realArtist] is the artist/album-artist tag only, not the display-subtitle fallback,
|
||||||
|
* which players fill with folder names and the like.
|
||||||
|
*/
|
||||||
|
fun isNonMusic(packageName: String, title: String?, realArtist: String?): Boolean {
|
||||||
|
val name = title?.trim().orEmpty()
|
||||||
|
if (name.isEmpty()) return false
|
||||||
|
if (FILE_NAME.matches(name) || RECORDING_NAME.matches(name)) return true
|
||||||
|
return packageName in GENERAL_PLAYERS && realArtist.isNullOrBlank()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@musicshare/mobile",
|
"name": "@musicshare/mobile",
|
||||||
"main": "expo-router/entry",
|
"main": "expo-router/entry",
|
||||||
"version": "1.4.0",
|
"version": "1.5.0",
|
||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@expo-google-fonts/poppins": "^0.4.1",
|
"@expo-google-fonts/poppins": "^0.4.1",
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Videos and screen recordings played on your phone no longer show up as your song, and notifications now have their own section.
|
||||||
Generated
+1
-1
@@ -809,7 +809,7 @@
|
|||||||
},
|
},
|
||||||
"apps/mobile": {
|
"apps/mobile": {
|
||||||
"name": "@musicshare/mobile",
|
"name": "@musicshare/mobile",
|
||||||
"version": "1.4.0",
|
"version": "1.5.0",
|
||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@expo-google-fonts/poppins": "^0.4.1",
|
"@expo-google-fonts/poppins": "^0.4.1",
|
||||||
|
|||||||
Reference in New Issue
Block a user