Open 0xdevalias opened 5 years ago
Note that Sesh uses Chrome's 'Other Bookmarks' folder as the default root/parent to save its sessions in. According to the extension code, there is no simple way to get the ID of this folder except by looking it up by name, which will differ depending on the browser's language settings. The extension therefore includes a bunch of unicode escaped translations by default:
https://github.com/yujiberra/sesh/blob/7c0ab6a9ff07df40fc3af2a64d0c97593f9b4530/sesh.js#L127-L185
A little google-fu lead to me finding the 'Other Bookmarks' entry in the Chromium translation files:
<translation id="883848425547221593">Other Bookmarks</translation>
Which can also be found in the GitHub mirror of the Chromium source code:
We can see all of the translated resource files here, in the generated_resources_*.xtb
files:
Currently, by rough manual count, there seem to be ~81 different translation files (each of which will presumably have their own variation of how 'Other Bookmarks' is shown in the UI.. though there may be duplicates)
Googling for the translation id (883848425547221593
) pointed to a few different translation files seeming to hold the 'Other Bookmarks' string in other Chrome related repos:
<translation id="2354001756790975382">Other bookmarks</translation>
<translation id="883848425547221593">Other Bookmarks</translation>
<translation id="2354001756790975382">Other bookmarks</translation>
<translation id="883848425547221593">Other Bookmarks</translation>
Googling for this new translation id (2354001756790975382
) turned up a few more interesting looking results:
<translation id="883848425547221593">Other Bookmarks</translation>
<translation id="2354001756790975382">Other bookmarks</translation>
Which still seem to be present in the latest source:
<translation id="2354001756790975382">Other bookmarks</translation>
<translation id="883848425547221593">Other Bookmarks</translation>
And can be found on the GitHub mirror of the repo in the components_strings_*.xtb
files:
<translation id="2354001756790975382">Other bookmarks</translation>
<translation id="883848425547221593">Other Bookmarks</translation>
We can git clone
with a few arguments to only retrieve the files we want (rather than the whole repo):
git clone \
--depth 1 \
--filter=blob:none \
--no-checkout \
https://github.com/cirosantilli/test-git-partial-clone \
;
cd test-git-partial-clone
git checkout master -- d1
Doing a --depth=1
clone of the chromium source results in ~1.33GB
of largely unneeded files being downloaded, that results in ~5.8GB
of files on disk:
⇒ git clone --depth 1 https://github.com/chromium/chromium
Cloning into 'chromium'...
remote: Enumerating objects: 403624, done.
remote: Counting objects: 100% (403624/403624), done.
remote: Compressing objects: 100% (283941/283941), done.
remote: Total 403624 (delta 110999), reused 283472 (delta 98263), pack-reused 0
Receiving objects: 100% (403624/403624), 1.33 GiB | 12.27 MiB/s, done.
Resolving deltas: 100% (110999/110999), done.
Checking connectivity: 403624, done.
Updating files: 100% (400650/400650), done.
⇒ du -sh chromium
5.8G chromium
Using the 'partial clone' hack from above...
⇒ git clone --depth 1 --filter=blob:none --sparse https://github.com/chromium/chromium
Cloning into 'chromium'...
remote: Enumerating objects: 34624, done.
remote: Counting objects: 100% (34624/34624), done.
remote: Compressing objects: 100% (25767/25767), done.
remote: Total 34624 (delta 1785), reused 21959 (delta 1265), pack-reused 0
Receiving objects: 100% (34624/34624), 12.97 MiB | 11.89 MiB/s, done.
Resolving deltas: 100% (1785/1785), done.
remote: Enumerating objects: 27, done.
remote: Counting objects: 100% (27/27), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 27 (delta 2), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (27/27), 191.39 KiB | 7.97 MiB/s, done.
Resolving deltas: 100% (2/2), done.
⇒ du -sh chromium
72M chromium
⇒ cd chromium
⇒ git sparse-checkout set components/strings
remote: Enumerating objects: 299, done.
remote: Counting objects: 100% (299/299), done.
remote: Compressing objects: 100% (170/170), done.
remote: Total 299 (delta 166), reused 156 (delta 128), pack-reused 0
Receiving objects: 100% (299/299), 6.22 MiB | 6.25 MiB/s, done.
Resolving deltas: 100% (166/166), done.
Updating files: 100% (326/326), done.
⇒ du -sh ../chromium
106M ../chromium
⇒ du -sh components/strings/
29M components/strings/
⇒ du -shc components/strings/components_strings_*.xtb
280K components/strings/components_strings_af.xtb
..snip..
296K components/strings/components_strings_zu.xtb
28M total
grep
ing for the translation IDs in these files, we can see that since there are 2 different IDs, we get 2 entries per file:
⇒ grep -r -E '2354001756790975382|883848425547221593' components/strings
components/strings/components_strings_fr.xtb:<translation id="2354001756790975382">Autres favoris</translation>
components/strings/components_strings_fr.xtb:<translation id="883848425547221593">Autres favoris</translation>
..snip..
components/strings/components_strings_si.xtb:<translation id="2354001756790975382">වෙනත් පිටු සලකුණු</translation>
components/strings/components_strings_si.xtb:<translation id="883848425547221593">වෙනත් පිටු සලකුණු</translation>
⇒ grep -r -E '2354001756790975382|883848425547221593' components/strings | wc -l
162
But since both translation IDs seem to result to the same string, we can probably just pick one of them:
⇒ grep -r '883848425547221593' components/strings | wc -l
81
⇒ grep -r '2354001756790975382' components/strings | wc -l
81
⇒ grep -r '2354001756790975382' components/strings
components/strings/components_strings_fr.xtb:<translation id="2354001756790975382">Autres favoris</translation>
..snip..
components/strings/components_strings_si.xtb:<translation id="2354001756790975382">වෙනත් පිටු සලකුණු</translation>
We could also use xpath
to extract these 'properly', but it seems way slower than grep
(~40sec vs ~0.5sec):
⇒ time xpath -q -e '//translation[@id='2354001756790975382']/text()' components/strings/components_strings_*.xtb | wc -l
81
xpath -q -e '//translation[@id='2354001756790975382']/text()' 40.75s user 0.38s system 94% cpu 43.389 total
wc -l 0.00s user 0.00s system 0% cpu 43.387 total
⇒ time grep -r '2354001756790975382' components/strings | wc -l
81
grep --color -r '2354001756790975382' components/strings 0.47s user 0.04s system 93% cpu 0.539 total
wc -l 0.00s user 0.00s system 0% cpu 0.538 total
But using a little shell magic, we can combine the two and get pretty instant results:
⇒ TRANSLATIONS=`grep --no-filename -r '2354001756790975382' components/strings` && echo -e "<translations>\n$TRANSLATIONS\n</translations>" | xpath -q -e '//translation/text()' | wc -l
81
⇒ TRANSLATIONS=`grep --no-filename -r '2354001756790975382' components/strings` && echo -e "<translations>\n$TRANSLATIONS\n</translations>" | xpath -q -e '//translation/text()'
Autres favoris
..snip..
වෙනත් පිටු සලකුණු
We could also achieve the same sort of thing as https://github.com/0xdevalias/chrome-NewWindowWithTabsToRight/issues/6#issuecomment-1172841781 by using the GitHub API rather than cloning the git repo directly:
Makes an authenticated HTTP request to the GitHub API and prints the response.
gh api <endpoint> [flags]
-q, --jq <string>
: Query to select values from the response using jq
syntaxThe response will be an array of objects, one object for each item in the directory.
The following command uses the gh
CLI program to query for the files in the components/strings/
directory of the chromium/chromium
repo, filter the result JSON for files that match components_strings_*.xtb
, then get the .download_url
string from each JSON object in the result array:
⇒ gh api /repos/chromium/chromium/contents/components/strings --jq 'map(select(.type == "file" and (.name | test("components_strings_.+\\.xtb"; "i")))) | map(.download_url) | .[]' | wc -l
81
⇒ gh api /repos/chromium/chromium/contents/components/strings --jq 'map(select(.type == "file" and (.name | test("components_strings_.+\\.xtb"; "i")))) | map(.download_url) | .[]' | cat
https://raw.githubusercontent.com/chromium/chromium/main/components/strings/components_strings_af.xtb
..snip..
https://raw.githubusercontent.com/chromium/chromium/main/components/strings/components_strings_zu.xtb
We could then extend this by piping the output to curl
to download the corresponding files:
⇒ gh api /repos/chromium/chromium/contents/components/strings --jq 'map(select(.type == "file" and (.name | test("components_strings_.+\\.xtb"; "i")))) | map(.download_url) | .[]' | (while read url; do curl --silent --remote-name "$url"; done)
⇒ ls
components_strings_af.xtb components_strings_be.xtb components_strings_cs.xtb components_strings_en-GB.xtb components_strings_fa.xtb components_strings_gl.xtb components_strings_hy.xtb components_strings_ja.xtb components_strings_ko.xtb components_strings_mk.xtb components_strings_my.xtb components_strings_pa.xtb components_strings_ru.xtb components_strings_sr-Latn.xtb components_strings_te.xtb components_strings_uz.xtb components_strings_zu.xtb
components_strings_am.xtb components_strings_bg.xtb components_strings_cy.xtb components_strings_es-419.xtb components_strings_fi.xtb components_strings_gu.xtb components_strings_id.xtb components_strings_ka.xtb components_strings_ky.xtb components_strings_ml.xtb components_strings_ne.xtb components_strings_pl.xtb components_strings_si.xtb components_strings_sr.xtb components_strings_th.xtb components_strings_vi.xtb
components_strings_ar.xtb components_strings_bn.xtb components_strings_da.xtb components_strings_es.xtb components_strings_fil.xtb components_strings_hi.xtb components_strings_is.xtb components_strings_kk.xtb components_strings_lo.xtb components_strings_mn.xtb components_strings_nl.xtb components_strings_pt-BR.xtb components_strings_sk.xtb components_strings_sv.xtb components_strings_tr.xtb components_strings_zh-CN.xtb
components_strings_as.xtb components_strings_bs.xtb components_strings_de.xtb components_strings_et.xtb components_strings_fr-CA.xtb components_strings_hr.xtb components_strings_it.xtb components_strings_km.xtb components_strings_lt.xtb components_strings_mr.xtb components_strings_no.xtb components_strings_pt-PT.xtb components_strings_sl.xtb components_strings_sw.xtb components_strings_uk.xtb components_strings_zh-HK.xtb
components_strings_az.xtb components_strings_ca.xtb components_strings_el.xtb components_strings_eu.xtb components_strings_fr.xtb components_strings_hu.xtb components_strings_iw.xtb components_strings_kn.xtb components_strings_lv.xtb components_strings_ms.xtb components_strings_or.xtb components_strings_ro.xtb components_strings_sq.xtb components_strings_ta.xtb components_strings_ur.xtb components_strings_zh-TW.xtb
Once we have the files locally, we can use the same grep
/ xpath
trick that we used previously to extract all of the translations:
⇒ TRANSLATIONS=`grep --no-filename -r '2354001756790975382' *.xtb` && echo -e "<translations>\n$TRANSLATIONS\n</translations>" | xpath -q -e '//translation/text()' | wc -l
81
⇒ TRANSLATIONS=`grep --no-filename -r '2354001756790975382' *.xtb` && echo -e "<translations>\n$TRANSLATIONS\n</translations>" | xpath -q -e '//translation/text()' | sort
Alamisho zingine
..snip..
บุ๊กมาร์กอื่นๆ
To save having to download the files again if they haven't changed, we could look at the sha
field returned by the GitHub API for each file entry (alongside the download_url
field). We could cache the file name
, sha
, and translation locally; and then would only need to re-download the file if the sha
has changed; and read the translation from our cache if the sha
is the same as previously.
We could also add a feature for seeing/restoring recently closed tabs/windows:
chrome.sessions.getRecentlyClosed
: https://developer.chrome.com/docs/extensions/reference/api/sessions#method-getRecentlyClosed
Gets the list of recently closed tabs and/or windows.
chrome.sessions.restore
: https://developer.chrome.com/docs/extensions/reference/api/sessions#method-restore
Reopens a
windows.Window
ortabs.Tab
, with an optional callback to run when the entry has been restored.
chrome.sessions.onChanged.addListener
: https://developer.chrome.com/docs/extensions/reference/api/sessions#event-onChanged
Fired when recently closed tabs and/or windows are changed. This event does not monitor synced sessions changes.
See also:
As I tab junkie I tend to end up with a lot of tabs related to certain 'contexts', and this extension was born out of helping me to 'slice off' those contexts, so that I could then save them for future using something like Sesh (Chrome Store, GitHub)
I'm not sure if this would necessarily make sense to include in this extension.. sort of torn between 'keep it simple' and 'integrate the features I need so I don't require multiple extensions'. Described here for future pondering.
One potential options is to have some features that 'play nice' with Sesh's features, so that by using both you get a 'synergistic effect'. This concept could potentially be extended to other extensions as well, which would reduce the need to 'reimplement features', and help support others work (eg. This features requires you to also have X extension installed: (link to chrome store))
API's