fix(waybar): toggle layout

This commit is contained in:
max_richter 2021-11-22 18:45:44 +01:00
parent 8c268e14b5
commit 9ff1e7ab52
10 changed files with 254 additions and 347 deletions

View File

@ -1,46 +0,0 @@
require "format".setup {
["*"] = {
{cmd = {"sed -i 's/[ \t]*$//'"}} -- remove trailing whitespace
},
vim = {
{
cmd = {"luafmt -w replace"},
start_pattern = "^lua << EOF$",
end_pattern = "^EOF$"
}
},
vimwiki = {
{
cmd = {"prettier -w --parser babel"},
start_pattern = "^{{{javascript$",
end_pattern = "^}}}$"
}
},
lua = {
{
cmd = {
function(file)
return string.format("luafmt -l %s -w replace %s", vim.bo.textwidth, file)
end
}
}
},
go = {
{
cmd = {"gofmt -w", "goimports -w"},
tempfile_postfix = ".tmp"
}
},
javascript = {
{cmd = {"prettier -w", "./node_modules/.bin/eslint --fix"}}
},
markdown = {
{cmd = {"prettier -w"}},
{
cmd = {"black"},
start_pattern = "^```python$",
end_pattern = "^```$",
target = "current"
}
}
}

View File

@ -1,14 +0,0 @@
{
"0 debug pnpm:scope": {
"selected": 1
},
"1 error pnpm": {
"code": "ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND",
"err": {
"name": "pnpm",
"message": "No package.json (or package.yaml, or package.json5) was found in \"/home/jim/.dotfiles/configs/nvim/lua\".",
"code": "ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND",
"stack": "pnpm: No package.json (or package.yaml, or package.json5) was found in \"/home/jim/.dotfiles/configs/nvim/lua\".\n at readProjectManifest (/home/jim/.asdf/installs/nodejs/16.11.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.17.2/node_modules/pnpm/dist/pnpm.cjs:40641:13)\n at async Object.readProjectManifestOnly (/home/jim/.asdf/installs/nodejs/16.11.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.17.2/node_modules/pnpm/dist/pnpm.cjs:40645:28)\n at async Object.readProjectManifestOnly (/home/jim/.asdf/installs/nodejs/16.11.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.17.2/node_modules/pnpm/dist/pnpm.cjs:40864:24)\n at async Object.handler (/home/jim/.asdf/installs/nodejs/16.11.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.17.2/node_modules/pnpm/dist/pnpm.cjs:129763:24)\n at async /home/jim/.asdf/installs/nodejs/16.11.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.17.2/node_modules/pnpm/dist/pnpm.cjs:133951:20\n at async run (/home/jim/.asdf/installs/nodejs/16.11.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.17.2/node_modules/pnpm/dist/pnpm.cjs:133926:34)\n at async runPnpm (/home/jim/.asdf/installs/nodejs/16.11.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.17.2/node_modules/pnpm/dist/pnpm.cjs:134137:5)\n at async /home/jim/.asdf/installs/nodejs/16.11.0/pnpm-global/5/node_modules/.pnpm/pnpm@6.17.2/node_modules/pnpm/dist/pnpm.cjs:134129:7"
}
}
}

View File

@ -2,7 +2,7 @@
WORKSPACE=$(swaymsg -t get_workspaces --raw | jq '.[] | select(.focused == true)') WORKSPACE=$(swaymsg -t get_workspaces --raw | jq '.[] | select(.focused == true)')
WORKSPACE_ID=$(echo $WORKSPACE | jq ".name") WORKSPACE_ID=$(echo $WORKSPACE | jq ".name" | tr -d '"')
WORKSPACE_MODE=$(echo $WORKSPACE | jq ".layout"); WORKSPACE_MODE=$(echo $WORKSPACE | jq ".layout");
MODE_SPLITH='"splith"' MODE_SPLITH='"splith"'
@ -10,17 +10,16 @@ MODE_SPLITV='"splitv"'
MODE_TABBED='"tabbed"' MODE_TABBED='"tabbed"'
MODE_STACKED='"stacked"' MODE_STACKED='"stacked"'
echo $WORKSPACE_MODE function set_layout(){
swaymsg "workspace $(swaymsg -t get_workspaces --raw | jq '.[] | select(.focused == true) .name'); layout $1"
}
if [ $WORKSPACE_MODE = $MODE_SPLITH ]; then if [ $WORKSPACE_MODE = $MODE_SPLITH ]; then
swaymsg "workspace $WORKSPACE_ID; layout splitv" set_layout splitv
elif [ $WORKSPACE_MODE = $MODE_SPLITV ]; then elif [ $WORKSPACE_MODE = $MODE_SPLITV ]; then
swaymsg "workspace $WORKSPACE_ID; layout tabbed" set_layout tabbed
elif [ $WORKSPACE_MODE = $MODE_TABBED ]; then elif [ $WORKSPACE_MODE = $MODE_TABBED ]; then
swaymsg "workspace $WORKSPACE_ID; layout stacking" set_layout stacking
elif [ $WORKSPACE_MODE = $MODE_STACKED ]; then elif [ $WORKSPACE_MODE = $MODE_STACKED ]; then
swaymsg "workspace $WORKSPACE_ID; layout splith" set_layout splith
fi fi
echo $WORKSPACE_ID;

