Removed C dependency
parent
07dbddf83c
commit
d130776088
@ -0,0 +1,104 @@
|
||||
<!doctype html>
|
||||
<link rel="stylesheet" href="../basic.css">
|
||||
<script
|
||||
src="https://code.jquery.com/jquery-3.5.1.min.js"
|
||||
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="../audioplayer/audioplayer.js" type="text/javascript"></script>
|
||||
<link rel='stylesheet' type="text/css" href="../audioplayer/audioplayer.css"/>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Libre Baskerville">
|
||||
<html xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml" lang="es-ES" >
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<base href="">
|
||||
<meta charset="utf-8" />
|
||||
<title>El Mentidero - 37: Pelusa</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="https://dak1kprtrvj9u.cloudfront.net/assets/favicon.ico"/>
|
||||
<link rel="canonical" href="https://elmentidero.net"/>
|
||||
<meta property="og:site_name" content="El Mentidero"/>
|
||||
<meta property="og:title" content="El Mentidero"/>
|
||||
<meta property="og:url" content="https://elmentidero.net"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
<meta property="og:description" content="Tres españoles en tres ciudades distintas. Desde el Reino Unido, Francia y Estados Unidos, Samuel, Rebeca e Isma hablan de sus experiencias en el extranjero y lo que es vivir fuera de tu país. Esto es vida fuera de España."/>
|
||||
<meta property="og:image" content="https://cdn.elmentidero.net/assets/mentidero_album_art_1500_1500.jpg?format=1500w"/>
|
||||
<meta property="og:image:width" content="1500"/>
|
||||
<meta property="og:image:height" content="1500"/>
|
||||
<meta itemprop="name" content="El Mentidero"/>
|
||||
<meta itemprop="url" content="https://elmentidero.net"/>
|
||||
<meta itemprop="description" content="Tres españoles en tres ciudades distintas. Desde el Reino Unido, Francia y Estados Unidos, Samuel, Rebeca e Isma hablan de sus experiencias en el extranjero y lo que es vivir fuera de tu país. Esto es vida fuera de España."/>
|
||||
<meta itemprop="thumbnailUrl" content="https://cdn.elmentidero.net/assets/mentidero_album_art_1500_1500.jpg?format=1500w"/>
|
||||
<link rel="image_src" href="" />
|
||||
<meta itemprop="image" content="https://cdn.elmentidero.net/assets/mentidero_album_art_1500_1500.jpg?format=1500w"/>
|
||||
<meta name="twitter:title" content="El Mentidero"/>
|
||||
<meta name="twitter:image" content="https://cdn.elmentidero.net/assets/mentidero_album_art_1500_1500.jpg?format=1500w"/>
|
||||
<meta name="twitter:url" content="https://elmentidero.net"/>
|
||||
<meta name="twitter:card" content="summary"/>
|
||||
<meta name="twitter:description" content="Tres españoles en tres ciudades distintas. Desde el Reino Unido, Francia y Estados Unidos, Samuel, Rebeca e Isma hablan de sus experiencias en el extranjero y lo que es vivir fuera de tu país. Esto es vida fuera de España."/>
|
||||
<meta name="description" content="Tres españoles en tres ciudades distintas. Desde el Reino Unido, Francia y Estados Unidos, Samuel, Rebeca e Isma hablan de sus experiencias en el extranjero y lo que es vivir fuera de tu país. Esto es vida fuera de España." />
|
||||
</head>
|
||||
|
||||
<ul>
|
||||
<li><a href="../index.html">Podcast</a></li>
|
||||
<li><a href="../nosotros.html">Nosotros</a></li>
|
||||
<li><a href="../contacto.html">Contacto</a></li>
|
||||
<li><a href="../mentidero.rss.xml">RSS</a></li>
|
||||
<li><a href="https://podcasts.apple.com/us/podcast/el-mentidero/id1498227261">Apple Podcasts</a></li>
|
||||
<li><a href="https://overcast.fm/itunes1498227261">Overcast</a></li>
|
||||
<li><a href="https://open.spotify.com/show/7wkU8dTYRgEWfXCGAFdnNs?si=ozPIDFPmRQCALvBoj_e1lA">Spotify</a></li>
|
||||
<li><a href="https://playmusic.app.goo.gl/?apn=com.google.android.music&ibi=com.google.PlayMusic&isi=691797987&ius=googleplaymusic&link=https%3A%2F%2Fplay.google.com%2Fmusic%2Fm%2FIea5gsumqo7q63xxrx6y6xha5tq%3Ft%3DEl_Mentidero%26pcampaignid%3DMKT-na-all-co-pr-mu-pod-16">Google Podcasts</a></li>
|
||||
</ul>
|
||||
|
||||
<p class=h1>El Mentidero</p>
|
||||
|
||||
<div>
|
||||
<p class="podtitle">37: Pelusa</p>
|
||||
<p class="poddate">27/11/2020</p>
|
||||
</div>
|
||||
|
||||
<div id="ag1" class="audiogallery skin-wave auto-init" style="opacity:0; margin-top: 70px;"
|
||||
data-options='{
|
||||
"cueFirstMedia": "off",
|
||||
"autoplay": "off",
|
||||
"autoplayNext": "off",
|
||||
"design_menu_position": "bottom",
|
||||
"enable_easing": "off",
|
||||
"design_menu_height": "100"
|
||||
}'
|
||||
>
|
||||
<div class="items">
|
||||
<div class="audioplayer-tobe skin-wave button-aspect-noir" data-thumb="https://cdn.elmentidero.net/assets/mentidero_album_art_1500_1500.jpg"
|
||||
data-type="audio"
|
||||
data-source="https://cdn.elmentidero.net/episodes/elmentidero37.mp3"
|
||||
data-options='{
|
||||
"settings_php_handler": "inc/php/publisher.php",
|
||||
"skinwave_comments_enable": "off",
|
||||
"skinwave_comments_retrievefromajax": "off",
|
||||
"skinwave_wave_mode": "canvas",
|
||||
"pcm_data_try_to_generate": "off",
|
||||
"pcm_data_try_to_generate_wait_for_real_pcm": "off",
|
||||
"skinwave_wave_mode_canvas_waves_number": 3,
|
||||
"skinwave_wave_mode_canvas_waves_padding": 1,
|
||||
"skinwave_wave_mode_canvas_reflection_size": 0.25,
|
||||
"design_color_bg": "F4A261",
|
||||
"design_color_highlight": "E76F51"
|
||||
}'>
|
||||
<div class="feed-dzsap feed-artist">Isma Arenzana, Samuel Bermejo y Rebeca L. Rodríguez</div>
|
||||
<div class="feed-dzsap feed-songname">37: Pelusa</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="download">
|
||||
<a href="https://cdn.elmentidero.net/episodes/elmentidero37.mp3" download="true">Download</a>
|
||||
</div>
|
||||
<div>
|
||||
<span class="description">
|
||||
<p class="podbodyep">Empezamos el programa de esta semana entonando el mea culpa. Nos disculpamos por los fallos técnicos y de contenido del programa anterior. Sam se guarda un comodín para poder liarla en el futuro. Comentamos la noticia de la muerte de Maradona reflexionando sobre la influencia que tienen los deportistas en la sociedad actual. ¿Podemos separar al profesional de la persona? Nos hacemos la misma pregunta en rl mundo del arte. ¿Debemos separar al arte del artista? Deseamos a los estadounidenses un feliz día de Acción de Gracias. Isma nos explica el origen de la tradición y cómo se celebra, particularmente este año con el coronavirus. Errores, fútbol, risas y mucho pavo hoy en El Mentidero. ¿Te apuntas?</p>
|
||||
</span>
|
||||
</div>
|
||||
<footer>
|
||||
<div class="footer">
|
||||
<p>El Mentidero. 2020. Creative Commons Attribution-NonCommercial-ShareAlike.</p>
|
||||
<div>
|
||||
</footer>
|
||||
</html>
|
@ -1,232 +1,343 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
|
||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/arenzana/yessir v0.0.0-20200414181447-2d06b8083100 h1:cYwjNoo5hBcp7KGdCHEyW2on7gkpXBk1DZ8NpQjWgWs=
|
||||
github.com/arenzana/yessir v0.0.0-20200414181447-2d06b8083100/go.mod h1:CAvCtTXItf3uX/Ysn6vFbpxi+hM7BPVXLanVsvoCddw=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/armon/go-metrics v0.0.0-20160717043458-3df31a1ada83/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||
github.com/asaskevich/govalidator v0.0.0-20180315120708-ccb8e960c48f/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
||||
github.com/aws/aws-sdk-go v1.35.20 h1:Hs7x9Czh+MMPnZLQqHhsuZKeNFA3Vuf7pdy2r5QlVb0=
|
||||
github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
|
||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||
github.com/aws/aws-sdk-go v1.36.12 h1:YJpKFEMbqEoo+incs5qMe61n1JH3o4O1IMkMexLzJG8=
|
||||
github.com/aws/aws-sdk-go v1.36.12/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/djimenez/iconv-go v0.0.0-20160305225143-8960e66bd3da h1:0qwwqQCLOOXPl58ljnq3sTJR7yRuMolM02vjxDh4ZVE=
|
||||
github.com/djimenez/iconv-go v0.0.0-20160305225143-8960e66bd3da/go.mod h1:ns+zIWBBchgfRdxNgIJWn2x6U95LQchxeqiN5Cgdgts=
|
||||
github.com/faiface/beep v1.0.2 h1:UB5DiRNmA4erfUYnHbgU4UB6DlBOrsdEFRtcc8sCkdQ=
|
||||
github.com/faiface/beep v1.0.2/go.mod h1:1yLb5yRdHMsovYYWVqYLioXkVuziCSITW1oarTeduQM=
|
||||
github.com/eduncan911/podcast v1.4.2 h1:S+fsUlbR2ULFou2Mc52G/MZI8JVJHedbxLQnoA+MY/w=
|
||||
github.com/eduncan911/podcast v1.4.2/go.mod h1:mSxiK1z5KeNO0YFaQ3ElJlUZbbDV9dA7R9c1coeeXkc=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
|
||||
github.com/gdamore/tcell v1.1.1/go.mod h1:K1udHkiR3cOtlpKG5tZPD5XxrF7v2y7lDq7Whcj+xkQ=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gocraft/health v0.0.0-20170925182251-8675af27fef0/go.mod h1:rWibcVfwbUxi/QXW84U7vNTcIcZFd6miwbt8ritxh/Y=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gopherjs/gopherwasm v0.1.1/go.mod h1:kx4n9a+MzHH0BJJhvlsQ65hqLFXDO/m256AsaDPQ+/4=
|
||||
github.com/gopherjs/gopherwasm v1.0.0/go.mod h1:SkZ8z7CWBz5VXbhJel8TxCmAcsQqzgWGR/8nMhyhZSI=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
|
||||
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/hajimehoshi/go-mp3 v0.1.1 h1:Y33fAdTma70fkrxnc9u50Uq0lV6eZ+bkAlssdMmCwUc=
|
||||
github.com/hajimehoshi/go-mp3 v0.1.1/go.mod h1:4i+c5pDNKDrxl1iu9iG90/+fhP37lio6gNhjCx9WBJw=
|
||||
github.com/hajimehoshi/oto v0.1.1/go.mod h1:hUiLWeBQnbDu4pZsAhOnGqMI1ZGibS6e2qhQdfpwz04=
|
||||
github.com/hajimehoshi/oto v0.3.1/go.mod h1:e9eTLBB9iZto045HLbzfHJIc+jP3xaKrjZTghvb6fdM=
|
||||
github.com/hashicorp/consul v1.4.0/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI=
|
||||
github.com/hashicorp/go-cleanhttp v0.0.0-20171218145408-d5fe4b57a186/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-rootcerts v0.0.0-20160503143440-6bb64b370b90/go.mod h1:o4zcYY1e0GEZI6eSEr+43QDYmuGglw1qSO6qdHUHCgg=
|
||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/hashicorp/serf v0.0.0-20180809141758-19bbd39e421b/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE=
|
||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
||||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/jfreymuth/oggvorbis v1.0.0/go.mod h1:abe6F9QRjuU9l+2jek3gj46lu40N4qlYxh2grqkLEDM=
|
||||
github.com/jfreymuth/vorbis v1.0.0/go.mod h1:8zy3lUAm9K/rJJk223RKy6vjCZTWC61NA2QD06bfOE0=
|
||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/lucasb-eyer/go-colorful v0.0.0-20181028223441-12d3b2882a08/go.mod h1:NXg0ArsFk0Y01623LgUqoqcouGDB+PwCCQlrwrG6xJ4=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
|
||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY=
|
||||
github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mewkiz/flac v1.0.5/go.mod h1:EHZNU32dMF6alpurYyKHDLYpW1lYpBZ5WrXi/VuNIGs=
|
||||
github.com/mikkyang/id3-go v0.0.0-20191012064224-2c6ab3bb1fbd h1:Cqivkwpk34qJJsi0xbZp2TOhpMsG381iaum8mb+6T/s=
|
||||
github.com/mikkyang/id3-go v0.0.0-20191012064224-2c6ab3bb1fbd/go.mod h1:6ReX25kzt2D67Dt9vH3kTm8R4luFEfW9W3RDuytp0IA=
|
||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20181001021442-5a380f224700/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/nareix/joy4 v0.0.0-20200507095837-05a4ffbb5369 h1:Yp0zFEufLz0H7jzffb4UPXijavlyqlYeOg7dcyVUNnQ=
|
||||
github.com/nareix/joy4 v0.0.0-20200507095837-05a4ffbb5369/go.mod h1:aFJ1ZwLjvHN4yEzE5Bkz8rD8/d8Vlj3UIuvz2yfET7I=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg=
|
||||
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
|
||||
github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
|
||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20181126161756-619930b0b471/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
|
||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
|
||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
|
||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg=
|
||||
github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
|
||||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.4 h1:S0tLZ3VOKl2Te0hpq8+ke0eSJPfCnNTPiDlsfwi1/NE=
|
||||
github.com/spf13/cobra v0.0.4/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||
github.com/spf13/cobra v0.0.7 h1:FfTH+vuMXOas8jmfb5/M7dzEYx7LpcLb7a0LPe34uOU=
|
||||
github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||
github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4=
|
||||
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M=
|
||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||
github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
|
||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/streadway/amqp v0.0.0-20181107104731-27835f1a64e9/go.mod h1:1WNBiOZtZQLpVAyu0iTduoJL9hEsMloAK5XWrtW0xdY=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
|
||||
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||
github.com/tcolgate/mp3 v0.0.0-20170426193717-e79c5a46d300 h1:XQdibLKagjdevRB6vAjVY4qbSr8rQ610YzTkWcxzxSI=
|
||||
github.com/tcolgate/mp3 v0.0.0-20170426193717-e79c5a46d300/go.mod h1:FNa/dfN95vAYCNFrIKRrlRo+MBLbwmR9Asa5f2ljmBI=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/exp v0.0.0-20180710024300-14dda7b62fcd/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mobile v0.0.0-20180806140643-507816974b79/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190516110030-61b9204099cb h1:k07iPOt0d6nEnwXF+kHB+iEg+WSuKe/SOQuFM2QoD+E=
|
||||
golang.org/x/sys v0.0.0-20190516110030-61b9204099cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0/go.mod h1:OdE7CF6DbADk7lN8LIKRzRJTTZXIjtWgA5THM5lhBAw=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
|
||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
projects.indigitaldev.net/iarenzana/ingolib v0.29.0/go.mod h1:AVhmup6pLBEqSMCE4bMnHEqtgIb47qyD87JK2j9oxMo=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
|
@ -0,0 +1,29 @@
|
||||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2017, Tom Thorogood
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
@ -0,0 +1,8 @@
|
||||
# id3v2
|
||||
|
||||
[](https://godoc.org/github.com/tmthrgd/id3v2)
|
||||
[](https://goreportcard.com/report/github.com/tmthrgd/id3v2)
|
||||
|
||||
A Golang package for reading ID3v2 tags. It implements
|
||||
[v2.4.0](http://id3.org/id3v2.4.0-structure) and
|
||||
[v2.3.0](http://id3.org/id3v2.3.0) of the specification.
|
@ -0,0 +1,213 @@
|
||||
// Code generated by `go run generate_ids.go`. DO NOT EDIT.
|
||||
|
||||
// Copyright 2017 Tom Thorogood. All rights reserved.
|
||||
// Use of this source code is governed by a Modified
|
||||
// BSD License that can be found in the LICENSE file.
|
||||
|
||||
package id3v2
|
||||
|
||||
// These are the standard frame ids as specified in the
|
||||
// v2.4.0 and v2.3.0 specifications.
|
||||
const (
|
||||
FrameAENC FrameID = 'A'<<24 | 'E'<<16 | 'N'<<8 | 'C' // Audio encryption
|
||||
FrameAPIC FrameID = 'A'<<24 | 'P'<<16 | 'I'<<8 | 'C' // Attached picture
|
||||
FrameASPI FrameID = 'A'<<24 | 'S'<<16 | 'P'<<8 | 'I' // Audio seek point index
|
||||
FrameCOMM FrameID = 'C'<<24 | 'O'<<16 | 'M'<<8 | 'M' // Comments
|
||||
FrameCOMR FrameID = 'C'<<24 | 'O'<<16 | 'M'<<8 | 'R' // Commercial frame
|
||||
FrameENCR FrameID = 'E'<<24 | 'N'<<16 | 'C'<<8 | 'R' // Encryption method registration
|
||||
FrameEQU2 FrameID = 'E'<<24 | 'Q'<<16 | 'U'<<8 | '2' // Equalisation (2)
|
||||
FrameETCO FrameID = 'E'<<24 | 'T'<<16 | 'C'<<8 | 'O' // Event timing codes
|
||||
FrameGEOB FrameID = 'G'<<24 | 'E'<<16 | 'O'<<8 | 'B' // General encapsulated object
|
||||
FrameGRID FrameID = 'G'<<24 | 'R'<<16 | 'I'<<8 | 'D' // Group identification registration
|
||||
FrameLINK FrameID = 'L'<<24 | 'I'<<16 | 'N'<<8 | 'K' // Linked information
|
||||
FrameMCDI FrameID = 'M'<<24 | 'C'<<16 | 'D'<<8 | 'I' // Music CD identifier
|
||||
FrameMLLT FrameID = 'M'<<24 | 'L'<<16 | 'L'<<8 | 'T' // MPEG location lookup table
|
||||
FrameOWNE FrameID = 'O'<<24 | 'W'<<16 | 'N'<<8 | 'E' // Ownership frame
|
||||
FramePRIV FrameID = 'P'<<24 | 'R'<<16 | 'I'<<8 | 'V' // Private frame
|
||||
FramePCNT FrameID = 'P'<<24 | 'C'<<16 | 'N'<<8 | 'T' // Play counter
|
||||
FramePOPM FrameID = 'P'<<24 | 'O'<<16 | 'P'<<8 | 'M' // Popularimeter
|
||||
FramePOSS FrameID = 'P'<<24 | 'O'<<16 | 'S'<<8 | 'S' // Position synchronisation frame
|
||||
FrameRBUF FrameID = 'R'<<24 | 'B'<<16 | 'U'<<8 | 'F' // Recommended buffer size
|
||||
FrameRVA2 FrameID = 'R'<<24 | 'V'<<16 | 'A'<<8 | '2' // Relative volume adjustment (2)
|
||||
FrameRVRB FrameID = 'R'<<24 | 'V'<<16 | 'R'<<8 | 'B' // Reverb
|
||||
FrameSEEK FrameID = 'S'<<24 | 'E'<<16 | 'E'<<8 | 'K' // Seek frame
|
||||
FrameSIGN FrameID = 'S'<<24 | 'I'<<16 | 'G'<<8 | 'N' // Signature frame
|
||||
FrameSYLT FrameID = 'S'<<24 | 'Y'<<16 | 'L'<<8 | 'T' // Synchronised lyric/text
|
||||
FrameSYTC FrameID = 'S'<<24 | 'Y'<<16 | 'T'<<8 | 'C' // Synchronised tempo codes
|
||||
FrameTALB FrameID = 'T'<<24 | 'A'<<16 | 'L'<<8 | 'B' // Album/Movie/Show title
|
||||
FrameTBPM FrameID = 'T'<<24 | 'B'<<16 | 'P'<<8 | 'M' // BPM (beats per minute)
|
||||
FrameTCOM FrameID = 'T'<<24 | 'C'<<16 | 'O'<<8 | 'M' // Composer
|
||||
FrameTCON FrameID = 'T'<<24 | 'C'<<16 | 'O'<<8 | 'N' // Content type
|
||||
FrameTCOP FrameID = 'T'<<24 | 'C'<<16 | 'O'<<8 | 'P' // Copyright message
|
||||
FrameTDEN FrameID = 'T'<<24 | 'D'<<16 | 'E'<<8 | 'N' // Encoding time
|
||||
FrameTDLY FrameID = 'T'<<24 | 'D'<<16 | 'L'<<8 | 'Y' // Playlist delay
|
||||
FrameTDOR FrameID = 'T'<<24 | 'D'<<16 | 'O'<<8 | 'R' // Original release time
|
||||
FrameTDRC FrameID = 'T'<<24 | 'D'<<16 | 'R'<<8 | 'C' // Recording time
|
||||
FrameTDRL FrameID = 'T'<<24 | 'D'<<16 | 'R'<<8 | 'L' // Release time
|
||||
FrameTDTG FrameID = 'T'<<24 | 'D'<<16 | 'T'<<8 | 'G' // Tagging time
|
||||
FrameTENC FrameID = 'T'<<24 | 'E'<<16 | 'N'<<8 | 'C' // Encoded by
|
||||
FrameTEXT FrameID = 'T'<<24 | 'E'<<16 | 'X'<<8 | 'T' // Lyricist/Text writer
|
||||
FrameTFLT FrameID = 'T'<<24 | 'F'<<16 | 'L'<<8 | 'T' // File type
|
||||
FrameTIPL FrameID = 'T'<<24 | 'I'<<16 | 'P'<<8 | 'L' // Involved people list
|
||||
FrameTIT1 FrameID = 'T'<<24 | 'I'<<16 | 'T'<<8 | '1' // Content group description
|
||||
FrameTIT2 FrameID = 'T'<<24 | 'I'<<16 | 'T'<<8 | '2' // Title/songname/content description
|
||||
FrameTIT3 FrameID = 'T'<<24 | 'I'<<16 | 'T'<<8 | '3' // Subtitle/Description refinement
|
||||
FrameTKEY FrameID = 'T'<<24 | 'K'<<16 | 'E'<<8 | 'Y' // Initial key
|
||||
FrameTLAN FrameID = 'T'<<24 | 'L'<<16 | 'A'<<8 | 'N' // Language(s)
|
||||
FrameTLEN FrameID = 'T'<<24 | 'L'<<16 | 'E'<<8 | 'N' // Length
|
||||
FrameTMCL FrameID = 'T'<<24 | 'M'<<16 | 'C'<<8 | 'L' // Musician credits list
|
||||
FrameTMED FrameID = 'T'<<24 | 'M'<<16 | 'E'<<8 | 'D' // Media type
|
||||
FrameTMOO FrameID = 'T'<<24 | 'M'<<16 | 'O'<<8 | 'O' // Mood
|
||||
FrameTOAL FrameID = 'T'<<24 | 'O'<<16 | 'A'<<8 | 'L' // Original album/movie/show title
|
||||
FrameTOFN FrameID = 'T'<<24 | 'O'<<16 | 'F'<<8 | 'N' // Original filename
|
||||
FrameTOLY FrameID = 'T'<<24 | 'O'<<16 | 'L'<<8 | 'Y' // Original lyricist(s)/text writer(s)
|
||||
FrameTOPE FrameID = 'T'<<24 | 'O'<<16 | 'P'<<8 | 'E' // Original artist(s)/performer(s)
|
||||
FrameTOWN FrameID = 'T'<<24 | 'O'<<16 | 'W'<<8 | 'N' // File owner/licensee
|
||||
FrameTPE1 FrameID = 'T'<<24 | 'P'<<16 | 'E'<<8 | '1' // Lead performer(s)/Soloist(s)
|
||||
FrameTPE2 FrameID = 'T'<<24 | 'P'<<16 | 'E'<<8 | '2' // Band/orchestra/accompaniment
|
||||
FrameTPE3 FrameID = 'T'<<24 | 'P'<<16 | 'E'<<8 | '3' // Conductor/performer refinement
|
||||
FrameTPE4 FrameID = 'T'<<24 | 'P'<<16 | 'E'<<8 | '4' // Interpreted, remixed, or otherwise modified by
|
||||
FrameTPOS FrameID = 'T'<<24 | 'P'<<16 | 'O'<<8 | 'S' // Part of a set
|
||||
FrameTPRO FrameID = 'T'<<24 | 'P'<<16 | 'R'<<8 | 'O' // Produced notice
|
||||
FrameTPUB FrameID = 'T'<<24 | 'P'<<16 | 'U'<<8 | 'B' // Publisher
|
||||
FrameTRCK FrameID = 'T'<<24 | 'R'<<16 | 'C'<<8 | 'K' // Track number/Position in set
|
||||
FrameTRSN FrameID = 'T'<<24 | 'R'<<16 | 'S'<<8 | 'N' // Internet radio station name
|
||||
FrameTRSO FrameID = 'T'<<24 | 'R'<<16 | 'S'<<8 | 'O' // Internet radio station owner
|
||||
FrameTSOA FrameID = 'T'<<24 | 'S'<<16 | 'O'<<8 | 'A' // Album sort order
|
||||
FrameTSOP FrameID = 'T'<<24 | 'S'<<16 | 'O'<<8 | 'P' // Performer sort order
|
||||
FrameTSOT FrameID = 'T'<<24 | 'S'<<16 | 'O'<<8 | 'T' // Title sort order
|
||||
FrameTSRC FrameID = 'T'<<24 | 'S'<<16 | 'R'<<8 | 'C' // ISRC (international standard recording code)
|
||||
FrameTSSE FrameID = 'T'<<24 | 'S'<<16 | 'S'<<8 | 'E' // Software/Hardware and settings used for encoding
|
||||
FrameTSST FrameID = 'T'<<24 | 'S'<<16 | 'S'<<8 | 'T' // Set subtitle
|
||||
FrameTXXX FrameID = 'T'<<24 | 'X'<<16 | 'X'<<8 | 'X' // User defined text information frame
|
||||
FrameUFID FrameID = 'U'<<24 | 'F'<<16 | 'I'<<8 | 'D' // Unique file identifier
|
||||
FrameUSER FrameID = 'U'<<24 | 'S'<<16 | 'E'<<8 | 'R' // Terms of use
|
||||
FrameUSLT FrameID = 'U'<<24 | 'S'<<16 | 'L'<<8 | 'T' // Unsynchronised lyric/text transcription
|
||||
FrameWCOM FrameID = 'W'<<24 | 'C'<<16 | 'O'<<8 | 'M' // Commercial information
|
||||
FrameWCOP FrameID = 'W'<<24 | 'C'<<16 | 'O'<<8 | 'P' // Copyright/Legal information
|
||||
FrameWOAF FrameID = 'W'<<24 | 'O'<<16 | 'A'<<8 | 'F' // Official audio file webpage
|
||||
FrameWOAR FrameID = 'W'<<24 | 'O'<<16 | 'A'<<8 | 'R' // Official artist/performer webpage
|
||||
FrameWOAS FrameID = 'W'<<24 | 'O'<<16 | 'A'<<8 | 'S' // Official audio source webpage
|
||||
FrameWORS FrameID = 'W'<<24 | 'O'<<16 | 'R'<<8 | 'S' // Official Internet radio station homepage
|
||||
FrameWPAY FrameID = 'W'<<24 | 'P'<<16 | 'A'<<8 | 'Y' // Payment
|
||||
FrameWPUB FrameID = 'W'<<24 | 'P'<<16 | 'U'<<8 | 'B' // Publishers official webpage
|
||||
FrameWXXX FrameID = 'W'<<24 | 'X'<<16 | 'X'<<8 | 'X' // User defined URL link frame
|
||||
FrameEQUA FrameID = 'E'<<24 | 'Q'<<16 | 'U'<<8 | 'A' // Equalization
|
||||
FrameIPLS FrameID = 'I'<<24 | 'P'<<16 | 'L'<<8 | 'S' // Involved people list
|
||||
FrameRVAD FrameID = 'R'<<24 | 'V'<<16 | 'A'<<8 | 'D' // Relative volume adjustment
|
||||
FrameTDAT FrameID = 'T'<<24 | 'D'<<16 | 'A'<<8 | 'T' // Date
|
||||
FrameTIME FrameID = 'T'<<24 | 'I'<<16 | 'M'<<8 | 'E' // Time
|
||||
FrameTORY FrameID = 'T'<<24 | 'O'<<16 | 'R'<<8 | 'Y' // Original release year
|
||||
FrameTRDA FrameID = 'T'<<24 | 'R'<<16 | 'D'<<8 | 'A' // Recording dates
|
||||
FrameTSIZ FrameID = 'T'<<24 | 'S'<<16 | 'I'<<8 | 'Z' // Size
|
||||
FrameTYER FrameID = 'T'<<24 | 'Y'<<16 | 'E'<<8 | 'R' // Year
|
||||
)
|
||||
|
||||
var _FrameID_map = map[FrameID]string{
|
||||
FrameAENC: "AENC: Audio encryption",
|
||||
FrameAPIC: "APIC: Attached picture",
|
||||
FrameASPI: "ASPI: Audio seek point index",
|
||||
FrameCOMM: "COMM: Comments",
|
||||
FrameCOMR: "COMR: Commercial frame",
|
||||
FrameENCR: "ENCR: Encryption method registration",
|
||||
FrameEQU2: "EQU2: Equalisation (2)",
|
||||
FrameETCO: "ETCO: Event timing codes",
|
||||
FrameGEOB: "GEOB: General encapsulated object",
|
||||
FrameGRID: "GRID: Group identification registration",
|
||||
FrameLINK: "LINK: Linked information",
|
||||
FrameMCDI: "MCDI: Music CD identifier",
|
||||
FrameMLLT: "MLLT: MPEG location lookup table",
|
||||
FrameOWNE: "OWNE: Ownership frame",
|
||||
FramePRIV: "PRIV: Private frame",
|
||||
FramePCNT: "PCNT: Play counter",
|
||||
FramePOPM: "POPM: Popularimeter",
|
||||
FramePOSS: "POSS: Position synchronisation frame",
|
||||
FrameRBUF: "RBUF: Recommended buffer size",
|
||||
FrameRVA2: "RVA2: Relative volume adjustment (2)",
|
||||
FrameRVRB: "RVRB: Reverb",
|
||||
FrameSEEK: "SEEK: Seek frame",
|
||||
FrameSIGN: "SIGN: Signature frame",
|
||||
FrameSYLT: "SYLT: Synchronised lyric/text",
|
||||
FrameSYTC: "SYTC: Synchronised tempo codes",
|
||||
FrameTALB: "TALB: Album/Movie/Show title",
|
||||
FrameTBPM: "TBPM: BPM (beats per minute)",
|
||||
FrameTCOM: "TCOM: Composer",
|
||||
FrameTCON: "TCON: Content type",
|
||||
FrameTCOP: "TCOP: Copyright message",
|
||||
FrameTDEN: "TDEN: Encoding time",
|
||||
FrameTDLY: "TDLY: Playlist delay",
|
||||
FrameTDOR: "TDOR: Original release time",
|
||||
FrameTDRC: "TDRC: Recording time",
|
||||
FrameTDRL: "TDRL: Release time",
|
||||
FrameTDTG: "TDTG: Tagging time",
|
||||
FrameTENC: "TENC: Encoded by",
|
||||
FrameTEXT: "TEXT: Lyricist/Text writer",
|
||||
FrameTFLT: "TFLT: File type",
|
||||
FrameTIPL: "TIPL: Involved people list",
|
||||
FrameTIT1: "TIT1: Content group description",
|
||||
FrameTIT2: "TIT2: Title/songname/content description",
|
||||
FrameTIT3: "TIT3: Subtitle/Description refinement",
|
||||
FrameTKEY: "TKEY: Initial key",
|
||||
FrameTLAN: "TLAN: Language(s)",
|
||||
FrameTLEN: "TLEN: Length",
|
||||
FrameTMCL: "TMCL: Musician credits list",
|
||||
FrameTMED: "TMED: Media type",
|
||||
FrameTMOO: "TMOO: Mood",
|
||||
FrameTOAL: "TOAL: Original album/movie/show title",
|
||||
FrameTOFN: "TOFN: Original filename",
|
||||
FrameTOLY: "TOLY: Original lyricist(s)/text writer(s)",
|
||||
FrameTOPE: "TOPE: Original artist(s)/performer(s)",
|
||||
FrameTOWN: "TOWN: File owner/licensee",
|
||||
FrameTPE1: "TPE1: Lead performer(s)/Soloist(s)",
|
||||
FrameTPE2: "TPE2: Band/orchestra/accompaniment",
|
||||
FrameTPE3: "TPE3: Conductor/performer refinement",
|
||||
FrameTPE4: "TPE4: Interpreted, remixed, or otherwise modified by",
|
||||
FrameTPOS: "TPOS: Part of a set",
|
||||
FrameTPRO: "TPRO: Produced notice",
|
||||
FrameTPUB: "TPUB: Publisher",
|
||||
FrameTRCK: "TRCK: Track number/Position in set",
|
||||
FrameTRSN: "TRSN: Internet radio station name",
|
||||
FrameTRSO: "TRSO: Internet radio station owner",
|
||||
FrameTSOA: "TSOA: Album sort order",
|
||||
FrameTSOP: "TSOP: Performer sort order",
|
||||
FrameTSOT: "TSOT: Title sort order",
|
||||
FrameTSRC: "TSRC: ISRC (international standard recording code)",
|
||||
FrameTSSE: "TSSE: Software/Hardware and settings used for encoding",
|
||||
FrameTSST: "TSST: Set subtitle",
|
||||
FrameTXXX: "TXXX: User defined text information frame",
|
||||
FrameUFID: "UFID: Unique file identifier",
|
||||
FrameUSER: "USER: Terms of use",
|
||||
FrameUSLT: "USLT: Unsynchronised lyric/text transcription",
|
||||
FrameWCOM: "WCOM: Commercial information",
|
||||
FrameWCOP: "WCOP: Copyright/Legal information",
|
||||
FrameWOAF: "WOAF: Official audio file webpage",
|
||||
FrameWOAR: "WOAR: Official artist/performer webpage",
|
||||
FrameWOAS: "WOAS: Official audio source webpage",
|
||||
FrameWORS: "WORS: Official Internet radio station homepage",
|
||||
FrameWPAY: "WPAY: Payment",
|
||||
FrameWPUB: "WPUB: Publishers official webpage",
|
||||
FrameWXXX: "WXXX: User defined URL link frame",
|
||||
FrameEQUA: "EQUA: Equalization",
|
||||
FrameIPLS: "IPLS: Involved people list",
|
||||
FrameRVAD: "RVAD: Relative volume adjustment",
|
||||
FrameTDAT: "TDAT: Date",
|
||||
FrameTIME: "TIME: Time",
|
||||
FrameTORY: "TORY: Original release year",
|
||||
FrameTRDA: "TRDA: Recording dates",
|
||||
FrameTSIZ: "TSIZ: Size",
|
||||
FrameTYER: "TYER: Year",
|
||||
}
|
||||
|
||||
func (id FrameID) String() string {
|
||||
if str, ok := _FrameID_map[id]; ok {
|
||||
return str
|
||||
}
|
||||
|
||||
buf := [4]byte{
|
||||
byte(id >> 24),
|
||||
byte(id >> 16),
|
||||
byte(id >> 8),
|
||||
byte(id),
|
||||
}
|
||||
return "FrameID(\"" + string(buf[:]) + "\")"
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
module github.com/tmthrgd/id3v2
|
||||
|
||||
go 1.13
|
||||
|
||||
require golang.org/x/text v0.3.2
|
@ -0,0 +1,3 @@
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
@ -0,0 +1,501 @@
|
||||
// Copyright 2017 Tom Thorogood. All rights reserved.
|
||||
// Use of this source code is governed by a Modified
|
||||
// BSD License that can be found in the LICENSE file.
|
||||
|
||||
// Package id3v2 implements support for reading ID3v2 tags.
|
||||
package id3v2
|
||||
|
||||
//go:generate go run generate_ids.go
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/text/encoding"
|
||||
"golang.org/x/text/encoding/charmap"
|
||||
"golang.org/x/text/encoding/unicode"
|
||||
"golang.org/x/text/transform"
|
||||
"golang.org/x/text/unicode/norm"
|
||||
)
|
||||
|
||||
// This is an implementation of v2.4.0 of the ID3v2 tagging format,
|
||||
// defined in: http://id3.org/id3v2.4.0-structure, and v2.3.0 of
|
||||
// the ID3v2 tagging format, defined in: http://id3.org/id3v2.3.0.
|
||||
|
||||
// Version is the version of the ID3v2 tag block.
|
||||
type Version byte
|
||||
|
||||
const (
|
||||
// Version24 is v2.4.x of the ID3v2 specification.
|
||||
Version24 Version = 0x04
|
||||
// Version23 is v2.3.x of the ID3v2 specification.
|
||||
Version23 Version = 0x03
|
||||
)
|
||||
|
||||
const (
|
||||
tagFlagUnsynchronisation = 1 << (7 - iota)
|
||||
tagFlagExtendedHeader
|
||||
tagFlagExperimental
|
||||
tagFlagFooter
|
||||
|
||||
knownTagFlags = tagFlagUnsynchronisation | tagFlagExtendedHeader |
|
||||
tagFlagExperimental | tagFlagFooter
|
||||
)
|
||||
|
||||
// FrameFlags are the frame-level ID3v2 flags.
|
||||
type FrameFlags uint16
|
||||
|
||||
// These are the frame-level flags from v2.4.0 of the specification.
|
||||
const (
|
||||
_ FrameFlags = 1 << (15 - iota)
|
||||
FrameFlagV24TagAlterPreservation
|
||||
FrameFlagV24FileAlterPreservation
|
||||
FrameFlagV24ReadOnly
|
||||
_
|
||||
_
|
||||
_
|
||||
_
|
||||
_
|
||||
FrameFlagV24GroupingIdentity
|
||||
_
|
||||
_
|
||||
FrameFlagV24Compression
|
||||
FrameFlagV24Encryption
|
||||
FrameFlagV24Unsynchronisation
|
||||
FrameFlagV24DataLengthIndicator
|
||||
)
|
||||
|
||||
// These are the frame-level flags from v2.3.0 of the specification.
|
||||
const (
|
||||
FrameFlagV23TagAlterPreservation FrameFlags = 1 << (15 - iota)
|
||||
FrameFlagV23FileAlterPreservation
|
||||
FrameFlagV23ReadOnly
|
||||
_
|
||||
_
|
||||
_
|
||||
_
|
||||
_
|
||||
FrameFlagV23Compression
|
||||
FrameFlagV23Encryption
|
||||
FrameFlagV23GroupingIdentity
|
||||
)
|
||||
|
||||
const encodingFrameFlags FrameFlags = 0x00ff
|
||||
|
||||
const (
|
||||
textEncodingISO88591 = 0x00
|
||||
textEncodingUTF16 = 0x01
|
||||
textEncodingUTF16BE = 0x02
|
||||
textEncodingUTF8 = 0x03
|
||||
)
|
||||
|
||||
// FrameID is a four-byte frame identifier.
|
||||
type FrameID uint32
|
||||
|
||||
const syncsafeInvalid = ^uint32(0)
|
||||
|
||||
func syncsafe(data []byte) uint32 {
|
||||
_ = data[3]
|
||||
|
||||
if data[0]&0x80 != 0 || data[1]&0x80 != 0 ||
|
||||
data[2]&0x80 != 0 || data[3]&0x80 != 0 {
|
||||
return syncsafeInvalid
|
||||
}
|
||||
|
||||
return uint32(data[0])<<21 | uint32(data[1])<<14 |
|
||||
uint32(data[2])<<7 | uint32(data[3])
|
||||
}
|
||||
|
||||
var id3Token = []byte("ID3")
|
||||
|
||||
func id3Split(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||||
i := bytes.Index(data, id3Token)
|
||||
if i == -1 {
|
||||
if len(data) < 2 {
|
||||
return 0, nil, nil
|
||||
}
|
||||
|
||||
return len(data) - 2, nil, nil
|
||||
}
|
||||
|
||||
data = data[i:]
|
||||
if len(data) < 10 {
|
||||
if atEOF {
|
||||
return 0, nil, io.ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
return i, nil, nil
|
||||
}
|
||||
|
||||
size := syncsafe(data[6:])
|
||||
|
||||
if data[3] == 0xff || data[4] == 0xff || size == syncsafeInvalid {
|
||||
// Skipping when we find the string "ID3" in the file but
|
||||
// the remaining header is invalid is consistent with the
|
||||
// detection logic in §3.1. This also reduces the
|
||||
// likelihood of errors being caused by the byte sequence
|
||||
// "ID3" (49 44 33) occurring in the audio, but does not
|
||||
// eliminate the possibility of errors in this case.
|
||||
//
|
||||
// Quoting from §3.1 of id3v2.4.0-structure.txt:
|
||||
// An ID3v2 tag can be detected with the following pattern:
|
||||
// $49 44 33 yy yy xx zz zz zz zz
|
||||
// Where yy is less than $FF, xx is the 'flags' byte and zz
|
||||
// is less than $80.
|
||||
return i + 3, nil, nil
|
||||
}
|
||||
|
||||
if Version(data[3]) > Version24 {
|
||||
// Quoting from §3.1 of id3v2.4.0-structure.txt:
|
||||
// If software with ID3v2.4.0 and below support should
|
||||
// encounter version five or higher it should simply
|
||||
// ignore the whole tag.
|
||||
return i + 3, nil, nil
|
||||
}
|
||||
|
||||
if Version(data[3]) < Version23 {
|
||||
// This package only supports v2.3.0 and v2.4.0, skip
|
||||
// versions bellow v2.3.0.
|
||||
return i + 3, nil, nil
|
||||
}
|
||||
|
||||
if data[5]&^knownTagFlags != 0 {
|
||||
// Skip tag blocks that contain unknown flags.
|
||||
//
|
||||
// Quoting from §3.1 of id3v2.4.0-structure.txt:
|
||||
// If one of these undefined flags are set, the tag might
|
||||
// not be readable for a parser that does not know the
|
||||
// flags function.
|
||||
return i + 3, nil, nil
|
||||
}
|
||||
|
||||
if data[5]&tagFlagFooter == tagFlagFooter {
|
||||
size += 10
|
||||
}
|
||||
|
||||
if len(data) < 10+int(size) {
|
||||
if atEOF {
|
||||
return 0, nil, io.ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
return i, nil, nil
|
||||
}
|
||||
|
||||
return i + 10 + int(size), data[:10+size], nil
|
||||
}
|
||||
|
||||
const invalidFrameID = ^FrameID(0)
|
||||
|
||||
func validIDByte(b byte) bool {
|
||||
return b >= 'A' && b <= 'Z' || b >= '0' && b <= '9'
|
||||
}
|
||||
|
||||
func frameID(data []byte) FrameID {
|
||||
_ = data[3]
|
||||
|
||||
if validIDByte(data[0]) && validIDByte(data[1]) && validIDByte(data[2]) &&
|
||||
// Although it violates the specification, some software
|
||||
// incorrectly encodes v2.2.0 three character tags as
|
||||
// four character v2.3.0 tags with a trailing zero byte
|
||||
// when upgrading the tagging format version.
|
||||
(validIDByte(data[3]) || data[3] == 0) {
|
||||
return FrameID(binary.BigEndian.Uint32(data))
|
||||
}
|
||||
|
||||
if data[0] == 0 && data[1] == 0 && data[2] == 0 && data[3] == 0 {
|
||||
// This is probably the beginning of padding.
|
||||
return 0
|
||||
}
|
||||
|
||||
return invalidFrameID
|
||||
}
|
||||
|
||||
var bufPool = &sync.Pool{
|
||||
New: func() interface{} {
|
||||
buf := make([]byte, 4<<10)
|
||||
return &buf
|
||||
},
|
||||
}
|
||||
|
||||
// Scan reads all valid ID3v2 tags from the reader and
|
||||
// returns all the frames in order. It returns an error
|
||||
// if the tags are invalid.
|
||||
func Scan(r io.Reader) (Frames, error) {
|
||||
buf := bufPool.Get().(*[]byte)
|
||||
defer bufPool.Put(buf)
|
||||
|
||||
s := bufio.NewScanner(r)
|
||||
s.Buffer(*buf, 20+1<<28)
|
||||
s.Split(id3Split)
|
||||
|
||||
var frames Frames
|
||||
|
||||
for s.Scan() {
|
||||
data := s.Bytes()
|
||||
|
||||
header := data[:10]
|
||||
data = data[10:]
|
||||
|
||||
if string(header[:3]) != "ID3" {
|
||||
panic("id3: bufio.Scanner failed")
|
||||
}
|
||||
|
||||
version := Version(header[3])
|
||||
switch version {
|
||||
case Version24, Version23:
|
||||
default:
|
||||
panic("id3: bufio.Scanner failed")
|
||||
}
|
||||
|
||||
flags := header[5]
|
||||
|
||||
if flags&tagFlagFooter == tagFlagFooter {
|
||||
footer := data[len(data)-10:]
|
||||
data = data[:len(data)-10]
|
||||
|
||||
if string(footer[:3]) != "3DI" ||
|
||||
!bytes.Equal(header[3:], footer[3:]) {
|
||||
return nil, errors.New("id3: invalid footer")
|
||||
}
|
||||
}
|
||||
|
||||
if flags&tagFlagExtendedHeader == tagFlagExtendedHeader {
|
||||
var size uint32
|
||||
switch version {
|
||||
case Version24:
|
||||
size = syncsafe(data)
|
||||
if size == syncsafeInvalid {
|
||||
return nil, errors.New("id3: invalid extended header size")
|
||||
}
|
||||
case Version23:
|
||||
size = binary.BigEndian.Uint32(data) + 4
|
||||
default:
|
||||
panic("unhandled version")
|
||||
}
|
||||
|
||||
if len(data) < int(size) {
|
||||
return nil, errors.New("id3: invalid extended header size")
|
||||
}
|
||||
|
||||
extendedHeader := data[:size]
|
||||
data = data[size:]
|
||||
|
||||
_ = extendedHeader
|
||||
}
|
||||
|
||||
frames:
|
||||
for len(data) > 10 {
|
||||
_ = data[9]
|
||||
|
||||
frame := &Frame{
|
||||
ID: frameID(data),
|
||||
Version: version,
|
||||
Flags: FrameFlags(binary.BigEndian.Uint16(data[8:])),
|
||||
}
|
||||
|
||||
switch frame.ID {
|
||||
case 0:
|
||||
// We've probably hit padding, the padding
|
||||
// validity check below will handle this.
|
||||
break frames
|
||||
case invalidFrameID:
|
||||
return nil, errors.New("id3: invalid frame id")
|
||||
}
|
||||
|
||||
var size uint32
|
||||
switch version {
|
||||
case Version24:
|
||||
size = syncsafe(data[4:])
|
||||
if size == syncsafeInvalid {
|
||||
return nil, errors.New("id3: invalid frame size")
|
||||
}
|
||||
case Version23:
|
||||
size = binary.BigEndian.Uint32(data[4:])
|
||||
default:
|
||||
panic("unhandled version")
|
||||
}
|
||||
|
||||
if len(data) < 10+int(size) {
|
||||
return nil, errors.New("id3: frame size exceeds length of tag data")
|
||||
}
|
||||
|
||||
if flags&tagFlagUnsynchronisation == tagFlagUnsynchronisation ||
|
||||
version == Version24 && frame.Flags&FrameFlagV24Unsynchronisation != 0 {
|
||||
frame.Data = make([]byte, 0, size)
|
||||
|
||||
for i := uint32(0); i < size; i++ {
|
||||
v := data[10+i]
|
||||
frame.Data = append(frame.Data, v)
|
||||
|
||||
if v == 0xff && i+1 < size && data[10+i+1] == 0x00 {
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
if version == Version24 {
|
||||
// Clear the frame level unsynchronisation flag
|
||||
frame.Flags &^= FrameFlagV24Unsynchronisation
|
||||
}
|
||||
} else {
|
||||
frame.Data = append([]byte(nil), data[10:10+size]...)
|
||||
}
|
||||
|
||||
frames = append(frames, frame)
|
||||
data = data[10+size:]
|
||||
}
|
||||
|
||||
if flags&tagFlagFooter == tagFlagFooter && len(data) != 0 {
|
||||
return nil, errors.New("id3: padding with footer")
|
||||
}
|
||||
|
||||
for _, v := range data {
|
||||
if v != 0 {
|
||||
return nil, errors.New("id3: invalid padding")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if s.Err() != nil {
|
||||
return nil, s.Err()
|
||||
}
|
||||
|
||||
return frames, nil
|
||||
}
|
||||
|
||||
// ScanFile reads all valid ID3v2 tags from a file and
|
||||
// returns all the frames in order. It returns an error
|
||||
// if the tags are invalid, or the file cannot be opened.
|
||||
func ScanFile(path string) (Frames, error) {
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
return Scan(f)
|
||||
}
|
||||
|
||||
// Frames is a slice of ID3v2 frames.
|
||||
type Frames []*Frame
|
||||
|
||||
// Lookup returns the last frame with the given frame
|
||||
// id, or nil.
|
||||
func (f Frames) Lookup(id FrameID) *Frame {
|
||||
for i := len(f) - 1; i >= 0; i-- {
|
||||
if f[i].ID == id {
|
||||
return f[i]
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Frame is a single ID3v2 frame.
|
||||
type Frame struct {
|
||||
ID FrameID
|
||||
Version Version
|
||||
Flags FrameFlags
|
||||
Data []byte
|
||||
}
|
||||
|
||||
func (f *Frame) String() string {
|
||||
version := "?"
|
||||
switch f.Version {
|
||||
case Version24:
|
||||
version = "v2.4"
|
||||
case Version23:
|
||||
version = "v2.3"
|
||||
}
|
||||
|
||||
data, terminus := f.Data, ""
|
||||
if len(data) > 128 {
|
||||
data, terminus = data[:128], "..."
|
||||
}
|
||||
|
||||
return fmt.Sprintf("&Frame{ID: %s, Version: %s, Flags: 0x%04x, Data: %d:%q%s}",
|
||||
f.ID.String(), version, f.Flags, len(f.Data), data, terminus)
|
||||
}
|
||||
|
||||
var (
|
||||
zeroBytes = []byte{0x00, 0x00}
|
||||
zeroByte = zeroBytes[:1]
|
||||
)
|
||||
|
||||
// Text interprets the frame data as a text string,
|
||||
// according to §4 of id3v2.4.0-structure.txt.
|
||||
func (f *Frame) Text() (string, error) {
|
||||
if len(f.Data) == 0 {
|
||||
return "", errors.New("id3: frame data is invalid")
|
||||
}
|
||||
|
||||
if f.Flags&encodingFrameFlags != 0 {
|
||||
return "", errors.New("id3: encoding frame flags are not supported")
|
||||
}
|
||||
|
||||
data := f.Data[1:]
|
||||
var enc encoding.Encoding
|
||||
switch f.Data[0] {
|
||||
case textEncodingISO88591:
|
||||
data = bytes.TrimSuffix(data, zeroByte)
|
||||
enc = charmap.ISO8859_1
|
||||
case textEncodingUTF16:
|
||||
data = bytes.TrimSuffix(data, zeroBytes)
|
||||
enc = unicode.UTF16(unicode.BigEndian, unicode.ExpectBOM)
|
||||
case textEncodingUTF16BE:
|
||||
data = bytes.TrimSuffix(data, zeroBytes)
|
||||
enc = unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)
|
||||
case textEncodingUTF8:
|
||||
data = bytes.TrimSuffix(data, zeroByte)
|
||||
return string(data), nil
|
||||
default:
|
||||
return "", errors.New("id3: frame uses unsupported encoding")
|
||||
}
|
||||
|
||||
if f.ID == FrameCOMM {
|
||||
data = f.Data[4:]
|
||||
data = bytes.TrimSuffix(data, zeroByte)
|
||||
enc = unicode.UTF16(unicode.BigEndian, unicode.ExpectBOM)
|
||||
data, err := enc.NewDecoder().Bytes(data)
|
||||
if err != nil {
|
||||