SamDel / ChromeCast-Desktop-Audio-Streamer

Stream the sound of your desktop to your Chromecast Audio device
MIT License
415 stars 30 forks source link

Development 2.0 #29

Closed SamDel closed 5 years ago

SamDel commented 5 years ago

@FA-Bubba & @GrahamDLL

Let's discuss 2.0 development here.

SamDel commented 5 years ago

Ideas from the 1.9 branch, and some (wild) new ideas:

GrahamDLL commented 5 years ago

I would be content if "Start when Windows starts" was in the installer and not an option in the app.

My vote would be to keep the "Desktop Streamer" as is ... There are already a gazillion apps that play Internet radio and upnp/dlna streams and all that ... A separate app "Desktop Streamer Plus" perhaps?

I have devices that are upnp/dlna receivers ... I use Chromecast to stream to them because I can group Chromecast and I can't (that I know of) group upnp/dlna devices. One possible development would be to add support for upnp/dlna devices.

FA-Bubba commented 5 years ago

For what it's worth... I would prefer "Start when Windows starts" remain as an option in the app, because I may not always want the same action. Most other Apps I use that have this as a choice have it in an "Options" section that can be changed anytime.

GrahamDLL commented 5 years ago

My mistake ... I meant to say ... I would be content if "Start when Windows starts" was an option in the installer and not an option in the app ... The ideal solution is to have an option in the app.

SamDel commented 5 years ago

