Tengo .memo
archivos en mi PC desde la aplicación de notas por defecto en un teléfono Samsung de propiedad anterior. Cuando se abren en el Bloc de notas, los archivos no contienen texto plano. ¿Cómo puedo recuperar el contenido de las notas?
Respuestas
¿Demasiados anuncios?Escribí mi propio convertidor "memo2txt" en Python. Aquí está el script (primero tendrás que instalar las librerías de Python usando pip ):
import os
import re
import glob
import zipfile
import xmltodict
from datetime import datetime
MEMO_PATH = r'i:\MY\PROGRAMMING\AndroidMemoExtracter\MemoFiles'
RESULTS_PATH = r'i:\MY\PROGRAMMING\AndroidMemoExtracter\Results'
memos = glob.glob(MEMO_PATH + '\*.memo')
for i, memo in enumerate(memos):
print('{}/{} - {}'.format(i+1, len(memos), memo))
try:
# Extract *.memo file and read the content
archive = zipfile.ZipFile(memo, 'r')
memo_content = archive.read('memo_content.xml').decode('utf-8')
cleanr = re.compile('&.*?;')
memo_content = re.sub(cleanr, '', memo_content)
memo_content = xmltodict.parse(memo_content)
text = memo_content['memo']['contents']['content']
# Generate filename from memo timestamp
timestamp = int(memo_content['memo']['header']['meta'][2]['@createdTime'][:10])
date = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H-%M-%S')
file_name = '{}.txt'.format(date)
# Save file as a *.txt
with open(os.path.join(RESULTS_PATH, file_name), 'w', encoding='utf-8') as file:
file.write(text)
except zipfile.BadZipFile:
continue
Utilizando el reproductor VLC o descargando Samsung Note para PC como se ha mencionado aquí
Métodos relacionados mencionados aquí para la exportación - ver Respuesta de Husni a la solución del archivo zip y otros
inspirado por beeshyams, aquí está mi versión ...
en mi Samsung J3, los memos están en una unidad MTP en algún lugar como ...
SAMSUNG Android/Phone/ShareMemo/*.memo
el xml de origen se parece a esto:
<?xml version="1.0" encoding="UTF-8"?>
<memo Version="1.0">
<header>
<meta title="==PROGRAMMING=="/>
<meta favourite="false"/>
<meta uuid="85f94ab2-77a8-XXXXXXXXXXXXXXX"/>
<meta createdTime="1551038092051"/>
</header>
<contents>
<content><p value="memo2" >=====</p><p>https://medium.freecodecamp.org/</p><p>=====</p>
</content>
</contents>
</memo>
Ejecuto esta transformación xslt sobre ella...
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="s1">
<!-- https://float-middle.com/how-to-put-cdata-into-script-tag-in-xslt/ -->
<![CDATA[
//https://stackoverflow.com/questions/847185/convert-a-unix-timestamp-to-time-in-javascript
//https://stackoverflow.com/questions/5292372/how-to-pass-parameters-to-a-script-tag
var ts = document.currentScript.getAttribute('timestamp')
document.write(""+ts+": "+Date(ts).toLocaleString());
]]>
</xsl:variable>
<xsl:template match="/">
<html lang="en_UK">
<head>
<style>
body {background-color: powderblue;}
#title {color: red; font-size: 300%;}
.content {color: green;}
</style>
<meta charset="UTF-8"/>
<title>
<xsl:apply-templates select="memo/header/meta[@title]"/>
</title>
</head>
<body>
<span id='title'>
<xsl:apply-templates select="memo/header/meta[@title]"/>
</span>
<xsl:text disable-output-escaping="yes">
<![CDATA[ — ]]>
</xsl:text>
<span id='created'>
<xsl:apply-templates select="memo/header/meta[@createdTime]"/>
</span>
<div class='content'>
<xsl:apply-templates select="memo/contents"/>
</div>
</body>
</html>
</xsl:template>
<!-- ============================================ -->
<xsl:template match="memo/header/meta[@title]">
<xsl:apply-templates select="@title"/>
</xsl:template>
<xsl:template match="@title">
<xsl:value-of select="."/>
<xsl:if test="string-length(.)=0">...</xsl:if>
</xsl:template>
<!-- ============================================ -->
<xsl:template match="memo/header/meta[@createdTime]">
<script type="text/javascript">
<xsl:attribute name="timestamp">
<xsl:value-of select="@createdTime" />
</xsl:attribute>
<!-- https://float-middle.com/how-to-put-cdata-into-script-tag-in-xslt/ -->
<xsl:text disable-output-escaping="yes">
/* <![CDATA[ */
</xsl:text>
<xsl:value-of select="$s1" disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes">
/* ]]> */
</xsl:text>
</script>
</xsl:template>
<xsl:template match="@createdTime">
<xsl:value-of select="."/>
</xsl:template>
<!-- ============================================ -->
<xsl:template match="memo/contents">
<xsl:value-of select="content" disable-output-escaping="yes"/>
<xsl:if test="string-length(content)=0">...</xsl:if>
</xsl:template>
</xsl:stylesheet>
utilizando lxml de python..
import os
import glob
import zipfile
from lxml import etree
import sys
if len(sys.argv) < 3:
print('python3 convert_memos.py <memo-dir> <html-dir>')
sys.exit()
MEMO_PATH = os.path.join(sys.argv[1], '')
HTML_PATH = os.path.join(sys.argv[2], '')
xslt_src = '''[see xml above]'''
memos = glob.glob(MEMO_PATH + '*.memo')
for i, memo in enumerate(memos):
try:
archive = zipfile.ZipFile(memo, 'r')
src = archive.read('memo_content.xml').decode('utf-8')
xslt = etree.XML(xslt_src)
xml = etree.XML(str.encode(src))
transform = etree.XSLT(xslt)
result = transform(xml)
root = result.getroot()
html = etree.tostring(root, pretty_print=True).decode('utf-8')
filename = '{}.html'.format(os.path.basename(memo))
filename = os.path.join(HTML_PATH, filename)
with open(filename, 'w', encoding='utf-8') as file:
file.write('<!DOCTYPE html>')
file.write(html)
except Exception as e:
print(e)
sale algo así como..
<!DOCTYPE html>
<html lang="en_UK">
<head>
<style>
body {background-color: powderblue;}
#title {color: red; font-size: 300%;}
.content {color: green;}
</style>
<meta charset="UTF-8"/>
<title>==PROGRAMMING==</title>
</head>
<body>
<span id="title">
==PROGRAMMING==
</span>
—
<span id="created">
<script type="text/javascript" timestamp="1551038092051">
/* <![CDATA[ */
var ts = document.currentScript.getAttribute('timestamp')
document.write(""+ts+": "+Date(ts).toLocaleString());
/* ]]> */
</script>
</span>
<div class="content">
<p value="memo2" >=====</p>
<p>https://medium.freecodecamp.org/</p>
<p>=====</p>
</div>
</body>
</html>
Estoy bifurcando la versión de @Alderven para importar los archivos multimedia, y convertir los emojis a caracteres UTF-8 adecuados. De esta manera son fáciles de importar a Notable (en el escritorio de Linux) y sincronizar de nuevo a Markor (en Android). He publicado esto en mi Github https://github.com/morciej/memo2html -- no dude en utilizarlo.