View File

@ -1,8 +1,8 @@
{ {
"height": 20, "height": 20,
"spacing": 4, "spacing": 4,
"modules-left": ["sway/workspaces", "sway/mode", "custom/media"], "modules-left": ["sway/workspaces", "sway/mode"],
"modules-center": ["custom/spotify"], "modules-center": ["custom/media"],
"modules-right": ["pulseaudio", "network", "cpu", "memory", "battery", "custom/clock" ], "modules-right": ["pulseaudio", "network", "cpu", "memory", "battery", "custom/clock" ],
"sway/workspaces": { "sway/workspaces": {
"disable-scroll": true, "disable-scroll": true,

88
configs/waybar/media.log Normal file
View File

@ -0,0 +1,88 @@
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}
__main__ DEBUG Received signal to stop, exiting
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}
__main__ DEBUG Received signal to stop, exiting
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}
__main__ DEBUG Received signal to stop, exiting
__main__ DEBUG Arguments received {'verbose': 0, 'player': 'spotify'}
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}
__main__ DEBUG Arguments received {'verbose': 0, 'player': 'spotify'}
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}
__main__ DEBUG Received signal to stop, exiting
__main__ DEBUG Received signal to stop, exiting
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}
__main__ DEBUG Arguments received {'verbose': 0, 'player': 'spotify'}
__main__ DEBUG Initialize player: chromium
__main__ DEBUG New player appeared, but it's not the selected player, skipping
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}
__main__ DEBUG Arguments received {'verbose': 0, 'player': 'spotify'}
__main__ DEBUG Initialize player: chromium
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ DEBUG chromium is not the filtered player, skipping it
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}
__main__ DEBUG Initialize player: chromium
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}
__main__ DEBUG Initialize player: chromium
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new playback status
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ INFO Received new metadata
__main__ INFO Writing output
__main__ DEBUG Received signal to stop, exiting
__main__ DEBUG Arguments received {'verbose': 0, 'player': None}

View File

