Am fișiere .memo
pe computerul meu din aplicația de memorie implicită pe un telefon Samsung deținut anterior. Când sunt deschise în Notepad, fișierele nu conțin text simplu. Cum pot recupera conținutul notelor?
Răspunde
Utilizând playerul VLC sau descărcând Samsung Note pentru PC așa cum s-a menționat aici
Metode corelate menționate aici pentru export – consultați Răspunsul lui Husni din fișierul zip soluție și altele
Răspuns
Am scris propriul meu convertor „memo2txt” în Python. Iată scriptul (mai întâi va trebui să instalați libs Python folosind 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
Răspuns
inspirat de beeshyams, aici este versiunea mea …
pe Samsung J3, memo-urile sunt într-o unitate MTP undeva ca …
SAMSUNG Android/Phone/ShareMemo/*.memo
xml-ul sursă arată cam așa:
<?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>
Execut această transformare xslt peste ea …
<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> <xsl:apply-templates select="memo/header/meta[@title]"/> </span> <xsl:text disable-output-escaping="yes"> <![CDATA[ — ]]> </xsl:text> <span> <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>
folosind lxml din 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)
generează ceva de genul …
<!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> ==PROGRAMMING== </span> — <span> <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>