LINUX TIP & TRICK

บันทึกช่วยจำประสบการณ์และเรื่องราวต่างๆ ในการใช้งานลินุกส์เดสก์ทอป ...

วันเสาร์, พฤษภาคม 12, 2007

แก้ปัญหาภาษาไทยของ ID3 Tag (Part II)


ภาคแรก เคยกล่าวถึงการแก้ปัญหาเกี่ยวกับ ID3Tag ด้วยโปรแกรม EasyTAG ซึ่งก็จะพอจะบรรเทาปัญหาดังกล่าวได้บ้าง แต่ยังถือว่ายังไม่สมบูรณ์ เนื่องจากบางตำแหน่งของ Tag ยังแปลงรหัสภาษาได้ไม่ครบถ้วน ส่วนตัวยังไม่ค่อยพอใจ เพียงแต่แก้ขัดไปก่อนชั่วคราว ...

ภาคสอง เป็นบล็อกที่เขียนแล้วเกิดความละอายใจมาก เพราะดูแล้วอาจเป็นการส่งเสริมการใช้งานแบบผิดกฏหมาย (แผ่นเพลง mp3) ที่ปัจจุบันหาง่ายกว่าร้านขายยา แผ่นซีดีหนึ่งแผ่นสามารถบรรจุเพลงได้มากถึง 180 เพลงขึ้นไป ซึ่งปกติวิธีการแปลงเพลงจาก audio เป็นเพลงรูปแบบ mp3 จะใช้โปรแกรมแปลงบนวินโดว์จัดทำขึ้น ทำให้การบรรจุค่าต่างๆ Tag จะเป็นรหัสภาษา cp874 โดยปริยาย ซึ่งถือได้รหัสตัวนี้ว่าเป็นคู่แฝดกับ tis620 ที่ผู้ใช้งานบนลินุกส์นิยมใช้กัน หากย้อนไปก่อนหน้านี้สองปีก่อนผู้ใช้งานลินุกส์ก็ยังใช้งาน mp3 อย่างเป็นสุขใจยิ่ง ไม่มีผลกระทบสักเท่าไหร่ใดนัก ...

จนกระทั่งสักปีที่ผ่านมา วงการคอมพิวเตอร์ได้มีการหยิบยกรหัสภาษา Unicode มาใช้เป็นรหัสมาตราฐานอย่างเข้มข้นขึ้น บรรดาซอฟท์แวร์ต่างๆ ก็เริ่มจะอิงมาตราฐานดังกล่าวขึ้นเรื่อยๆ ไม่เว้นแม้แต่โปรแกรมประเภท Media Player เดิมตัวเองชอบฟังเพลง mp3 ด้วยโปรแกรม AmaroK ซึ่งระยะแรกๆโปรแกรมสามารถกำหนดรหัสภาษาต่างๆได้อิสระด้วยผู้ใช้งาน จนกระทั่วเวอร์ชั่น 1.4 เป็นต้นมา ฟังค์ชั่นกำหนดรหัสภาษาแสดงผล ถูกตัดทิ้งไป โดยบังคับให้ใช้งานด้วยรหัสภาษา Unicode ไปในตัว นอกจากตัว AmaroK แล้วโปรแกรมมีเดียเพลย์เยอร์อื่นๆที่นิยมใช้กัน ก็ประสบปัญหาเดียวกัน เช่น Rhythmbox , Banshee แต่ก็ยังมี XMMS ที่ยังคงความสามารถในการแสดงรหัสภาษาแบบ tis620 ได้อยู่ แต่ตัวเองก็ถือว่าโปรแกรม XMMS เป็นโปรแกรมที่ทรงคุณค่าควรจะเทิดทูนเก็บไว้บนหิ้ง เพราะโปรแกรมขาดการพัฒนาอย่างต่อเนื่อง ทำให้ขาดฟังค์ชั่นใหม่ๆที่นิยมใช้กัน (บอกว่า"เชย"ก็เกรงใจ) ...