I've added "Start last used devices or groups" to the list, that's a nice one! Only the devices that where playing when the application was closed for the last time will be restarted. For "Start when Windows starts" I will only make an option in the application. Adding an option to the installer was too much work (that wasn't clear in my previous comment).

wikijm added the translations for the new labels in 1.9.xx, so we're almost ready for a 2.0 release, don't you think?

GrahamDLL commented 5 years ago

The only part of 1.9.xx that is still not reliable seems to be the automatic start of devices. Is that coming out of 2.0 because automatic start of last used devices will be added in a future version?

SamDel commented 5 years ago

I don't know what goes wrong there for you, for me it works every time. The failing (random) device sends a 'load failed' message when it tries to load the stream. Can be a resource problem. Is the CPU or memory at 100%? Maybe we find out later, or try to fix it in 2.0. Have you tried, @FA-Bubba ?

GrahamDLL commented 5 years ago

Can be a resource problem. Is the CPU or memory at 100%?

Could be ... it's a pretty pathetic little computer ... I'll look at CPU and memory use tomorrow.

FA-Bubba commented 5 years ago

@SamDel: I've been traveling, and haven't tried anything since Monday... I believe I was using v1.9.65, and the only issues I experienced were various speakers dropping off line, with some automatically coming back on line.

I'll load the current version on Friday -- what are any particular actions you want me to try?

SamDel commented 5 years ago

I've created a new issue for this, and added it to the 2.0 project.

@FA-Bubba : check the 'Automatically start devices at startup' option and restarting the application. All devices should start, for @GrahamDLL some (random) devices give a load failed error.

GrahamDLL commented 5 years ago

I am guessing that I accidentally ran V2 yesterday when I got an exception when using automatically restart last used group. You commented that this might be because of a delay in the start of the "speaker" that is being captured.

The "speaker" that I capture with Desktop Streamer is actually another piece of casting software ...

It is Songcast from ... https://www.linn.co.uk/software

It is this ... https://github.com/openhome/ohSongcast

I am not sure if the version that I am using is the same as the version on Github.

FA-Bubba commented 5 years ago

@SamDel : Regarding "check the 'Automatically start devices at startup' option"...

Since my TV, which has a Chromecast dongle, is listed as a device, I don't believe I'll be using the "Start Devices at Startup" option (UNLESS, there is a way to designate 'preferred devices" for AutoStart).

I personally don't see this as a high priority, and I believe getting the App to run reliably with minimal device drop-offs would be the best focus for now.

SamDel commented 5 years ago

I think the "Start last used devices or groups" option is more useful in most situations. Maybe I can add a "Keep trying to get this device in playing state" option. Now there is a retry here and there, but when the retry didn't work it stops trying.

I'll create a 2.0 release tomorrow (when there are no blocking issues), then we can start adding (and testing) new features.

@GrahamDLL : Nice that the application works with a virtual soundcard like that, never tried. I'll post a new version later, that waits till the soundcard is up and running.

SamDel commented 5 years ago

See the board on what's done in Setup 2.0.1.zip.

I wait for about a minute now if the (virtual) soundcard isn't up and running yet when the application starts.

FA-Bubba commented 5 years ago

I just installed v2.0.1... The UI now only shows two Device Boxes across versus the three it used to be... Perhaps a little less convenient, but it may incent me to start testing the Speaker Groups I created...

ui-v2-0-1

SamDel commented 5 years ago

The window is resizable now! And the size is persisted.

FA-Bubba commented 5 years ago

The resizable window is NICE! Sorry I didn't try that first...

FYI, v2.0.1 crashed in less than 1 hour of play -- it seemed to be trying to restore dropped audio, but was making weird noises (like water flowing). Other Apps also became responsive. so I had to reboot my PC. No entries in the Event Viewer, though...

After the reboot, I started v2.0.1 again, and it has been running OK for the past 3+ hours... Using the Speaker Groups now & no issues.

GrahamDLL commented 5 years ago

2.0.1

Start automatically when Windows starts .... Waits for Songcast to start as expected ... I uninstalled Songcast and the app waited and waited and then "connected to" the built in speakers ... All aspects of "start when Windows starts" appeared to work correctly.

Start last used at startup works as expected ... the logs for this are 039 and 041

The combination of start automatically with Windows and restart last used is less successful ...

I used Firefox to play a radio station and the app to cast the stream ... I restarted Windows while Firefox was playing and the app was streaming ... Firefox automatically restarted and began again to play the radio station ... the app started with Windows but did not start streaming and after a little while it crashed ... The logs from moments before the crash are 038 and 040 ... the Event Viewer entries for the crash are in the zip as evtx and as xml files

crash.zip

SamDel commented 5 years ago

I added a fix for the recording devices in Setup 2.0.2.zip, and there's a link to the wiki page on the options tab now.

GrahamDLL commented 5 years ago

2.0.2

Automatic start with windows plus automatic restart of devices equals long period of inactivity at startup followed by popup message to say that app is unable to find recording device ... Logs 042 + 043

Stop and start the app and everything works as expected ... Log 044

log042-044.zip

GrahamDLL commented 5 years ago

The question mark in the Options Tab is easily overlooked ... It took me several moments to find it even though I knew that something was there.

FA-Bubba commented 5 years ago

v2.0.2 I installed it, and when I launched it, no Devices populated into the Device Window. I Closed teh App & retried 2x, with same result.

The Log contained only one line (copied to image).

v2-0-2_blankstart

SamDel commented 5 years ago

Some more fixes to the recording devices in Setup 2.0.3.zip, and I changed the link to the wiki.

I didn't change anything in the discovering of devices that I'm aware of. I hope it's better now.

FA-Bubba commented 5 years ago

A lot of drop-outs & reconnects. Log & screenshot attached below...

v2-0-3_optionsscreen

Log-2019-02-22-v2-0-3.zip

SamDel commented 5 years ago

Nice to see a long log like that. A quick scan:

That makes me think there's something during daytime (other network traffic?) that causes the devices to drop offline. Do you have audio drop-outs when the speakers restart, or also when playing 'normally'? I'll have a look later if I can improve something there.

FA-Bubba commented 5 years ago

I don't believe there is a lot of network traffic here. There are 4 PCs that are always on, but other than the one PC that I use for the AudioStreamer, there aren't many processes that are running. Each PC does get it's periodic updates from the Web (whenever those are pushed-out), and each PC does a backup between midnight & 5 AM, HOWEVER, my NAS isn't set up yet, so those backups are local, and not via the network. So at any given time, 3 of 4 PCs are in a dormant state (not hibernating, but just idle). Which ever PC is "active", it mainly for eMail, Web browsing, writing Docs, etc, and usually for 1 to 3 hours at a time.

I have some SmartDevices (lighting, Security Cams, monitored power outlets, etc), but I don't believe they generate much network traffic (the Cams are hardwired to a DVR, and I don't believe generate network traffic (unless I load the Viewing App), which is infrequent.

I haven't correlated the drop-outs to any specific activities; for example, the speaker in the room where I am typing this dropped-out & restarted FIVE times while I typed these three paragraphs... I can also hear other speakers when they make the "connection bleep", and I hear those throughout the day, multiple times per hour.


Another weird thing happened: I closed the App last night, and rebooted my PC. I restarted the App this morning, and it opened in a "miniaturized" state -- as if the main window had been resized to the smallest possible size. Here's a screen shot with some notes:

openingsize

FA-Bubba commented 5 years ago

v2.0.3 had a Hard Crash today. From the Event Viewer, it looks as if it may be directly related to a manual Router Reboot I did... I realize that the Audio Streamer needs a network connection to stream the audio, but maybe it could go into a "standby mode" if the network is unavailable? ...then resume once the network is back?

v2-0-3-crashevent

Once the network was back up and stable, I restarted DesktopAudioStreamer, and it started as expected. (Except, it was "Tiny" again -- it would be nice if it 'remembered' the last resizing size...). Here are the Event Logs:

v2-0-3_CrashEvent.zip

SamDel commented 5 years ago

You were right, it had to do with the router reboot. I added a fix for that and for the window size. I also changed something for the restarting speakers, can you post the log again after a day or so?

Setup 2.0.4.zip

GrahamDLL commented 5 years ago

2.0.4

All good.

I used Firefox to play a radio station and the app to cast the stream ... I restarted Windows while Firefox was playing and the app was streaming ... Firefox automatically restarted and began again to play the radio station ... Desktop Streamer began to stream the audio as it should. Logs 045 and 046.

The resize of the window works here as expected and the new size is retained when the app is stopped and started.

log045&046.zip

SamDel commented 5 years ago

Thanks, nice :)! For me it also works fine with 'Start when Windows starts' & 'Auto restart' checked. The application also 'waits' till the network card (IP adresses) is up and running now.

I had the 'tiniest possible window' issue today with 2.0.4. I'm not sure what causes it (yet).

FA-Bubba commented 5 years ago

v2.0.4 has been running continuously for 3 days; I was out of the house for much of this time, so I wasn't able to notice the frequency of drop-outs. For the times when I was working at my PC, I did notice a lot of brief drop-outs, some as short as 1 or 2 seconds... (Log is attached)

A sidebar on some of my speakers: I have some QFX E-350 speakers** attached via Chromecast Audio. I originally purchased these because they were promoted as WiFi Speakers; however, it was only after I received them that I discovered they were intended to ONLY run with the QFX Audio App, which meant I had to devote an iPhone or iPad to stream WiFi music... I eventually got them to play via iTunes on my PC by using AirPlay, but the WiFi stream was not particularly reliable.

Each of those speakers also has an Aux Input, so I am using them with Chromecast Audio, and they have been working great with your App. ONE ISSUE, not related to your App, though, is that when the Audio Stream stops for more than a 'few minutes', the speaker reverts to it's default WiFi Input setting, and the Aux In connection must be manually reset at each speaker, which is a bit inconvenient. I've browsed some forums looking for any hacks that would make the Aux In the default, but so far no luck...

I mention all of this just in case you may have a suggestion on how to hack the speaker so it defaults to Aux In instead of WiFi Audio... They would be GREAT speakers if I could make this one change.

** There are a LOT of results if you Google the speaker name, and here is the set-up guide: http://www.qfxusa.com/Pdf/E-350Quicksetup.pdf

Note that the Amazon page has poor reviews (including one from me)...

Log-2019-02-27-v2-0-4.zip

SamDel commented 5 years ago

Only a couple of speakers dropped off-line during these three days.

I also see 'buffering' messages every now and then, then you probably hear the audio drop-outs. Some periods all devices start sending buffering messages (a lot of network traffic?). Sometimes there are no 'buffering' messages for hours. I'm going to try to increase the buffer on the devices later.

I don't see an option to make aux-in the default source. I'll have another look later. Some small fixes in Setup 2.0.5.zip for keeping the windows size, detect devices that go offline faster, etc.

GrahamDLL commented 5 years ago

2.0.5

Running all day without incident.

log047.zip

SamDel commented 5 years ago

Same here, the latest changes are doing fine. I see buffering messages in the log between 1:45 PM and 6:15 PM every couple of minutes. That's an indication that the buffers on the device are low, but maybe not enough to hear drop-outs.

In 2.0.6 I added a volume meter, for me it's more an indicator that there's capturing & streaming going on. I also added a tooltip text to the group icon, is it good enough to distinguish from devices?

And I added a dropdown to set the buffer on the device. If you set it to 15 seconds an initial buffer of 15 seconds is send to the device (the buffer size can change over time of course). It means the lag between the desktop and the device also increases with 15 seconds. The lag between devices shouldn't change. If you have a lot of drop-outs you can try to increase the buffer size.

FA-Bubba commented 5 years ago

I've been running v2.0,5 for about 3 days now. A number of disconnects, some for extended periods of time. I rebooted the PC on Sat AM, and resumed playing through Sunday night. Still some drop-outs... Here are 3 Logs:

Log-2019-03-03-v2-0-5.zip

SamDel commented 5 years ago

There are quite a lot of network timeouts in the logs. I changed the socket timeout to 1 second in 2.0.5 (to detect disconnects faster), I think that's the cause of a lot of the disconnects.

In 2.0.7 the socket timeout is 10 seconds.

FA-Bubba commented 5 years ago

I just loaded v2.0.7... Will try different buffer settings if/when I experience dropouts.

GrahamDLL commented 5 years ago

2.0.7

All good.

log048.zip

Before the above ... I left Streamer minimised to the tray and unused for a couple of days. During that time, my network mucked up and a couple of Chromecast devices disconnected. When I came back to Streamer it was unresponsive and had to be closed from Task Manager. I noticed that Streamer was using about 260 Meg of memory. The log tab had been open and I guess it was the log that consumed the memory and caused Streamer to lockup. You might want to stop writing to the log when it gets to 20 Meg or whatever.

dday4thedeceiver commented 5 years ago

Throwing these in here as they are really minor: 1- Recording device is not saved and resets at startup 2- Using a third-party app for this, but minimize to tray option would be nice.

BTW 2.0.7 works great so far. FWIW, I'm using it with a virtual audio device (Virtual Audio Cable) and I set the programs I want to cast from to output to Virtual Audio Cable, mainly VLC receiving notifications from Smartthings. Also, 'accidental' use case: it's great for quickly fixing volume levels on all devices!

FA-Bubba commented 5 years ago

Interesting Event: While running v2.0.7, and streaming audio from my PC, my daughter asked Google to play a song ("Hey, Google, play ")... Google responded, and started playing the song, but after a few seconds it abruptly stopped, and the Desktop Audio Stream resumed. We tried this 3 times with the same results...</p> <p>I am guessing that when that Google device started playing music from its (external) source, the Desktop Audio Streamer detected that as a 'drop-out', and reconnected the speaker to its stream...</p> <p>I'm also guessing that if we had first said: "Hey Google, Stop the Desktop Stream", it MIGHT have worked differently (see attached photo below), but I'm not aware if Google has that capability... I'm pretty sure if I had disconnected that Google speaker via the Device Window, the Google-sourced music would have played OK</p> <p>Not a big deal, but I am wondering if the App can be integrated with Google Home/Google Assistant, so a verbal command like "Hey Google, Disconnect the OFFICE SPEAKER from the Desktop Stream", would remove that speaker from the Audio Stream. Similarly, a verbal command like "Hey Google, Connect the OFFICE SPEAKER to the Desktop Stream", could be used to (re)connect that speaker.... (Food for thought?) For what it's worth, I think that would be a great feature!</p> <p>FYI, this is what the Google Home Hub displays when the Desktop Audio Streamer is running: <img src="https://user-images.githubusercontent.com/4895674/54032793-9d2b7100-4180-11e9-8fa1-769f3c718066.JPG" alt="audiodisplay" /></p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/dday4thedeceiver"><img src="https://avatars.githubusercontent.com/u/17881038?v=4" />dday4thedeceiver</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <p>That is true, auto-reconnect cuts in even if the device is busy - this will be a problem. Check for idle status before reconnecting?</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/SamDel"><img src="https://avatars.githubusercontent.com/u/25846417?v=4" />SamDel</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <p>Changes in <a href="https://github.com/SamDel/ChromeCast-Desktop-Audio-Streamer/files/2946751/Setup.2.0.9.zip">Setup 2.0.9.zip</a>:</p> <ul> <li>@GrahamDLL - I also noticed performance problems when there is a lot of log in the text-box. Now I clear the contents of the text-box automatically if the content > 2Mb. But I keep the log in memory until it's > 100Mb. So when you do 'copy to clipboard' you can get up to 100Mb. I didn't test it for multiple days so let me know!</li> <li>Thanks @dday4thedeceiver - You can minimize to tray by clicking the tray icon (show/hide window). You can also uncheck the 'Show window at startup' option. In 2.0.9 the recording device is also saved.</li> <li>In 2.0.9 I'm checking the status before auto-reconnecting. The application is only reconnecting when the status is empty or 'Desktop Audio Streamer'. (The status text is also shown at the bottom of a device box.) In theory that should work, let me know if there are any side effects!</li> </ul> <p>Nice @FA-Bubba ! Is it a recent picture? I thought I changed it to 'Desktop Audio Streamer'. I think it's also possible to send a picture to the Hub, is there any use for that? I hope 2.0.9 fixes it for your daughter 😉. </p> <p>I don't have a Google Home device so I don't know much about the commands, is there a good manual somewhere? When another application starts streaming to a device the application receives a 'close' message from the device. I'm not sure but I think the application also gets a 'close' message after a "Hey Google, Stop the Desktop Stream" command. Before, with auto-reconnect checked, the application was always reconnecting. In 2.0.9, when Google plays a song, the status should change and the Desktop Audio Streamer does not reconnect. I didn't do much testing on it yet..</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/SamDel"><img src="https://avatars.githubusercontent.com/u/25846417?v=4" />SamDel</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <p>There was a bug in the recording device drop down, please skip 2.0.9 and use <a href="https://github.com/SamDel/ChromeCast-Desktop-Audio-Streamer/files/2947157/Setup.2.0.10.zip">2.0.10</a>.</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/FA-Bubba"><img src="https://avatars.githubusercontent.com/u/4895674?v=4" />FA-Bubba</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <p>I just loaded v2.0.10... I was running v2.0.7 for several days, with no significant issues (only the event I mentioned earlier today when the App restarted while Google was playing a requested song). Here's the log:</p> <p><a href="https://github.com/SamDel/ChromeCast-Desktop-Audio-Streamer/files/2947630/Log-2019-03-08-v2-0-7.zip">Log-2019-03-08-v2-0-7.zip</a></p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/SamDel"><img src="https://avatars.githubusercontent.com/u/25846417?v=4" />SamDel</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <ul> <li>First thing I notice in the log is the (reduced) number of 'buffering' messages being sent by the devices. In the 2.0.5 log there were 762, in the 2.0.7 log 113. Did you use the new device buffer option? How many seconds? Less drop-outs?</li> <li>The number of disconnections are about the same.</li> </ul> <p>I was looking for the 'Interesting Event' in the logs but I didn't find it.</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/GrahamDLL"><img src="https://avatars.githubusercontent.com/u/8915072?v=4" />GrahamDLL</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <p>2.0.10</p> <p>It appears that there may still be a problem with recording device selection ... When I select another device in the dropdown it reverts to the previous device.</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/FA-Bubba"><img src="https://avatars.githubusercontent.com/u/4895674?v=4" />FA-Bubba</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <p>The 'Interesting Event' was when Google was asked to play a song while the Desktop Audio Streamer (DAS) was running. Google responded & started to play that song, but it seems that the DAS considered that a drop-out, and over-rode Google, resuming the Audio Stream. This was on the Kitchen Hub, but I don't recall the Date/Time. I will test that sequence later today with v2.0.10</p> <p>So far, I have not adjusted the Device Buffer Option. I was away much of the time that is covered by the 2.0.7 Log I sent, so I don't have a viewpoint of the frequency of drop-outs.</p> <p>And, the previous display picture I sent was from Feb 20... Here's the current screen:</p> <p><img src="https://user-images.githubusercontent.com/4895674/54072366-04602880-4248-11e9-861a-6ea3496bc7f3.jpg" alt="AudioScreenName" /></p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/SamDel"><img src="https://avatars.githubusercontent.com/u/25846417?v=4" />SamDel</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <p>Now I see the 'Interesting Event' in the log. The status changes to "YouTube Music", and the application receives a 'close' message. The fix should work then.</p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/FA-Bubba"><img src="https://avatars.githubusercontent.com/u/4895674?v=4" />FA-Bubba</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <p>I've been running v2.0.10 for about 24 hours; two logs attached -- the first one with "Disconnects" that were caused by my router going off line. I believe the second Log is fairly clean -- the PC the App is on does an auto-reboot every Saturday morning, so it may only have entries from around 5 AM this morning.</p> <p>I tested the Google Music 'event' earlier today, and it worked as you expected: I asked Google to play some music from an external source; it played for a while until I told Google to "Stop the Music". The Hub went back to its "Ambient State" (idle state), and after about 5 to 10 seconds, the Audio Stream restarted.</p> <p>I think it works GREAT!.... I can now ask Google to do something, and the streamed music will resume once Google's task is completed.</p> <p>Thank you for the great work!</p> <p><a href="https://github.com/SamDel/ChromeCast-Desktop-Audio-Streamer/files/2948856/Log-2019-03-09-v2-0-10.zip">Log-2019-03-09-v2-0-10.zip</a></p> </div> </div> <div class="comment"> <div class="user"> <a rel="noreferrer nofollow" target="_blank" href="https://github.com/dday4thedeceiver"><img src="https://avatars.githubusercontent.com/u/17881038?v=4" />dday4thedeceiver</a> commented <strong> 5 years ago</strong> </div> <div class="markdown-body"> <p>Ehh... my Google Homes still report playing music even after I stop them, both in the log and in the Home app.. I have two different kinds too (one Insignia, one Mini) and they both do the same thing. Ugh. So I'm guessing the Hub behaves properly, the speakers do not :( I go into the home app and stop the (already stopped) cast and then DAS reconnects beautifully, but until then it won't.</p> <p>How about a "Force reconnect after X minutes" option?</p> <p>UPDATE: After mucho googling, "Stop speaker_name" works. However nobody in the household will remember to do that, so the force reconnect would still be nice.</p> </div> </div> <div class="page-bar-simple"> <a href="/SamDel/ChromeCast-Desktop-Audio-Streamer/29?page=2" class="next">Next</a> </div> <div class="footer"> <ul class="body"> <li>© <script> document.write(new Date().getFullYear()) </script> Githubissues.</li> <li>Githubissues is a development platform for aggregating issues.</li> </ul> </div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script> <script src="/githubissues/assets/js.js"></script> <script src="/githubissues/assets/markdown.js"></script> <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/highlight.min.js"></script> <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.4.0/build/languages/go.min.js"></script> <script> hljs.highlightAll(); </script> </body> </html>