@ -3,23 +3,21 @@ import argparse
import logging import logging
import sys import sys
import signal import signal
import time
import gi import gi
import json import json
from os.path import expanduser
gi.require_version('Playerctl', '2.0') gi.require_version('Playerctl', '2.0')
from gi.repository import Playerctl, GLib from gi.repository import Playerctl, GLib
import subprocess
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
playerVisible = False
def write_output(text, player_name): def write_output(text, player):
logger.info('Writing output') logger.info('Writing output')
output = {'text': text.replace("&", "&amp;"), output = {'text': text.replace("\n", " ").strip(),
'class': 'custom-' + player_name, 'class': 'custom-' + player.props.player_name,
'alt': player_name} 'alt': player.props.player_name}
sys.stdout.write(json.dumps(output) + '\n') sys.stdout.write(json.dumps(output) + '\n')
sys.stdout.flush() sys.stdout.flush()
@ -46,32 +44,18 @@ def on_metadata(player, metadata, manager):
if player.props.status != 'Playing' and track_info: if player.props.status != 'Playing' and track_info:
track_info = '' + track_info track_info = '' + track_info
write_output(track_info, player.props.player_name) write_output(track_info, player)
def update_song():
global playerVisible
while not playerVisible:
result = subprocess.run("./capture_mp3.sh",stdout=subprocess.PIPE)
resultString = result.stdout.decode("utf-8")
print(resultString);
write_output(resultString, "Spotify")
time.sleep(6)
def on_player_appeared(manager, player, selected_player=None): def on_player_appeared(manager, player, selected_player=None):
global playerVisible
if player is not None and (selected_player is None or player.name == selected_player): if player is not None and (selected_player is None or player.name == selected_player):
playerVisible = True
init_player(manager, player) init_player(manager, player)
else: else:
logger.debug("New player appeared, but it's not the selected player, skipping") logger.debug("New player appeared, but it's not the selected player, skipping")
def on_player_vanished(manager, player): def on_player_vanished(manager, player):
global playerVisible
logger.info('Player has vanished') logger.info('Player has vanished')
playerVisible = False
update_song()
sys.stdout.write('\n') sys.stdout.write('\n')
sys.stdout.flush() sys.stdout.flush()
@ -81,7 +65,6 @@ def init_player(manager, name):
player = Playerctl.Player.new_from_name(name) player = Playerctl.Player.new_from_name(name)
player.connect('playback-status', on_play, manager) player.connect('playback-status', on_play, manager)
player.connect('metadata', on_metadata, manager) player.connect('metadata', on_metadata, manager)
update_song()
manager.manage_player(player) manager.manage_player(player)
on_metadata(player, player.props.metadata, manager) on_metadata(player, player.props.metadata, manager)
@ -90,7 +73,7 @@ def signal_handler(sig, frame):
logger.debug('Received signal to stop, exiting') logger.debug('Received signal to stop, exiting')
sys.stdout.write('\n') sys.stdout.write('\n')
sys.stdout.flush() sys.stdout.flush()
loop.quit() # loop.quit()
sys.exit(0) sys.exit(0)
@ -107,11 +90,11 @@ def parse_arguments():
def main(): def main():
arguments = parse_arguments() arguments = parse_arguments()
# Initialize logging # Initialize logging
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, LOG=expanduser("~")+"/.dotfiles/configs/waybar/media.log"
logging.basicConfig(level=logging.DEBUG, filename=LOG,
format='%(name)s %(levelname)s %(message)s') format='%(name)s %(levelname)s %(message)s')
# Logging is set by default to WARN and higher. # Logging is set by default to WARN and higher.
@ -140,8 +123,8 @@ def main():
init_player(manager, player) init_player(manager, player)
update_song()
loop.run() loop.run()
if __name__ == '__main__': if __name__ == '__main__':
main() main()

146
configs/waybar/mediaplayer_old.py Executable file
View File

