diepfanne
diepfanne

Reputation: 13

Lua: "attempt to concatenate global" Error in MPV

I am trying to write a little script to output filetags in mpv. My script looks like this:

require 'os'
require 'string'

function displayTrack()
    currentTrack = mp.get_property("metadata/by-key/Title")
    currentArtist = mp.get_property("metadata/by-key/Artist")
    currentAlbum = mp.get_property("metadata/by-key/Album")
    print(currentArtist)
    print(currentAlbum)
    print(currentTrack)

    if currentTrack == nil then
        os.execute("terminal-notifier -title '" .. currentArtist .. "' -message 'Unknown Title'")
    else
        os.execute("terminal-notifier -title '" .. currentArtist .. "' -message '" .. currentAlbum .. " - " .. currentTrack .. "'")
    end
end

mp.observe_property("eof-reached", "bool", displayTrack)

Catching the tags and printing them works with every tested title. But if i want to uncomment the 5 lines starting with "if currentTrack == nil ..." so it also dislpays a native notification i get the LUA error:

/Users/marcel/.config/mpv/scripts/notification.lua:15: attempt to concatenate global 'currentArtist' (a nil value)

Can somebody tell me why i can print the string but not forward it to the os.execute?

Upvotes: 0

Views: 1979

Answers (2)

Oleg V. Volkov
Oleg V. Volkov

Reputation: 22461

It is not os.execute, it is concatenation - .. - that can't work with nil. And yes, you can print standalone nil just fine. In your case not only currentTrack is nil, but currentArtist too, so you can't build a string with it. Consider if you even need those entries where you don't have value for currentArtist and either skip them, provide alternative if branch to do something else or provide some default in concatenation. Usual idiom is (currentArtist or '') - here your default will be empty string.

Upvotes: 1

Sebastian Hoffmann
Sebastian Hoffmann

Reputation: 2914

  if currentTrack == nil then
    os.execute("terminal-notifier -title '" .. currentArtist .. "' -message 'Unknown Title'")

If this branch gets executed, currentTrack is nil, thus the concatenation fails as stated by the error message.

Just get rid of the concatenation all together:

  if currentTrack == nil then
    os.execute("terminal-notifier -title -message 'Unknown Title'")

Upvotes: 0

Related Questions