บล็อกภาคนี้ถูกหยิบยกขึ้นมาเนื่องจากไปเจอวิธีการแก้ปัญหา ID3 Tag ได้อย่างสมบูรณ์แบบจาก ไทยลินุกส์คาเฟ่ เริ่มต้นจาก อ.Phong_TH(ผู้สร้างกระแส PCLinuxOS) แนะนำฟังค์ชั่นแก้ไขที่ตรงจุดมากที่สุด และอาจารย์วิทยา(wd) ได้มาต่อยอดสร้างเชลล์สคริปครอบฟังค์ชั่น เพื่อเสริมให้การทำงานสมบูรณ์แบบมากขึ้น ตัวเองได้คัดลอกวิธีการดังกล่าวมาไว้ที่บล็อกนี้เพื่อเป็นการสำรองบทความซึ่งกันและกันด้วยนิ ...

วิธีการจัดทำ ได้นำฟังค์ชั่นแปลงค่า MP3Unicode จาก เว็บนี้ ส่วนซอร์สโค๊ด ที่นี่ ทำการแตกแฟ้มดังกล่าว ซึ่งจะได้โฟลเดอร์ที่ชื่อว่า mp3unicode-1.0.1 ให้เข้าไปในโฟลเดอร์ดังกล่าว ค้นหาแฟ้มที่ชื่อว่า mp3unicode.cpp ใช้อิดิเตอร์แก้ไขค่าดังตัวอย่าง (แทรกกลุ่มข้อความที่มีสีแดง) แล้วจัดเก็บแฟ้ม
....
....
int main(int argc, char **argv) { cmdParser parser("mp3unicode", "1.0.1"); QStringList bit8encodings;
bit8encodings.append("cp1251");

bit8encodings.append("koi8-r");
bit8encodings.append("cp874");

....

....
หาข้อความกลุ่มนี้จากแฟ้ม Makefile (กรณีนี้ใช้กับลินุกส์เบสออน Ubuntu)
-I${QTDIR}/include -L${QTDIR}/lib
แก้ข้อความดังกล่าวให้เป็นตามตัวอย่าง แล้วจัดเก็บแฟ้ม
-I /usr/include/qt3 -L /usr/lib/qt3
ติดตั้งไลบรารี่และแพ็คเกจต่างๆที่จำเป็นต่อการคอมไพล์งานในครั้งนี้ (base on Ubuntu)
sudo apt-get install build-essential libtag1-dev libqt3-mt-dev
คอมไพล์โปรแกรมด้วยคำสั่ง
make
หลังจากคอมไพล์โดยปราศจาก Error จะได้แฟ้ม mp3unicode ให้ทำการคัดลอกแฟ้มดังกล่าวไปยังตำแหน่งที่เหมาะสมกับการเรียกใช้งาน
sudo cp -f mp3unicode /usr/local/bin
ขณะนี้เราจะได้โปรแกรมแปลง ID3Tag เรียบร้อย เรียกใช้งานในแบบไฟล์ต่อไฟล์
mp3unicode --source-encoding cp874 --id3v1-encoding none --id3v2-encoding unicode [file.mp3]
แต่ในความเป็นจริง ไม่เวิร์คแน่นอน หากเรามาแปลงไฟล์ทีละไฟล์มือหงิกพอดี ดังนั้นเพื่อความสะดวกในการใช้งาน จึงต้องการสร้างเชลล์สคริปครอบฟังค์ชั่นดังกล่าว โดยให้มีวิธีการทำงานโดยการแปลงไฟล์ภายในโฟลเดอร์ทั้งหมด และยังล้วงเข้าไปแปลงแฟ้มลึกลงไปเรื่อยๆ กรณีที่มี "โฟลเดอร์ลูกภายใน" ให้สร้างสคริปตัวนี้ผ่านทาง Terminal Console
sudo touch /usr/local/bin/tag2utf
sudo chmod 755 /usr/local/bin/tag2utf
sudo nano /usr/local/bin/tag2utf
เขียนคำสั่งเชลล์สคริปดังตัวอย่าง
#!/bin/bash
# FROM Master phong_th (ARTICLE AT:)
# AND Master Widdaya (ADVANCED MODIFIED:)

SKEL="*mp3 *MP3 *Mp3"

processfile() {
local i
for i in $SKEL; do
if [ -f "$i" ]; then
chmod +w "$i"
echo "Encoding: $i"
mp3unicode --source-encoding cp874 --id3v1-encoding none --id3v2-encoding unicode "$i"

fi
done
for i in *; do
if [ -d "$i" ]; then
echo "enter directory $i"
pushd "$i"
processfile
echo "exit directory $i"
popd
fi
done
}
processfile
จัดเก็บแฟ้ม วิธีการจัดทำก็จบเรียบร้อย ส่วนวิธีใช้งานจะสั่งผ่านคอมมานไลน์ โดยให้ไปอยู่ ณ ตำแหน่งภายในโฟลเดอร์ที่ต้องการจะแปลงแฟ้ม แล้วใช้คำสั่ง tag2utf จากนั้นโปรแกรมจะแสดงแฟ้มต่างๆที่ได้รับการแปลงเรียบร้อยจนสิ้นสุดการทำงาน ...

ภาพก่อนการแปลงค่า ID3Tag
หลังจากใช้ tag2utf จะแสดงค่าได้ถูกต้อง
*** บล็อกไตเติ้ลนี้ขอยกเครดิตให้ อ.phong_th และ อ.วิทยา ผู้เชี่ยวชาญประจำบอร์ด www.thailinuxcafe.com

19 Comments:

    • At 7/2/07 08:18, Blogger wd said…

      คุณสมเจตน์ครับ เปลี่ยนบรรทัด
      SKEL="*mp3" เป็น
      SKEL="*mp3 *MP3 *Mp3"
      ก็ได้แล้วครับ

      สำหรับการแสดงซอร์สโค๊ดใน html
      ควรใส่ไว้ในแท็ก <pre>...</pre> น่ะครับ จะแสดงได้สวยงามกว่า

       
    • At 7/2/07 11:19, Blogger Mr.Somjate said…

      ขอบคุณครับอาจารย์ แก้ค่า SKEL ใหม่แล้วครับ

      ส่วนแท็ก pre มันไม่ผลกับบล็อกผมเลยครับ เดี๋ยวนี้เขียนบล็อกง่ายขึ้นเพราะมีโหมด Compose ทำให้เขียนข้อความแบบ WYSWYG การแสดงซอร์สโค๊ดปกติจะเลือกฟังค์ชั่นแท็ก blockquote แต่มันก็แสดงเท่าที่เห็นน่ะครับ ผมก็ไม่มีความรู้เรื่อง HTML แต่เดาว่ามาจาก Template ที่ผมเลือกนำมาใช้กระมังครับ เพราะผมคัดลอกบล็อกทั้งดุ้นไปใส่บนเว็บ BioLawCom กลับปรากฏแสดงผลได้สวยกว่าซะอีก ...

      http://www.biolawcom.de/?/blog/508

       
    • At 7/2/07 13:07, Blogger copin said…

      แต่ unicode อ่านในวินแอมหรือโปรแกรมอื่นบนวินโดว์ไม่ได้ใช่ไหมครับ พอดีผมทำตามที่ "แก้ปัญหาภาษาไทยของ ID3 Tag ภาคที่1" แล้วมันอ่านบนวินโดว์ไม่ได้อ่ะครับ

       
    • At 7/2/07 13:57, Blogger Mr.Somjate said…

      ก็บนวินโดว์ mp เข้ารหัสด้วย cp874 ส่วน mediaplayer บนลินุกส์มันกลับใช้ unicode มันก็เลยเกิดการหาวิธีการแปลงรหัส Tag ไงครับ ผมคิดเล่นๆหากจะนำไปใช้กับวินโดว์ก็แปลงรหัสสลับเอา ยกตัวอย่าง

      เคยแปลงเป็นด้วย unicode
      mp3unicode --source-encoding cp874 --id3v1-encoding none --id3v2-encoding unicode [file mp3]

      แปลงกลับเป็นเหมือนเดิม
      mp3unicode --source-encoding unicode --id3v1-encoding none --id3v2-encoding cp874 [file mp3]

      ปล. ID3Tag กับ File Name ไม่ใช่ตัวเดียวกันนะครับ หากชื่อไฟล์เป็น Unicode หากนำไปใช้บนวินโดว์ก็ต้องแปลงชื่อด้วยเหมือนกันนิ ...

       
    • At 7/2/07 14:45, Blogger DrRider said…

      ง่า วินโดวส์ XP นี่ใช้ชื่อไฟล์เข้ารหัส unicode เหมือนกันครับ เดี๋ยวนี้เค้า unicode กันเป็นส่วนใหญ่น่ะครับ

      ส่วนถ้าเปลี่ยน tag เป็น unicode แล้วก็เปลี่ยนโปรแกรมเล่นเพลงจาก Winamp เป็น iTunes แทนสิครับ :D

      ปล. คุณสมเจตน์ติดตั้ง libthai จาก source หรือว่าใช้ apt-get ครับ ถ้าติดตั้งจาก apt อย่าลืมติดตั้ง libthai-dev ตัวใหม่ด้วยครับ:)

       
    • At 7/2/07 17:17, Blogger Mr.Somjate said…

      ติดตั้ง libthai-dev อาการที่เคยปรึกษาหายไปแล้วจริงๆครับ ...

      เห็นว่า -dev ก็เลยคิดว่าเป็นไลบรารี่ช่วยในการคอมไพล์ ไม่คิดว่า Konqueror จะมีผลกระทบด้วยนิ ...

      ขอบคุณมากๆครับ ทนใช้อยู่นานเลย (ใจคิดโทษคุณเทพไปซะอีก) ให้รางวัลอาจารย์หมอหน่อย จุ๊บๆ

       
    • At 8/2/07 22:39, Blogger Mr.Somjate said…

      wd said:
      >สำหรับการแสดงซอร์สโค๊ดใน html
      >ควรใส่ไว้ในแท็ก pre น่ะครับ จะแสดงได้>สวยงามกว่า


      แท็ก pre เข้าใจแล้วครับ ฮี่ๆ ตีไพ่โง่อีกและ ...

       
    • At 23/2/07 13:40, Blogger Wiatte said…

      ขอถามแบบโง่ๆหน่อยนะครับว่า ตอนคอมไพล์โปรแกรมด้วยคำสั่งmakeเนี่ยทำยังไงหรือครับ

       
    • At 24/2/07 14:33, Blogger Mr.Somjate said…

      หลังจากดาวน์โหลดไฟล์ mp3unicode มาแล้วแตกแฟ้มจะเกิดโฟลเดอร์ mp3unicode-1.0.1 ก็ทำการแก้ไขค่า หรือติดตั้งแพ็คเก็จสำคัญบางอย่างก่อนตามตัวอย่าง

      การใช้คำสั่ง make จะทำในโหมด Textmode ซึ่งอาจจะใช้โปรแกรม Terminal Console จำลองโหมดงานให้ก็ได้ครับ จากตัวอย่างเราต้องอยู่ในโฟลเดอร์ mp3unicode-1.0.1 นะครับ แล้วพิมพ์คำสั่ง make และเคาะ Enter ก็จะคอมไพล์โปรแกรมตามค่าสภาวะแวดล้อมภายในโฟลเดอร์ที่เราจัดทำอยู่ ...

      เอ... จะเข้าใจมั้ยเนี่ย ^^'

       
    • At 22/3/07 11:20, Blogger ชิราวุธ สุขสวัสดิ์ said…

      ท่านชายครับ มันขึ้นว่าอย่งนี้อะครับ
      /usr/local/bin/tag2utf: line 14: --id3v2-encoding: command not found

      ทำไงดีอะครับ openSUSE 10.2 ครับ

       
    • At 11/5/07 11:37, Anonymous ไม่ระบุชื่อ said…

      ผมติดตั้งไลบรารีหมดเรียบร้อยแล้ว ถึงตอน make มันขึ้นแบบนี้อ่ะครับ

      root@piglet-laptop:~/Desktop/mp3unicode-1.0.1# export QTDIR="/usr"
      root@piglet-laptop:~/Desktop/mp3unicode-1.0.1# make
      make: *** No rule to make target `cmdparser/*', needed by `mp3unicode'. Stop.
      root@piglet-laptop:~/Desktop/mp3unicode-1.0.1#

      ต้องทำยังไงต่ออ่ะครับ

       
    • At 12/5/07 09:37, Blogger Mr.Somjate said…

      ได้ทำการปรับปรุงบล็อกไตเติ้ลนี้ใหม่ เนื่องจากตัวอย่างการจัดทำก่อนหน้าอาจจะดูสับสนและไม่ถูกต้อง ...

       
    • At 18/5/07 02:29, Anonymous ไม่ระบุชื่อ said…

      ผมดูจาก shell script คิดว่าน่าจะแปลง code หรือไม่ก็วนลูป
      ซ้ำแบบไม่หยุดนะครับ ผมคิดว่าน่าจะใช้ find grep เอา เฉพาะ mp3 -i น่าจะได้ครับ

       
    • At 18/5/07 06:52, Anonymous ไม่ระบุชื่อ said…

      พอดีนอนไม่หลับครับ เลยลองเขียนดูไม่รู้ถูกหรือเปล่า ผมลองแก้จากเดิม ตัวเดิมผมลองดูแล้ว สคลิปจะรันไม่หยุด และจะทำไฟล์เดิมซ้ำ ทำให้ encoding เปลี่ยนกลับไม่ได้ ผลสุดท้ายผมแก้แบบถึกๆ คือ ใช้ EasyTag ลบ ID Tag หมดทุกไฟล์ในสับด้วย ให้อ่านชื่อไฟล์มาแทน แบบตัดปัญหาเอาไปเปิดในเอ็มวินด้วย แต่มีผลทำให้บางโปรแกรมลดความสามารถในการหาโดยใช้ข้อมูล ID Tag
      ผมไม่แน่ใจว่าเป็นที่เครื่องผมหรือเปล่า

      #!/bin/bash

      EXT="mp3"

      if [ $# -eq 0 ]; then
      echo "Usage is: $(basename $0) DIRECTORY"
      exit 1
      fi

      find "$1" -iname "*.$EXT" | while read l
      do
      if [ -f "$l" ]; then
      chmod +w "$l"
      echo "Encoding: $l"
      mp3unicode --source-encoding cp874 --id3v1-encoding none --id3v2-encoding unicode "$l"
      fi
      done


      #Ubuntu ทำให้ผมนึกถึงเพลง We Are The World

       
    • At 29/5/07 14:28, Blogger Ae said…

      ผมว่า นอกจากจะอธิบายวิธีการทำแล้ว ยังอยากจะทำในรูปแบบที่สำเร็จรูปพร้อมใช้จะดีมากขึ้นเลยครับ เพราะบางคนเป็นแค่ end user compile โปรแกรมไม่เป็นครับ

       
    • At 9/10/07 10:53, Anonymous ไม่ระบุชื่อ said…

      โดยส่วนตัวแล้ว ผมอยากให้มันเป็น Unicode เช่น พวก UTF-8 มากกว่าน่ะครับ เพราะผมมองว่ามันเป็นมารตราฐานดีกว่า ปกติผมทำงานพวกเขียนโปรแกรม ยิ่งพวกติดต่อฐานข้อมูลอะไรนี่มีปัญหามากกับ ภาษาไทย ไม่ลงรอยสักที แต่พอใช้เรื่องการ encode ที่เป็น Unicode ทุกอย่าง OK ครับ ไม่จำเป็นต้องเปลี่ยนอะไร สามารถใช้งานได้กับทุกภาษา

       
    • At 8/5/09 09:01, Blogger ByMyself said…

      เข้ามาเยี่ยมชม...

       
    • At 20/1/10 13:37, Blogger mrpipo said…

      ผมลองทำตามวิธีของคุณสมเจตน์ บน ubuntu 9.10 แต่ใช้ไฟล์จาก http://mp3unicode.sourceforge.net/ ซึ่งเป็นเวอร์ชั่น 1.2 ปรับวิธีการนิดหน่อย แต่ก็ใช้งานได้ดีครับ

       
    • At 11/2/11 11:40, Blogger mek said…

      ขอบคุณมากครับ แก้ปัญหาได้สำเร็จซักที :) ของเอาวิธีนี้ไปเขียนลงบล้อกตัวเองด้วยนะครับ

      ตอนผมทำกับทุกไฟล์ ผมใช้
      for i in `find . -name *.mp3` ; do .... $i ; ประมาณนี้หน่ะครับ ง่ายดีเหมือนกัน

       
    • แสดงความคิดเห็น