@ -0,0 +1,146 @@
#!/usr/bin/env python3
import argparse
import logging
import sys
import signal
import time
import gi
import json
gi.require_version('Playerctl', '2.0')
from gi.repository import Playerctl, GLib
import subprocess
from os.path import expanduser
home = expanduser("~")
logger = logging.getLogger(__name__)
playerVisible = False
def write_output(text, player_name):
logger.info('Writing output')
output = {'text': text.replace("&", "&amp;"),
'class': 'custom-' + player_name,
'alt': player_name}
sys.stdout.write(json.dumps(output) + '\n')
sys.stdout.flush()
def on_play(player, status, manager):
logger.info('Received new playback status')
on_metadata(player, player.props.metadata, manager)
def on_metadata(player, metadata, manager):
logger.info('Received new metadata')
track_info = ''
if player.props.player_name == 'spotify' and \
'mpris:trackid' in metadata.keys() and \
':ad:' in player.props.metadata['mpris:trackid']:
track_info = 'AD PLAYING'
elif player.get_artist() != '' and player.get_title() != '':
track_info = '{artist} - {title}'.format(artist=player.get_artist(),
title=player.get_title())
else:
track_info = player.get_title()
if player.props.status != 'Playing' and track_info:
track_info = '' + track_info
write_output(track_info, player.props.player_name)
def update_song():
global playerVisible
while not playerVisible:
result = subprocess.run("./capture_mp3.sh",stdout=subprocess.PIPE)
resultString = result.stdout.decode("utf-8")
logger.debug(resultString);
write_output(resultString, "Spotify")
time.sleep(6)
def on_player_appeared(manager, player, selected_player=None):
global playerVisible
if player is not None and (selected_player is None or player.name == selected_player):
playerVisible = True
init_player(manager, player)
else:
logger.debug("New player appeared, but it's not the selected player, skipping")
def on_player_vanished(manager, player):
global playerVisible
logger.info('Player has vanished')
playerVisible = False
update_song()
sys.stdout.write('\n')
sys.stdout.flush()
def init_player(manager, name):
logger.debug('Initialize player: {player}'.format(player=name.name))
player = Playerctl.Player.new_from_name(name)
player.connect('playback-status', on_play, manager)
player.connect('metadata', on_metadata, manager)
update_song()
manager.manage_player(player)
on_metadata(player, player.props.metadata, manager)
def signal_handler(sig, frame):
logger.debug('Received signal to stop, exiting')
sys.stdout.write('\n')
sys.stdout.flush()
loop.quit()
sys.exit(0)
def parse_arguments():
parser = argparse.ArgumentParser()
# Increase verbosity with every occurrence of -v
parser.add_argument('-v', '--verbose', action='count', default=0)
# Define for which player we're listening
parser.add_argument('--player')
return parser.parse_args()
def main():
arguments = parse_arguments()
# Initialize logging
LOG = home+"/.dotfiles/configs/waybar/media.log" logger.setLevel(max((3 - arguments.verbose) * 10, 0))
logging.basicConfig(stream=sys.stderr, filename=LOG, level=logging.DEBUG,
format='%(name)s %(levelname)s %(message)s')
logger.setLevel(0)
# Log the sent command line arguments
logger.debug('Arguments received {}'.format(vars(arguments)))
manager = Playerctl.PlayerManager()
loop = GLib.MainLoop()
manager.connect('name-appeared', lambda *args: on_player_appeared(*args, arguments.player))
manager.connect('player-vanished', on_player_vanished)
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
for player in manager.props.player_names:
if arguments.player is not None and arguments.player != player.name:
logger.debug('{player} is not the filtered player, skipping it'
.format(player=player.name)
)
continue
init_player(manager, player)
update_song()
loop.run()
if __name__ == '__main__':
main()

BIN
configs/waybar/output.mp3 Normal file

Binary file not shown.

View File

@ -1,249 +0,0 @@
{
"location": {
"altitude": 300.0,
"latitude": 45.0,
"longitude": 2.0
},
"matches": [
{
"channel": "0",
"frequencyskew": 0.00008058548,
"id": "341270538",
"offset": 148.84515625,
"timeskew": -0.0023667216
}
],
"tagid": "68982327-bef9-4ff3-a426-7fea39f7997f",
"timestamp": 95912955,
"timezone": "Europe/Paris",
"track": {
"albumadamid": "1477092467",
"artists": [
{
"adamid": "827504058",
"id": "44445618"
}
],
"genres": {
"primary": "Alternative"
},
"highlightsurls": {
"artisthighlightsurl": "https://cdn.shazam.com/video/v3/en/US/android/827504058/highlights?affiliate=mttnagencyid%3D769459046716559743%26mttnsiteid%3D125115%26mttn3pid%3Da_custom_779816081798873874%26mttnsub1%3DShazam_android_am%26mttnsub2%3D5348615A-616D-3235-3830-44754D6D5973%26itscg%3D30201%26app%3Dmusic%26itsct%3DShazam_android_am",
"relatedhighlightsurl": "https://cdn.shazam.com/video/v3/en/US/android/44445618/artist-similarities-id-44445618/relatedhighlights?max_artists=5&affiliate=mttnagencyid%3D769459046716559743%26mttnsiteid%3D125115%26mttn3pid%3Da_custom_779816081798873874%26mttnsub1%3DShazam_android_am%26mttnsub2%3D5348615A-616D-3235-3830-44754D6D5973%26itscg%3D30201%26app%3Dmusic%26itsct%3DShazam_android_am"
},
"hub": {
"actions": [
{
"id": "1477092472",
"name": "apple",
"type": "applemusicplay"
},
{
"name": "apple",
"type": "uri",
"uri": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview115/v4/17/c4/ff/17c4ff80-8823-5ce9-fa5a-0c1892129e3b/mzaf_15603304596709002890.plus.aac.ep.m4a"
}
],
"displayname": "APPLE MUSIC",
"explicit": false,
"image": "https://images.shazam.com/static/icons/hub/android/v5/applemusic_{scalefactor}.png",
"options": [
{
"actions": [
{
"name": "hub:applemusic:deeplink",
"type": "intent",
"uri": "intent://music.apple.com/us/album/nothings-older-than-yesterday/1477092467?i=1477092472&mttnagencyid=769459046716559743&mttnsiteid=125115&mttn3pid=a_custom_779816081798873874&mttnsub1=Shazam_android_am&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_android_am#Intent;scheme=http;package=com.apple.android.music;action=android.intent.action.VIEW;end"
},
{
"id": "1477092472",
"name": "hub:applemusic:connect",
"type": "applemusicconnect",
"uri": "https://unsupported.shazam.com"
},
{
"name": "hub:applemusic:androidstore",
"type": "uri",
"uri": "https://play.google.com/store/apps/details?id=com.apple.android.music&referrer=utm_source=https%3A%2F%2Fmusic.apple.com%2Fsubscribe%3Fmttnagencyid%3D769459046716559743%26mttnsiteid%3D125115%26mttn3pid%3Da_custom_779816081798873874%26mttnsub1%3DShazam_android_am%26mttnsub2%3D5348615A-616D-3235-3830-44754D6D5973%26itscg%3D30201%26app%3Dmusic%26itsct%3DShazam_android_am"
}
],
"beacondata": {
"providername": "applemusic",
"type": "open"
},
"caption": "OPEN",
"colouroverflowimage": false,
"image": "https://images.shazam.com/static/icons/hub/android/v5/overflow-open-option_{scalefactor}.png",
"listcaption": "Open in Apple Music",
"overflowimage": "https://images.shazam.com/static/icons/hub/android/v5/applemusic-overflow_{scalefactor}.png",
"providername": "applemusic",
"type": "open"
}
],
"providers": [
{
"actions": [
{
"name": "hub:spotify:searchdeeplink",
"type": "uri",
"uri": "spotify:search:Nothing%27s%20Older%20Than%20Yesterday%20Cari%20Cari"
}
],
"caption": "Open in Spotify",
"images": {
"default": "https://images.shazam.com/static/icons/hub/android/v5/spotify_{scalefactor}.png",
"overflow": "https://images.shazam.com/static/icons/hub/android/v5/spotify-overflow_{scalefactor}.png"
},
"type": "SPOTIFY"
},
{
"actions": [
{
"name": "hub:youtubemusic:androiddeeplink",
"type": "uri",
"uri": "https://music.youtube.com/search?q=Nothings+Older+Than+Yesterday+Cari+Cari&feature=shazam"
}
],
"caption": "Open in YouTube Music",
"images": {
"default": "https://images.shazam.com/static/icons/hub/android/v5/youtubemusic_{scalefactor}.png",
"overflow": "https://images.shazam.com/static/icons/hub/android/v5/youtubemusic-overflow_{scalefactor}.png"
},
"type": "YOUTUBEMUSIC"
},
{
"actions": [
{
"name": "hub:deezer:searchdeeplink",
"type": "uri",
"uri": "deezer-query://www.deezer.com/play?query=%7Btrack%3A%27Nothing%5C%27s+Older+Than+Yesterday%27%20artist%3A%27Cari+Cari%27%7D"
}
],
"caption": "Open in Deezer",
"images": {
"default": "https://images.shazam.com/static/icons/hub/android/v5/deezer_{scalefactor}.png",
"overflow": "https://images.shazam.com/static/icons/hub/android/v5/deezer-overflow_{scalefactor}.png"
},
"type": "DEEZER"
}
],
"type": "APPLEMUSIC"
},
"images": {
"background": "https://is3-ssl.mzstatic.com/image/thumb/Music114/v4/62/5c/d7/625cd78a-6d55-3128-1a55-894d244800c9/pr_source.png/800x800cc.jpg",
"coverart": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/b8/c5/3c/b8c53c9c-489f-3bec-1b25-c232368a1fac/rls00069784.jpg/400x400cc.jpg",
"coverarthq": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/b8/c5/3c/b8c53c9c-489f-3bec-1b25-c232368a1fac/rls00069784.jpg/400x400cc.jpg",
"joecolor": "b:031827p:fdf0dfs:f7831et:cbc5baq:c66e1f"
},
"isrc": "ATT801713001",
"key": "341270538",
"layout": "5",
"relatedtracksurl": "https://cdn.shazam.com/shazam/v3/en/US/android/-/tracks/track-similarities-id-341270538?startFrom=0&pageSize=20&connected=",
"sections": [
{
"metadata": [
{
"text": "Anaana",
"title": "Album"
},
{
"text": "recordJet",
"title": "Label"
},
{
"text": "2017",
"title": "Released"
}
],
"metapages": [
{
"caption": "Cari Cari",
"image": "https://is3-ssl.mzstatic.com/image/thumb/Music114/v4/62/5c/d7/625cd78a-6d55-3128-1a55-894d244800c9/pr_source.png/800x800cc.jpg"
},
{
"caption": "Nothing's Older Than Yesterday",
"image": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/b8/c5/3c/b8c53c9c-489f-3bec-1b25-c232368a1fac/rls00069784.jpg/400x400cc.jpg"
}
],
"tabname": "Song",
"type": "SONG"
},
{
"beacondata": {
"commontrackid": "70387093",
"lyricsid": "19307144",
"providername": "musixmatch"
},
"footer": "Writer(s): Stephanie Widmer, Alexander Koeck
Lyrics powered by www.musixmatch.com",
"tabname": "Lyrics",
"text": [
"Waves are rolling on the beach",
"Sunlight is striking through the trees",
"Heads up, don't look back",
"On the coast of Jamaica, there ain't no looking back",
"",
"Move, nothing's older than yesterday",
"'Cause we're riding, it's just the streets and you and me",
"Heads up, don't look back!",
"On the streets of Tokyo, no looking back",
"C'mon baby, we can stay up all night",
"I stay here till sunrise",
"Come on, don't miss this ride"
],
"type": "LYRICS",
"url": "https://cdn.shazam.com/lyrics/v1/en/US/android/musixmatch/subtitles/70387093/202/1?token=d3fe124c5cfcec867f24caddbb4fb700"
},
{
"tabname": "Video",
"type": "VIDEO",
"youtubeurl": "https://cdn.shazam.com/video/v3/-/US/android/341270538/youtube/video?q=Cari+Cari+%22Nothing's+Older+Than+Yesterday%22&c=UCiL526VL2ZWT9pUuUQP52uw"
},
{
"actions": [
{
"id": "44445618",
"type": "artistposts"
},
{
"id": "44445618",
"type": "artist"
}
],
"avatar": "https://is3-ssl.mzstatic.com/image/thumb/Music114/v4/62/5c/d7/625cd78a-6d55-3128-1a55-894d244800c9/pr_source.png/800x800cc.jpg",
"id": "44445618",
"name": "Cari Cari",
"tabname": "Artist",
"toptracks": {
"url": "https://cdn.shazam.com/shazam/v3/en/US/android/-/tracks/artisttoptracks_44445618?startFrom=0&pageSize=20&connected="
},
"type": "ARTIST",
"url": "https://cdn.shazam.com/digest/v1/en/US/android/artist/44445618/recentpost",
"verified": false
},
{
"tabname": "Related",
"type": "RELATED",
"url": "https://cdn.shazam.com/shazam/v3/en/US/android/-/tracks/track-similarities-id-341270538?startFrom=0&pageSize=20&connected="
}
],
"share": {
"avatar": "https://is3-ssl.mzstatic.com/image/thumb/Music114/v4/62/5c/d7/625cd78a-6d55-3128-1a55-894d244800c9/pr_source.png/800x800cc.jpg",
"href": "https://www.shazam.com/track/341270538/nothings-older-than-yesterday",
"html": "https://www.shazam.com/snippets/email-share/341270538?lang=en&country=US",
"image": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/b8/c5/3c/b8c53c9c-489f-3bec-1b25-c232368a1fac/rls00069784.jpg/400x400cc.jpg",
"snapchat": "https://www.shazam.com/partner/sc/track/341270538",
"subject": "Nothing's Older Than Yesterday - Cari Cari",
"text": "I used Shazam to discover Nothing's Older Than Yesterday by Cari Cari.",
"twitter": "I used @Shazam to discover Nothing's Older Than Yesterday by Cari Cari."
},
"subtitle": "Cari Cari",
"title": "Nothing's Older Than Yesterday",
"type": "MUSIC",
"url": "https://www.shazam.com/track/341270538/nothings-older-than-yesterday",
"urlparams": {
"{trackartist}": "Cari+Cari",
"{tracktitle}": "Nothing%27s+Older+Than+Yesterday"
}
}
}